在通过电子邮件发送之前,是否需要清理用户输入的数据

时间:2013-06-14 18:54:47

标签: php security email

我有一个表单,我接受来自用户的姓名,电子邮件和消息。我对名称,电子邮件和消息进行验证,然后使用mail()函数发送它。

如果我在数据库中输入$name$email$message,我会为SQL注入转义此数据;或者,如果我在网页上回应它,我会使用htmlspecialchars()

我在电子邮件中发送此数据时该怎么办?我知道我不必担心SQL注入,但是XSS呢?我也应该对这三个变量使用htmlspecialchars()吗?

我发送这样的邮件:

mail('admin@mywebsite.com', 'Contact From: '. $name, "$message", 'From: '. $email);

我已阅读有关电子邮件注入的内容,但我无法理解。

请让我知道这件事。

3 个答案:

答案 0 :(得分:8)

转义完全取决于数据嵌入的上下文。

您是否正在发送HTML邮件?然后你有HTML上下文,必须使用htmlspecialchars()

如果您要发送纯文本邮件,则无法转发纯文本。

唯一的威胁是你的邮件客户端有一些错误,它将纯文本解释为可执行文件,然后当你得到一些奇怪的名字和邮件地址时就会起作用。

但这只适用于邮件的内容,而不是实际的标题。

您正在使用自定义邮件标头From。不要使用它。 From用于垃圾邮件过滤器。如果我要输入我的邮件地址,并且您使用From: my@mail发送此邮件,则表示您正在冒充我自己的电子邮件服务器。垃圾邮件曾经用它来隐藏真实的来源,并将投诉和错误反馈重定向到该邮件地址背后的不快乐的人。因此,今天有一些机制可以防止这种滥用。所以,不要假装我发送这封邮件 - 你这样做。

如果您希望能够点击回复按钮回复我,请使用Reply-to标题,但始终使用From: dont-answer@YOURWEBSITE.example

此外,这些自定义标头是坏事的入口点。确保您只添加邮件地址。确保您不添加任何换行符。这些会使邮件服务器认为有一个新的标题出现,这可能会导致邮件头注入。

答案 1 :(得分:3)

您需要验证电子邮件地址,以确保它是单一的,而不是多个地址来阻止电子邮件垃圾邮件

http://www.php.net/manual/en/filter.filters.validate.php

$email = "email@me.com";

 if(!filter_var($email, FILTER_VALIDATE_EMAIL))
   {
   echo "email not valid"; //  do not send
   }
 else
   {
   echo "email valid"; // send
   }

答案 2 :(得分:0)

问题很简单。如果某个用户可以向其他人发送电子邮件,则可以使用HTML或JavaScript,这些HTML或JavaScript在大多数电子邮件客户端和每个Webmail界面中都会被解释为重写内容。他可以插入一个iFrame加载另一个站点或注入一个PopUp脚本。

最重要的是对浏览器进行清理,以便为浏览器清理它。