在PHP的mail()函数中是否存在注入风险?

时间:2010-01-02 21:21:34

标签: php email code-injection

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

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

其中$name$comment是用户输入的值,这些值尚未真正以任何方式进行过清理。用户是否有可能在此处做任何恶意行为? mail()文档没有说明这一点,但将用户输入的值直接粘贴到字符串中会感觉不对。有没有真正的风险,还是我只是偏执狂?

3 个答案:

答案 0 :(得分:5)

只要所有用户资料都保存在邮件正文中,就没有注射风险。

但是,只要用户可以影响邮件标题,他们就可以注入额外的标题,并使用它来垃圾邮件任意电子邮件地址或包含完全不同的邮件 - 包括附件。

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

答案 1 :(得分:3)

请注意名称中的换行符。两个结果(呃赦免我的英文,一个接一个的两个换行符)换行符意味着SMTP中的“标题结束”。

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

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

,该怎么办?
 someonesName
 CC: spamsubject@domain.com; anotherspamsubject@domain.com

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

EDIT2:没有注意到“姓名”和“评论”都在邮件的正文部分。然后我对垃圾邮件发送者的看法无效。

答案 2 :(得分:2)

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

当然,如果对邮件大小有任何限制,过长的评论可能会溢出。那可能不会伤到你。

PHP的$XXX语法扩展了字符串,但是没有对XXX进行任何进一步的评估吗?如果$XXX像某种eval()那样工作,那么你就会进入一个远程执行代码的世界,但我不认为是这种情况。

如果这是内向的SMTP,那么一行上的.后面跟一个空白行就会发出邮件结束的信号,理论上攻击者可以跟着这一行,连续行中有更多文本来劫持你的邮件邮件将一些其他邮件邮寄给其他人。如果PHP首先无法识别并转义这样的字符串。这是我要研究的内容。