PHP mail() 标头注入预防

信息安全 应用安全 php 源代码 电子邮件 注射
2021-08-19 12:32:37

这个网站很好地解释了这个问题。本质上,几乎所有给出的 php mail() 示例都容易受到标头注入攻击。引用的站点提供了一个正则表达式卫生解决方案,但我对此并不满意。是否有内置的头部清洁功能?需要做什么才能真正防止这种攻击?

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 字符,攻击将不起作用。