要在 mail() 中使用的转义字符串

2022-08-30 18:37:15

当然,在使用MySQL时,您使用并检查接收到的输入类型是否是您期望的类型(字符串,数字等),您可以非常确定您可以将其用作输入以非常安全地使用...右?mysqli_real_escape_string()mysqli_query()

好吧,问题是:

  • 转义将要用于的字符串的最佳方法是什么?mail()
  • 如果电子邮件收件人是在文本字段中输入的电子邮件地址,我应该注意哪些事项以避免注入或漏洞利用?

我有一个很好的想法来做到这一点,但我正在深入研究这个主题的最佳实践,以了解我是否错过了什么,或者是否有更好的方法。


编辑:这个问题的想法不是要有答案,而是要制作一个全面的协作列表,列出使用PHP处理电子邮件时要注意的所有事项。


答案 1

电子邮件注入背后的想法是攻击者在电子邮件标头中注入行源(LF),因此他根据需要添加任意数量的标头。剥离这些换行符将保护您免受此攻击。有关详细信息,请查看 http://www.phpsecure.info/v2/article/MailHeadersInject.en.php

最佳做法是依靠编写良好、经常更新和广泛使用的代码。为此,我建议使用PEAR_MAIL OR Zend_Mail

如果您不想加载这些模块,或者您需要保持非常简单。您可以从这些模块中提取筛选功能。虽然我建议使用它们并经常更新库,以便将来出现新的攻击,您只需要更新库(Pear或Zend)即可。

这是清理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);
    }
}

Zend_Mail对电子邮件,姓名和其他字段使用不同的过滤器:

function _filterEmail($email)
{
    $rule = array("\r" => '',
                  "\n" => '',
                  "\t" => '',
                  '"'  => '',
                  ','  => '',
                  '<'  => '',
                  '>'  => '',
    );

    return strtr($email, $rule);
}

function _filterName($name)
{
    $rule = array("\r" => '',
                  "\n" => '',
                  "\t" => '',
                  '"'  => "'",
                  '<'  => '[',
                  '>'  => ']',
    );

    return trim(strtr($name, $rule));
}

function _filterOther($data)
{
    $rule = array("\r" => '',
                  "\n" => '',
                  "\t" => '',
    );

    return strtr($data, $rule);
}

答案 2

推荐