这个网站很好地解释了这个问题。本质上,几乎所有给出的 php mail() 示例都容易受到标头注入攻击。引用的站点提供了一个正则表达式卫生解决方案,但我对此并不满意。是否有内置的头部清洁功能?需要做什么才能真正防止这种攻击?
PHP mail() 标头注入预防
信息安全
应用安全
php
源代码
电子邮件
注射
2021-08-19 12:32:37
3个回答
事实上,PHP 包含一个检查所提供地址有效性的函数。
http://php.net/manual/en/function.filter-var.php
http://www.php.net/manual/en/filter.filters.validate.php
例如: filter_var($_POST['from'], FILTER_VALIDATE_EMAIL) ?send() : die("你杀了我。D:");
这就是pear在他们的 Mail 包中的做法:
function _sanitizeHeaders(&$headers)
{
foreach ($headers as $key => $value) {
$headers[$key] =
preg_replace('=((<CR>|<LF>|0x0A/%0A|0x0D/%0D|\\n|\\r)\S).*=i',
null, $value);
}
}
显然,要使此方法适用于内置的 mail() 函数,需要做一些工作。mail() 函数不使用标题的关联数组,而是只接受一个字符串。因此,您(mail() 的用户)在构建标头字符串时必须对标头的每一部分进行清理,类似于上面的内容。
我想在评论中听到这是否确实涵盖了所有注射威胁(来自那些对此类问题更有经验的人)。
显然,您永远不能信任来自用户的数据。解决方案不是依赖标头函数中的方便清理,而是永远不要信任来自用户的 DIRTY 数据。
无论何时以及如何,但如果您的数据来自外部,您需要清理它。在这个例子中,一个简单的 / 将转义 /n 字符,攻击将不起作用。