PHPのセキュリティを高めるための個人的メモ(補足)
August 23, 2009 – 10:16 am前回のエントリー「PHPのセキュリティを高めるための個人的メモ」で、RFI(Remote File Inclusion)を避ける最も簡単な方法としてphp.iniで allow_url_fopen を off とすればよいと書いた。この場合、これまで紹介してきたサンプルコードでも用いているfile_get_contents() が使用できなくなってしまう。これに代わる方法をメモしておいた。
file_get_contents()が使えなくなる理由: php関数file_get_contents()においては、リモートURLをオープンするためにファイルマニピュレーション機能を用いている。このファイルマニピュレーション機能を有効にするためには、php.iniのパラメータallow_url_fopenをOnにしなければならない。
ファイルマニピュレーションを可能にするということは、私なりの言い方をすると、システム上のファイルのRead/Writeを許すということだ。便利は便利であるが、ひとつ間違えると、大変な事態を惹き起こすことになる。公開サーバー上では、こうした機能の使用は控えるべきというのが当然だ。
これまで、うかつにも、我がサーバー上で、file_get_contents()を使ってきた。この関数の使用については、「アマゾンの書籍データベースにphpでアクセスしてみた」でphpスクリプトの作成例を示すところに記述している。ここで、file_get_contents()の使用にあたっては、allow_url_fopen=on とする必要があることに触れている。
file_get_contents()の代わりにcURLを使う: file_get_contens()を用いないで、外部のURLの中身を読み取る方法のひとつに、phpのcURL関数を用いる方法がある。「アマゾンの書籍データベースにphpでアクセスしてみた」のphpスクリプト作成例で用いられているfile_get_contents()の部分をcURLにより書き換える方法を以下に示す:
file_get_contents()を用い場合:
$request=”http://ecs.amazonaws.jp/onca/xml? ---(省略)--- “; $response = file_get_contents($request); // 関数file_get_contentsはURLストリング(変数:$request)を与えることにより // URL先の中身が文字列として返される。この場合、上記したブラウザ上に現れ // たXMLデータ(文字列)が返り値となる。 $parsed_xml = simplexml_load_string($response); // 関数simplexml_load_stringにより、XML文字列はパースされ、これ以降、 // 書籍データは、$pased_xml->Items->Item-> ・・・・ という形式でアクセス // することができる。
これを、cURLを用いて書き換えると:
$request=”http://ecs.amazonaws.jp/onca/xml? ---(省略)--- “; $session = curl_init($request); curl_setopt($session, CURLOPT_HEADER, false); curl_setopt($session, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($session); curl_close($session); $parsed_xml = simplexml_load_string($response);
5 Trackback(s)