【发布时间】:2012-09-08 01:11:08
【问题描述】:
我听说 PHP 表单被滥用来从表单应该发送给的人发送电子邮件。这是一个实际问题吗?如果是,如何解决?是不是类似于防止SQL注入?
【问题讨论】:
标签: php security code-injection
我听说 PHP 表单被滥用来从表单应该发送给的人发送电子邮件。这是一个实际问题吗?如果是,如何解决?是不是类似于防止SQL注入?
【问题讨论】:
标签: php security code-injection
您说的是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 标头,您甚至可以用他自己的方式完全替换您的消息。你只能想象这会导致什么后果!
解决方案很简单:不要信任您从用户那里收到的任何内容,并过滤/验证收到的数据。
【讨论】:
如果输入没有被正确过滤,任何表单都容易受到攻击。无论是电子邮件表单、注册表单,还是由 PHP 支持都没有关系。
对于电子邮件表单,请考虑使用 PHP 的 filter functions 正确清理电子邮件。
一个好的经验法则是记住 FIFO:过滤输入,转义输出。
Superglobals 几乎应该被认为是脏的并且需要过滤(输入)。输出转义取决于上下文:向某人发送电子邮件、插入数据库、以 HTML 呈现——所有这些都需要不同的输出过滤技术。
【讨论】:
FIFO: filter input, escape output.不应该是FIEO吗