在邮件正文报价/转义变量(Quoting/Escaping variables in mail bo

2019-08-31 09:20发布

我感觉有点尴尬,因为我生成邮件体用PHP没有逃脱的变量。 在HTML中,我使用的htmlspecialchars()或类似的功能,对命令行escapeshellarg(),但对于邮件? 例如是这样的:

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

还有什么比一个可能的攻击者做类似上面的脚本,我怎么能防止这样的攻击? 或者是PHP邮件()保存,为什么?

更新

请参考例子:

  • 只有身体受到影响(无头!)
  • 内容类型为text / plain
  • 一些证据的答案将是很好
  • MTA是sendmail的后缀带有 “/ usr / sbin目录/ sendmail的-t -i”

Answer 1:

基本的电子邮件邮件正文是纯文本。 如果你想要一个不同的类型,如HTML或到多条消息,您需要使用MIME扩展,并相应指定类型使用内容类型 (例如, text/html的HTML或multipart/…一个多部分消息)。

因此,从安全的角度来看,有没有办法注入任何有害物品(至少不按规范)。 即使非ASCII字符应正确,尽管使用的字符编码的缺乏申报办理。

然而,仍有可能在其中可以这种方式被利用电子邮件客户端的一些缺陷。 但我对此表示怀疑。



Answer 2:

它不是固定以防止XSS阿塔克因为如果你的电子邮件包含HTML有人可以注射到邮件。

良好的行为是检查,哪些是你希望有有效数据。 如果我是你,我会逃离这个字符串。 它的成本almoust没事,你不必担心没有使用它的后果。



Answer 3:

好问题。 我不相信你需要躲避正文文本,但我知道这是可能的头添加到邮件(如BCC数千地址),如果您允许从地址用户输入。 所以,如果你把变量在,绝对检查换行符( \n\r ),以确保没有另外的头添加。



Answer 4:

认为电子邮件这样的身体:“使命绝密目的地未知。” 我们可能不知道什么样的客户端将读取的消息,但是我们可以猜测,我们不希望活的,用户提供的,转义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"));
?>


文章来源: Quoting/Escaping variables in mail body