at posts/single.html

PHP について (2) - セキュリティについての考え

基本的に言語は道具なんだから、長所と短所を理解して適材適所で使えばいいと思ってる。 だから、好む好まないに関わらず、道具はそこにあるんだからと書いた。 でも、ここだけは指摘しておきたい。

cloned.log - PHPは一発屋としては最高で、リクエストされたファイル名とファイル内容を保存する例が示されている。

<?php
file_put_contents($_REQUEST['name'], $_REQUEST['value']);

明らかにこれは良くない。例えば以下のように書けば分かると思う。

<?php
file_put_contents("/var/www/index.html", "This page was cracked");

例を書かれた方も以下のように書いているので、危険性は認識しているんだと思う。

「リクエストの値をチェックしろよ」とかはもっともなのだけれども、例を単純にするためにというのと、多分どんな言語でも値をチェックするならもう少し行数いるだろうと思うので。

なぜ、上記のような無謀な例を出したのかというと、それくらいにPHP自体によって提供されたグローバルな関数が山ほどあって、その関数に頼ると「一発屋なCGIはあっという間に完成する」ということの実例で示したかったからだ。本当に関数は山ほどある。

それでもこう書いてしまうのは、 PHP が提供している関数に原因があるんじゃないかな。 そしてこれは、 PHP の欠点だと思ってる。

file_put_contents は確かに便利な関数だ。 でも便利さだけが注目されて、その代償(セキュリティの問題)が意識されないのは問題。 file_put_contents という便利な関数を用意するのであれば、引数は filename と dirname で分けて、 dirname 以外の場所に書き込めないように設計するべき。 PHP: file_put_contents - Manualを読んでも、「filename にフルパスを指定できるので入力値には気をつけるように」という記述が見当たらない。

入力値に気をつけなければいけないのは他の言語でも同じ。 だけど、一発屋として便利な関数を用意するのであれば、こういった面に気を付けてほしいな…と(これはid:clonedさんへの指摘じゃない)。 特に Web に特化した言語なんだからさ。

『「便利な関数がいっぱい!」(これは悪くない) → よく考えないで使っちゃう → セキュリティの問題』っていうループが拡大再生産されるってのは不幸だよ。

関連する日記