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);