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

2022-08-30 22:23:58

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

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

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

我发送邮件是这样的:

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

我读过关于电子邮件注入的文章,但我无法理解。

请让我知道这一点。


答案 1

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

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

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

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

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

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

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

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


答案 2

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

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
   }

推荐