3

我想知道以下代码是否存在任何潜在的安全风险。每当用户提交评论时,我都会在我的博客上使用它,它会向我发送一条短信:

mail('cellnumber@messaging.sprintpcs.com', '',
     "Comment posted by $name: $comment",
     "From: comments@example.com");

用户输入的值在哪里$name以及$comment是没有以任何方式真正清理过的值。用户是否有可能在这里做任何恶意的事情?mail()文档没有说明这一点,但是将用户输入的值直接粘贴到字符串中感觉是错误的。有任何真正的风险还是我只是偏执?

4

3 回答 3

5

只要我将所有用户资料保存在邮件正文中,就没有注入的风险。

但是,一旦用户可以影响邮件标头,他们就可以注入额外的标头并执行诸如使用它向任意电子邮件地址发送垃圾邮件或包含完全不同的邮件(包括附件)之类的事情。

如果您检查影响标题的部分中的换行符,如果出现则拒绝,那么这就足够了。SMTP 标准使用 CRLF 来分隔标题行,但是 AFAIK,许多基于 Unix 的服务器希望您只使用 LF(因为这是这些系统上的本机行分隔符)。然后,邮件中继器在将其进一步发送到上游时对其进行转换。

于 2010-01-02T21:36:23.977 回答
3

请注意名称中的换行符。两个后续(呃..原谅我的英语,两个换行符一个接一个)换行符在 SMTP 中表示“标头结束”。

此外,序列 `\n.\n'(只有句点的空行)表示“消息结束”。

编辑:是的,存在垃圾邮件发送者的风险!如果 $name 实际上包含:

 someonesName
 CC: spamsubject@domain.com; anotherspamsubject@domain.com

(即注入更多标题的东西)?

EDIT2:没有注意到“名称”和“评论”都在消息的正文部分。那么我关于垃圾邮件发送者的想法是无效的。

于 2010-01-02T21:40:46.000 回答
2

PHP 充满了不安全的东西,但我不确定这里有很多风险。

当然,太长的评论可能会超出您对消息大小的任何限制。那可能不会伤害你。

PHP 的$XXX语法扩展了字符串,但没有对它做任何进一步的评估XXX吗?如果$XXX以某种方式工作eval(),您将进入远程代码执行的世界,但我认为情况并非如此。

如果这是在内部执行 SMTP,那么.一行中的一行后跟一个空行将表示邮件的结束,理论上攻击者可以在后续行中使用更多文本来劫持您的邮件程序,将其他消息邮寄给某人别的。那是如果 PHP 首先无法识别和转义这样的字符串。这是我会调查的事情。

于 2010-01-02T21:38:12.753 回答