13

我感觉有点尴尬,因为我正在使用 PHP 生成邮件正文而不转义变量。在 HTML 中,我使用 htmlspecialchars() 或类似函数,用于命令行 escapeshellarg(),但用于邮件?例如这样的:

<?php
$usercontent = $_GET['usercontent'];
mail("dummy@nowhere.tld", "My Subject", "My body with $usercontent included");
?>

可能的攻击者可以使用上面的脚本做什么,我如何防止这种攻击?或者是 PHP mail() 保存,为什么?

更新

请参考示例:

  • 只有身体受到影响(没有标题!)
  • 内容类型是文本/纯文本
  • 答案的一些证据会很好
  • MTA 是带有“/usr/sbin/sendmail -t -i”的后缀 sendmail
4

4 回答 4

6
于 2013-04-17T16:27:22.167 回答
0

它不能防止 XSS 攻击,因为如果您的邮件包含 HTML,有人可以将其注入邮件中。

良好的行为是检查并验证您期望拥有的数据。如果我是你,我会转义这个字符串。它几乎没有成本,您不必担心不使用它的后果。

于 2013-04-17T12:10:18.863 回答
0

好问题。我不相信您需要转义正文,但我知道如果您允许用户输入发件人地址,则可以将标题添加到邮件(如密件抄送到数千个地址)。因此,如果您将变量放入其中,请务必检查换行符(\n\r)以确保没有添加额外的标题。

于 2013-04-17T12:11:43.510 回答
0

以这种方式思考电子邮件的正文:“任务最高机密目的地未知。” 我们可能不知道什么样的客户端会阅读该消息,但我们可以猜测我们不希望在其中显示实时的、用户提供的、未转义的 HTML。由于许多客户端以 HTML 格式阅读邮件,因此最好的办法是htmlentities()使用用户提供的电子邮件正文。

我的逃生类中的一种方法。

<?php
class escaper
{
    public function superHtmlEntities($string)
    {
        return htmlentities($string, ENT_QUOTES | ENT_HTML5, 'UTF-8', true);
    }
}
?>

=========================================

至少,在您进行研究时,请考虑类似的事情以及更多。

<?php
$esc = new Escaper();

$usercontent = $_GET['usercontent'];
mail("dummy@nowhere.tld", "My Subject", $esc->superHtmlEntities("My body with $usercontent included"));
?>
于 2015-04-30T17:39:11.490 回答