退出邮件中使用的string()

当然,在使用mysql的时候使用mysqli_real_escape_string()并检查接收的inputtypes是否是你期望的types(string,数字等等),你可以确信你可以很安全地使用mysqli_query()的input。 .. 对?

那么,问题是:

  • 什么是最好的方法来逃避一个string,它将被用在一个mail()
  • 如果电子邮件收件人是以文本formsinput的电子邮件地址,那么我应该小心避免注入或利用哪些内容?

我有一个相当好的主意,如何做到这一点,但我正在挖掘这个问题的最佳做法,知道如果我失去了一些东西或有更好的办法。


编辑:这个问题的想法是不是有答案,但做一个全面的协作清单,所有的事情要照顾的时候用PHP做电子邮件。 感谢所有人的帮助。

电子邮件注入背后的思想是,攻击者在电子邮件标题中注入换行符(LF),因此他添加了尽可能多的标题。 剥离这些换行符可以保护您免受这种攻击。 有关详细信息,请查看http://www.phpsecure.info/v2/article/MailHeadersInject.en.php

最好的做法是依靠一个写得很好,经常更新和广泛使用的代码。 为此,我会build议使用PEAR_MAIL或Zend_Mail

如果你不想加载这些模块,或者你需要保持简单。 您可以从这些模块中提取过滤function。 虽然我build议使用它们,并经常更新库,所以如果将来出现新的攻击,只需更新库(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针对电子邮件,名称和其他字段使用不同的filter:

 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); }