PHP的FILTER_VALIDATE_EMAIL提供足够的安全性吗?

13

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

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

2个回答

9
一个有效的电子邮件地址可以被一些精心制作的字符串轻松地用来攻击您。要做到安全,需要转换思路,从“过滤”思维模式转为“转义”思维模式。通用的“使其安全”过滤器根本不存在。因为所有的转义都必须以特定上下文为基础进行处理。
例如,如果电子邮件地址将被输出到纯文本文档中,则无需进行任何操作。如果它被输出到HTML文档中,作为文本节点,则需要为HTML上下文进行转义,因此需要转义HTML特殊字符和实体。如果它被放入HTML文档中,并且它的值将在HTML属性内部,则需要非常小心地进行转义,这取决于是哪个HTML属性。如果它被用于SQL查询,则需要通过数据库特定的转义函数进行转义,即使这样,如果您将其用作参数值(例如,“where someColumn ='$paramVal'”),与用作符号名称(例如表名、列名)时,需要进行不同的转义(例如,“order by $myEscapedColumnName DESC”)。等等。
这全部都关乎使用上下文,而不是字符串内容。这适用于所有东西(不仅仅是电子邮件或其他用户输入),这不仅仅是安全问题,还涉及编程和语法正确性。正确的转义非常复杂,需要花费大量时间学习,并且在编码时需要进行仔细的思考和考虑。许多程序员由于工作量而不愿意这样做,他们是导致公司被黑客攻击的罪魁祸首。
顺便说一下,电子邮件地址规范允许带引号的字符串,因此您可以注入类似于“”@example.com的字符串。可能性是显而易见的。

1
例如,也没有普遍适用的“安全”问候语。在某些社会中礼貌的方式在其他社会中可能是粗鲁的。了解你的上下文! - Xeoncross
1
+1. FILTER_VALIDATE_EMAIL 用于检查电子邮件地址是否有效,正如上面的示例所示,这与任何其他注入问题无关。如果它阻止引号或小于号,那只是巧合,并且不应该是您依赖的内容。 - bobince

3

这应该足够好了,但是当将其输入数据库等地方时,仍然需要进行转义。您永远不知道PHP或Apache中可能存在哪种漏洞,可能会导致攻击发生。


5
与漏洞无关。有效的电子邮件地址并不一定是数据库安全的。如果你只是将电子邮件 john.o'connor@somewhere.com 直接注入到 SQL 查询中,它会给你带来麻烦... - Cylindric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接