我有一个表单,我接受来自用户的姓名,电子邮件和消息。我对名称,电子邮件和消息进行验证,然后使用mail()
函数发送它。
如果我在数据库中输入$name
,$email
和$message
,我会为SQL注入转义此数据;或者,如果我在网页上回应它,我会使用htmlspecialchars()
。
我在电子邮件中发送此数据时该怎么办?我知道我不必担心SQL注入,但是XSS呢?我也应该对这三个变量使用htmlspecialchars()
吗?
我发送这样的邮件:
mail('admin@mywebsite.com', 'Contact From: '. $name, "$message", 'From: '. $email);
我已阅读有关电子邮件注入的内容,但我无法理解。
请让我知道这件事。
答案 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脚本。
最重要的是对浏览器进行清理,以便为浏览器清理它。