16

我有一个表格,我可以在其中接受来自用户的姓名、电子邮件和消息。我对姓名、电子邮件和消息进行验证,然后使用该mail()功能发送。

如果我在数据库中输入$name,$email$message,我会转义这些数据以进行 SQL 注入;或者,如果我在网页上呼应它,我会使用htmlspecialchars().

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

我这样发送邮件:

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

我已经阅读了有关电子邮件注入的信息,但我无法理解。

请让我知道这件事。

4

3 回答 3

10

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

你在发送 HTML 邮件吗?然后你有 HTML 上下文,并且htmlspecialchars()必须使用。

如果您发送纯文本邮件,则纯文本不会转义。

唯一的威胁是您的邮件客户端存在一些错误,该错误将纯文本解释为可执行文件,然后在您收到一些奇怪的名称和邮件地址时采取行动。

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

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

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

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

于 2013-06-14T19:01:02.913 回答
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
   }
于 2013-06-14T19:14:21.137 回答
0

问题很简单。如果某个用户可以向其他人发送电子邮件,他可以使用 HTML 或 JavaScript 来解释大多数电子邮件客户端和每个网络邮件界面来重写内容。他可以插入一个 iFrame 加载另一个站点或注入一个弹出脚本。

以您为浏览器清理输入的方式清理输入是最重要的。

于 2013-06-14T19:00:24.943 回答