| « XMLRPC for PHPにセキュリティーホール | php-rast » |
allow_url_fopen
追記
allow_url_fopenではなくallow_url_includeオプションが追加されています。セキュリティ対策としてはallow_url_fopenと同様、完全ではありませんがPHP5.1.3からはallow_url_includeオプションは追加されます。参考になるURLは以下のURLです。
http://blog.ohgaki.net/index.php/yohgaki/2006/01/27/allow_url_includea_oa_a_ma_sa_sa_reifa_n
---
PHPを使っている方はHTTP/FTP/SSH等のプロトコルでリモートサーバ上のファイルをローカルファイルの様に読み書きできる事をご存知と思います。この機能はphp.ini設定のallow_url_fopenディレクティブで有効/無効を設定できるようになっています。PHP 4.3.4より前のPHPではこの機能のスクリプト中からも無効/有効に設定を変更する事ができました。(INI_ALLの設定項目であった)
驚いたことにPHP 4.3.4からphp.iniからしかこの設定を変更できなくなってしまいました。(INI_SYSTEMの設定項目になった)誰かがセキュリティ強化を目的として変更したのだとは思いますが、セキュリティも強化できず、有用なリモートファイルアクセス機能も使えなくする非常に拙い変更です。
例えば、phpBB(BBSアプリケーション)ではinclude/require文に不適切に処理されたユーザ入力が利用されている為、リモートスクリプトを読み込み実行できてしまう非常に深刻なセキュリティ上の問題がまた最近見つかりました。phpBBはallow_url_fopen機能が無効であっても動作するので
allow_url_fopen = Off
と設定するか必ず読み込まれる設定ファイルで
ini_set('allow_url_fopen', 0);
とすると、phpBBのようなアプリケーションでも比較的安全に運用することができました。
しかし、allow_url_fopenがINI_SYSTEMの設定項目になった為、前者の方法を取ると他のアプリケーションで、場合によっては非常に有用な、allow_url_fopen機能を使えなくなってしまいました。後者の方法は、特定のアプリケーションのみの設定を変更するのに有効ですが、INI_SYSTEM設定項目であるため実際には無効に設定できなくなってしまいました。
セキュリティ上の意味は容易に理解できるであろうと、internals@list.php.net にallow_url_fopenの設定を
デフォルトOFF
INI_ALLへ変更
するように提案して見たところ議論が結構荒れています...
この設定が安全かつ不必要な機能制限が無く、最も良い設定と思うのですが...
# allow_url_fopen_includeのようにinclude/require文用の設定
# を追加するのも良いですが、デフォルトOFF、INI_ALLであるべき
# と思います。