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);
関連ポスト:
- アマゾンの書籍データベースにphpでアクセスしてみた
- PHPのセキュリティを高めるための個人的メモ
- Webページへの公開情報を自動的に抽出・取得する
- 為替レート取得用API(修正版)
- アマゾンAPIを活用した蔵書管理システム(1)
- アマゾンAPIを活用した蔵書管理システム(2)
- WordPressにおけるPHPセッション管理
- php-7.1.0 , apache-2.4.6,mysql-5.7.16のインストール
- CentOS 5.2上でPHP 5.2.6にアップグレード
- PHP5.3.4 およびMySQL5.5.8へのRPMアップデート(CentOS5.5)
5 Trackback(s)