gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-28 23:58:24 27 4
gpt4 key购买 nike

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

那么,问题是:

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

我很清楚如何做到这一点,但我正在深入研究这个主题的最佳实践,以了解我是否遗漏了什么,或者是否有更好的方法。


编辑:这个问题的想法不是要有THE的答案,而是要制作一个综合的协作列表,列出在使用 PHP 发送电子邮件时要注意的所有事情。

最佳答案

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

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

如果您不想加载这些模块,或者您需要让事情变得非常简单。您可以从这些模块中提取过滤功能。尽管我确实建议使用它们并经常更新库,这样如果将来出现新的攻击,您只需更新您的库(Pear 或 Zend)就可以了。

这是清理 Pear Mail 包中的 header 的功能:

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

关于php - 在 mail() 中使用的转义字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8071916/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com