我听说PHP表单被滥用来从表单应发送给的人发送电子邮件。这是一个实际问题,如果是这样,它如何解决?它是否类似于阻止SQL注入?
答案 0 :(得分:2)
您在谈论email injection安全漏洞。例如,如果您将自定义标头传递给mail()
函数,就像下面的代码示例一样,那么您就容易受到攻击:
<?php
$additional_headers = "Reply-To: {$_GET['user_email']}";
mail($to, $subject, $message, $additional_headers);
?>
考虑恶意用户不仅传递他的电子邮件,还传递其他标题:
<?php
//$_GET['user_email'] = "me@example.net";// this is what you expect
// this is what you're getting actually
$_GET['user_email'] = "me@example.net\r\nBcc: someone@example.net, ...";
?>
然后,恶意用户会以您的名义向您服务器上的几乎无限制的用户列表发送他所谓的垃圾邮件隐藏邮件的副本。甚至可以通过添加某些安全的MIME标头以他自己的方式完全替换您的消息。你只能想象这会导致什么后果!
解决方案很简单:不要相信您从用户那里收到的任何信息,并过滤/验证收到的数据。
答案 1 :(得分:0)
如果输入未正确过滤,则任何形式都容易受到攻击。无论是电子邮件表单,注册表单,还是由PHP支持,都无关紧要。
对于电子邮件表单,请考虑使用PHP的filter functions来正确清理电子邮件。
一个好的经验法则是记住FIFO:过滤器输入,转义输出。
Superglobals几乎应该被认为是脏的并且需要过滤(输入)。输出转义取决于上下文:通过电子邮件发送给某人,插入数据库,使用HTML呈现 - 所有这些都需要不同的输出过滤技术。