11

我有一个页面,我想在 GET 参数中接受电子邮件地址。如果我使用FILTER_VALIDATE_EMAIL,我是否仍然容易受到 xss 和 javascript 注入攻击等?

我不是在问它是否是一个好的或足够好的电子邮件地址验证器。我想知道是否仍然可以通过传递的任意字符串注入不良的网络代码——我是否需要进行额外的过滤来防止这种情况发生?

4

2 回答 2

9

是的,一个有效的电子邮件地址可以很容易地用作一些精心设计的字符串的容器,这些字符串可以用来攻击你。

摆脱“过滤”的心态,进入“逃避”的心态。根本不存在通用的“使其安全”过滤器。它不可能存在,因为所有转义都必须以特定于上下文的方式完成。

例如,如果将电子邮件地址输出到纯文本文档,则无需执行任何操作。如果它被输出到一个 html 文档中,作为一个文本节点,那么它需要为一个 html 上下文进行转义,所以转义 html 特殊字符和实体。如果将其放入 html 文档中,并且它的值将在 html 属性中,则需要非常小心地进行转义,这取决于哪个html 属性。如果在 sql 查询中使用它,则需要通过数据库特定的转义函数对其进行转义,即使这样,如果您将其用作参数值(即where someColumn = '$paramVal'),与符号名称(如表名,列名(即order by $myEscapedColumnName DESC)。等等。

这完全是关于使用的上下文,而不是字符串的内容。这适用于所有事情(不仅仅是电子邮件或其他用户输入),这不仅仅是安全问题,而是编程和语法正确性问题。正确的转义很复杂,需要大量时间来学习,并且在编码时需要仔细考虑和考虑。由于付出了努力,许多编码人员都懒得去做,他们才是导致公司被黑的人。

仅供参考,电子邮件地址规范允许引用字符串,因此您可以注入类似"<script>alert('xss')</script>"@example.com. 可能性是显而易见的。

于 2012-05-03T14:31:37.000 回答
2

这应该已经足够好了,但是当您将它输入数据库等时,您自然仍然应该将其转义。您永远不知道 PHP 或 Apache 等中可能存在什么样的错误,这可能会导致攻击发生。

于 2012-05-03T14:25:06.983 回答