我感觉有点尴尬,因为我生成邮件体用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”
基本的电子邮件邮件正文是纯文本。 如果你想要一个不同的类型,如HTML或到多条消息,您需要使用MIME扩展,并相应指定类型使用内容类型 (例如, text/html
的HTML或multipart/…
一个多部分消息)。
因此,从安全的角度来看,有没有办法注入任何有害物品(至少不按规范)。 即使非ASCII字符应正确,尽管使用的字符编码的缺乏申报办理。
然而,仍有可能在其中可以这种方式被利用电子邮件客户端的一些缺陷。 但我对此表示怀疑。
它不是固定以防止XSS阿塔克因为如果你的电子邮件包含HTML有人可以注射到邮件。
良好的行为是检查,哪些是你希望有有效数据。 如果我是你,我会逃离这个字符串。 它的成本almoust没事,你不必担心没有使用它的后果。
好问题。 我不相信你需要躲避正文文本,但我知道这是可能的头添加到邮件(如BCC数千地址),如果您允许从地址用户输入。 所以,如果你把变量在,绝对检查换行符( \n
和\r
),以确保没有另外的头添加。
认为电子邮件这样的身体:“使命绝密目的地未知。” 我们可能不知道什么样的客户端将读取的消息,但是我们可以猜测,我们不希望活的,用户提供的,转义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"));
?>