网络应用程序安全指南/PHP 特定问题
使用 PHP 语言时,需要考虑几个问题。
使用 PHP 时...
- 不要使用简写形式“
<?
”,始终使用完整形式“<?php
” - 使用 nginx 网络服务器时,请确保正确按照官方安装说明进行操作,并注意“陷阱”页面。注意,教程中经常包含有效但配置不安全的示例。
preg_replace
在某些情况下可以充当eval()
。避免将用户输入传递给它。如果必须这样做,请正确过滤和转义它。- 使用Suhosin(如果可能,包括补丁),并使用严格规则配置它
- 启用
suhosin.executor.disable_emodifier
- 如果可能,启用
suhosin.executor.disable_eval
- 如果可能,将
suhosin.mail.protect
设置为 2
- 启用
- 将 PHP 从旧版本更新到 PHP 5.4 时,确保旧版应用程序不依赖于 magic quotes 来实现安全性。
基本原理
PHP 可以支持简化的 PHP 代码开始标记。如果启用了该选项,"<?php
" 和 "<?
" 都可以单独开始一个 PHP 代码块。但是,如果禁用了该选项,"<?
" 将不会被检测到,代码将被传递到浏览器。这会导致代码泄露。使用完整形式可以确保代码正常工作,并且如果服务器不支持简短标记,也不会泄露代码。
使用 nginx 服务器时,很容易犯导致用户可以将图像文件传递到 PHP 解释器中的严重配置错误。有关更多信息,请参阅“陷阱”页面。它还提供了一些有价值的提示,可能会帮助您节省一些用于查找幻象问题的时间,因此如果您使用 nginx,则应该阅读它。
如果在搜索正则表达式中提供了非标准的 "e" 修饰符,preg_replace
会将替换文本评估为 PHP 代码。如果攻击者可以影响正则表达式以添加此修饰符并提供自定义替换文本,则 preg_replace
允许任意代码执行。使用此函数时要格外小心,在可能的情况下使用preg_quote
并使用正确设置的定界符参数进行转义。如果必须接受来自用户的正则表达式代码,请确保它不能包含定界符(还要考虑使用格式错误的 UTF-8、空字节等进行攻击) - 但如果可能,请完全避免使用它。
Suhosin 可以阻止对 Web 应用程序的某些攻击,并禁用不安全的函数。该补丁还保护内部内存结构免受某些内存损坏攻击。(另请参阅功能列表,以了解完整的功能列表,以及官方解释 Suhosin 有用的原因。)Suhosin 提高了您的安全性,但与 Web 应用程序防火墙一样,它不会神奇地使所有应用程序都安全。
禁用 e 修饰符可以阻止攻击者利用上面提到的 preg_replace
中的漏洞,即使应用程序存在漏洞。e 修饰符不应该使用,禁用 e 修饰符后无法工作的应用程序是有问题的。禁止 eval
可能会破坏合法的应用程序。考虑首先在模拟模式下运行 Suhosin,以发现(编码不当的)使用它的应用程序。设置 suhosin.mail.protect
可以阻止使用您的邮件表单发送垃圾邮件的攻击。(同样,请首先使用模拟模式来确定您的应用程序是否与它兼容。)
magic quotes 已在 PHP 5.4 中删除。如果安装了更新,依赖于 magic quotes 来实现安全性的应用程序将变得容易受到攻击。请注意,这并不意味着您不应该更新;相反,您应该修复(即重写或删除)应用程序。magic quotes 不是转义输入的合适方法,在大多数情况下,它不能防御所有攻击向量。依赖于 magic quotes 的应用程序可能很古老,或者在没有考虑到安全性的情况下编写的。简单地添加模拟 magic quotes 的代码是一个糟糕的想法。