电子邮件注入背后的想法是,攻击者在电子邮件标题中注入换行符(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); }}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);}


