Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 此mail()函数是否可以防止标头注入?_Php_Security_Spam Prevention - Fatal编程技术网

Php 此mail()函数是否可以防止标头注入?

Php 此mail()函数是否可以防止标头注入?,php,security,spam-prevention,Php,Security,Spam Prevention,我正在为一个网站建立一个简单的联系方式。它不连接数据库,只发送电子邮件。此代码是否会阻止垃圾邮件发送者使用标头注入?有没有我没有看到的漏洞? //create short variable names $name= filter_var($_POST['Name'],FILTER_SANITIZE_STRING); $email= filter_var($_POST['Email'],FILTER_SANITIZE_STRING, FILTER_VALIDATE_EMAIL); $subject

我正在为一个网站建立一个简单的联系方式。它不连接数据库,只发送电子邮件。此代码是否会阻止垃圾邮件发送者使用标头注入?有没有我没有看到的漏洞?
//create short variable names
$name= filter_var($_POST['Name'],FILTER_SANITIZE_STRING);
$email= filter_var($_POST['Email'],FILTER_SANITIZE_STRING, FILTER_VALIDATE_EMAIL);
$subject= filter_var($_POST['Subject'],FILTER_SANITIZE_STRING);
$message= filter_var($_POST['Message'],FILTER_SANITIZE_STRING);

//set up some static information
$toaddress = 'blah@localhost.com,blahblah@localhost.com';

$mailcontent = "Customer name: ".$name."\n".
            "Customer email: ".$email."\n".
            "Subject: ".$subject."\n\n".
            $message;

$fromaddress = "From:" . $email;

//invoke mail() function to send mail
mail($toaddress, "Website Contact Form",$mailcontent, $fromaddress);
?>

不,那不会消毒任何东西

捏造那个邮递员是很容易的


我可以在post值(您读取的)中添加任何内容来操作邮件程序。

标题注入依赖于能够在标题变量中插入额外的换行符,这使字符串看起来像一个新标题

例如,允许主题值
Testing\nCc:spamrecipient@example.com\n\n某些正文文本
将生成包含以下内容的消息头:

Subject: Testing
Cc: spamrecipient@example.com

Some body text
i、 施虐者不仅增加了额外的接受者,而且还设法提供了自己的正文

但是,在您的情况下,
$toaddress
是恒定的,即使用户提供了
$toaddress
,也应该通过
mail()
函数对其进行正确的清理

您的主题标题同样是常量

$message
变量是安全的,因为根据定义,它是正文文本,只在真正的标题之后发送

这只剩下
$fromaddress
,并且您已经在使用
过滤器\u验证\u电子邮件
,它还应该拒绝任何带有换行符的内容

但是,您应该严格检查该测试的结果,如果结果为
FALSE
,则中止整个测试。如果验证失败,则
mail()
会抱怨给发件人的
地址为空,但没有标头注入机会

据我所知,这段代码实际上是安全的


另外,依,你不应该从用户提供的电子邮件地址发送电子邮件。这将违反SPF等反垃圾邮件机制


您应该使用属于您自己域的常量
From:
值。如果您愿意,您可以在
回复
标题中使用正确的净化值,使后续回复更容易转到所需的地址。

IMHO,您的代码不安全,因为您缺少
\r
\n
字符<如果将
filter\u SANITIZE\u STRING
filter\u FLAG\u STRIP\u LOW
结合使用,则code>filter\u var()
只会杀死这些字符,这也会过滤掉ASCII 32以下的任何字符:

$message= filter_var($_POST['Message'], 
                     FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);
另外,
FILTER\u VALIDATE\u MAIL
将返回一个true或false,您也不会对此进行解释。我建议查看
filter\u var()
的优秀源代码,因为PHP主手册中的信息非常少



更新:正如Alnitak指出的那样,通过代码中的
\n\n
,这实际上并不重要。

为什么?怎么用?如何防止它?@Neal鉴于他使用的是
filter_var
,我很好奇你能看到哪些额外的漏洞。Neal,你能提供一个例子(或者更好的是,几个不同的例子)吗什么样的输入可能会引起危害?什么样的代码会处理它们?@ikh防止注入最关键的一点是确保将放入头中的任何字段都不能插入任何新行。e、 g.如果你能强制
值\n标题:XXX
进入主题,那么你会得到一个额外的假标题。@据我所知,标题中的值是
$email
,它会被
过滤器\u验证\u email
检查,这(我想?)会拒绝带有换行符的字符串。我错了吗?所有其他变量都将进入主体。没有任何裸
FILTER\u SANITIZE\u STRING
变量以标题结尾,因此没有风险。您关于检查
筛选\u验证\u电子邮件的结果的观点与我所说的相同。它甚至不是
\n\n
-它已经在邮件正文中,并且不是标题的一部分。这只是因为OP将文本放在了正文中,看起来像标题(但不是标题)。谢谢大家,所有的答案都很有用。我同意阿尔尼塔克的答案,只要没有人能在上面捅破洞。谢谢你,阿尔尼塔克!