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

问题描述 投票:11回答:2

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

我不是在问它是否是电子邮件地址的有效验证者。我想知道是否仍然可以通过传递给它的任意字符串注入不良的Web代码-我是否需要进行其他过滤以防止这种情况?

php security
2个回答
10
投票

是,可以轻松地使用有效的电子邮件地址作为一些精心设计的字符串的容器,这些字符串可以用来攻击您。

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

例如,如果电子邮件地址将输出到纯文本文档,则无需执行任何操作。如果将其作为文本节点输出到html文档中,则需要针对html上下文对其进行转义,因此请对html特殊字符和实体进行转义。如果将其放入html文档中,并且其值将位于html属性内,则需要非常非常小心地进行转义,这取决于html属性。如果它在sql查询中使用,则需要通过特定于数据库的转义函数对其进行转义,并且即使将其用作参数值(即where someColumn = '$paramVal')(相对于符号),也必须进行不同的转义名称,如表名,列名(即order by $myEscapedColumnName DESC)。等等。 全部是关于使用上下文,而不是字符串的内容。这适用于所有内容(不只是电子邮件或其他用户输入),不仅关系到安全性,还关系到编程和语法正确性。正确的转义非常复杂,并且需要花费大量时间来学习,并且在编码时需要进行仔细的思考和考虑。由于许多工作,许多编码人员都不愿意这样做,而这正是导致公司被黑客入侵的原因。

fyi,电子邮件地址规范允许带引号的字符串,因此您可以插入诸如"<script>alert('xss')</script>"@example.com之类的字符串。可能性是显而易见的。


2
投票
这应该足够好,但是自然地,当您将其输入数据库等时,您仍然应该对其进行转义。您永远不知道PHP或Apache等中可能存在哪种错误,无论如何都可能会发生攻击。] >
© www.soinside.com 2019 - 2024. All rights reserved.