Jua*_*cio 21 php string escaping
当然,在使用MySQL时,你使用mysqli_real_escape_string()并检查收到的输入类型是你期望的那种(字符串,数字等),你可以非常肯定你可以把它作为输入mysqli_query()安全地使用......对吗?
那么问题是:
mail()?我非常清楚如何做到这一点,但我正在深入研究这个主题的最佳实践,以了解我是否遗漏了某些东西,或者是否有更好的方法.
编辑:这个问题的想法是不具备的答案,而是要让所有的事情打理用PHP写电子邮件时的全面合作名单.
Lai*_*eed 12
电子邮件注入背后的想法是攻击者在电子邮件标题中注入换行符(LF),因此他根据需要添加了多个标题.剥离这些换行符可以保护您免受此攻击.有关详细信息,请查看http://www.phpsecure.info/v2/article/MailHeadersInject.en.php
最佳实践是依赖编写良好,经常更新和广泛使用的代码.为此,我建议使用PEAR_MAIL或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);
}
}
Run Code Online (Sandbox Code Playgroud)
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);
}
Run Code Online (Sandbox Code Playgroud)