问题 PHP的FILTER_VALIDATE_EMAIL是否提供足够的安全性?


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

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


4442
2018-05-03 14:23


起源



答案:


是的,有效的电子邮件地址可以用作一些精心设计的字符串的容器。

摆脱“过滤”的心态,进入“逃避”的心态。通用的“安全”过滤器根本不存在。

例如,如果电子邮件地址将输出到纯文本文档,则不需要执行任何操作。如果将其作为文本节点输出到html文档中,则需要对html特殊字符和权限进行转义。如果它被放入一个html文档中,并且它的值将在html属性中,那么需要非常小心地执行转义,这将取决于上下文。如果它在sql查询中使用,则需要通过数据库特定的转义函数进行转义。等等。

它是关于使用的上下文,而不是字符串的内容。这适用于所有事情(不仅仅是电子邮件或其他用户输入),它不仅仅是安全问题,而是编程正确性的问题。

fyi,我记得允许引用字符串的电子邮件地址规范,所以类似于 "<script>alert('xss')</script>"@example.com 是有效的。可能性是显而易见的。


9
2018-05-03 14:31



例如,也没有普遍的“安全”问候。某些社会的礼貌在其他社会中是粗鲁的。了解你的背景! - Xeoncross
+1。 FILTER_VALIDATE_EMAIL用于检查电子邮件地址是否有效,并且如上例所示,这与任何其他注入问题无关。如果它 没有 阻止报价或小于报价,那么它只会是共同发生的,而不是你应该依赖的东西。 - bobince


答案:


是的,有效的电子邮件地址可以用作一些精心设计的字符串的容器。

摆脱“过滤”的心态,进入“逃避”的心态。通用的“安全”过滤器根本不存在。

例如,如果电子邮件地址将输出到纯文本文档,则不需要执行任何操作。如果将其作为文本节点输出到html文档中,则需要对html特殊字符和权限进行转义。如果它被放入一个html文档中,并且它的值将在html属性中,那么需要非常小心地执行转义,这将取决于上下文。如果它在sql查询中使用,则需要通过数据库特定的转义函数进行转义。等等。

它是关于使用的上下文,而不是字符串的内容。这适用于所有事情(不仅仅是电子邮件或其他用户输入),它不仅仅是安全问题,而是编程正确性的问题。

fyi,我记得允许引用字符串的电子邮件地址规范,所以类似于 "<script>alert('xss')</script>"@example.com 是有效的。可能性是显而易见的。


9
2018-05-03 14:31



例如,也没有普遍的“安全”问候。某些社会的礼貌在其他社会中是粗鲁的。了解你的背景! - Xeoncross
+1。 FILTER_VALIDATE_EMAIL用于检查电子邮件地址是否有效,并且如上例所示,这与任何其他注入问题无关。如果它 没有 阻止报价或小于报价,那么它只会是共同发生的,而不是你应该依赖的东西。 - bobince


这应该是足够好的,但当你将它输入数据库等时,你自然应该逃避它。你永远不知道PHP或Apache等中可能存在哪种类型的错误,这可能允许攻击无论如何发生。


2
2018-05-03 14:25



与bug无关。有效的电子邮件地址不是自动数据库安全的。电子邮件 john.o'connor@somewhere.com 如果你只是将它注入SQL查询中会让你感到悲伤... - Cylindric