我们讨论了一些流行PHP脚本平台的漏洞,下面是确保避免这些漏洞的一些技巧:
·在所有用户输入上应用严格的输入验证。
·保守地使用eval()、passthru()、system()和其他函数,不使用用户输入。
·关闭register_globals。
PHP的常见安全选项
下面的配置选项与安全相关,可以在php.ini文件中设置。使用这些设置确保你运行的PHP配置默认情况下的安全。
open_basedir
这个设置限制任何文件访问指向一个特定的目录。之后的所有文件操作被限制在所指定的位置。执行的任何文件操作应该在一个特定的目录集之内,这是很好的建议。这样一来,标准的“../../../../etc/passwd”哪里也去不了。
disable_functions
这个设置可以在PHP中禁用一组函数。禁用函数被看作是纵深防御的一个很好的方式。如果应用不使用具有安全风险的函数如eval()、passthru()、system(),那么应该始终不允许添加这些函数。如果攻击者在PHP代码中寻找到一个安全问题,会让你很头疼。
expose_php
将这个配置关闭将删除HTTP响应中Server首部中显示的PHP标志。如果你关心的是隐藏PHP版本或者PHP在应用中的运行,这个设置将会有所帮助。
display_errors
这个设置很简单,却很重要,允许异常时向用户显示详细的错误信息。在生产环境中这个设置应该始终关闭。
safe_mode
在PHP中开启safe_mode允许非常严格的文件访问权限。为此要检查正在运行的PHP脚本所有者的权限,以及脚本试图进行的任何访问。如果权限不匹配,PHP抛出一个安全异常。Safe_mode主要由ISP使用,这样在多宿主环境中,多个用户可以开发自己的PHP脚本而不会危及服务器的完整性。
allow_url_fopen
这个配置选项将会禁用远程文件的操作能力。这是阻止远程文件包含漏洞的很好的总体设置。下面是一个示例,如果以下代码示例中的$absolute_path变量被设置为http://www.site.com/,设置allow_url_fopen能使这一攻击失效。
include($absolute_path.'inc/adodb/adodb.inc.php');