javascript 执行XSS攻击,尽管在php中使用trim()和stripashes()输入过滤器

xdnvmnnf  于 2023-01-16  发布在  Java
关注(0)|答案(2)|浏览(110)

在一个大学项目中,我不得不建立一个包含XSS防御机制的环境。2其中一个机制是输入过滤器。3这是用php编写的,可以删除/去除导致执行xss攻击的字符。4代码如下:

static function inputFilter($data) {
    $data = trim($data);
    $data = stripslashes($data);
    return htmlspecialchars($data);
}

是否仍有未涵盖的执行xss攻击的方法?
我尝试用unicode编码、javascript编码和空字节注入绕过过滤器。

aiqt4smr

aiqt4smr1#

在大多数情况下,htmlspecialchars将涵盖大多数场景,因为用户将无法通过注入Hello<script>alert('XSS attack!!');</script>之类的标记来利用HTML漏洞
但是,这取决于您使用此输入的位置,如果它正在填充<a>标记的href属性,则仍可能发生伪攻击,例如:

<a href="javascript:console.log(localStorage....)">Click here</a>

通常,应该避免自己解决XSS攻击的任何尝试,相反,应该考虑使用为这类事情构建的社区驱动的包,其中一个例子是voku/antixss,因为它们会发现这些伪协议调用,并为您对它们进行santize/strip。

bkkx9g8r

bkkx9g8r2#

将XSS电阻代码视为具有两个阶段是有益的。
1.验证和清理,即所谓的输入过滤,以及
1.例如,将<script>转换为&le;script&ge;,这样用户的浏览器就不会将用户提供的数据视为代码。
Validating是检查用户输入是否正确的过程。例如,如果收集一个数字,则该数字不应包含任何字母。如果包含任何字母,则代码应无法通过验证,拒绝输入,并要求用户重试。
Sanitizing是在使用或存储用户输入之前去除用户输入中不需要的部分的过程。例如,大多数接受来自不受信任用户的HTML输入的Web应用程序都会通过删除除HTML标记子集以外的所有标记来清理该输入。例如,<h1><p>不会被删除,但<script><iframe>会被删除。
逐个字段地选择验证和清理技术。例如,如果要收集出生日期,验证任务是确保日期有效。如果要收集电子邮件地址,则确保其格式正确。验证失败时,拒绝输入。
PHP提供了data filtering subsystem,它具有验证和净化各种常见数据类型的内置特性。
如果输入数据类型是HTML,验证和清理规则将非常复杂。可以使用htmlspecialchars()进行清理,但这样做会强制输入纯文本,而不是HTML:它能逃避一切。这是简单系统的一个很好的解决方案。
如果您正在处理实际的HTML,则安全代码的第一条规则适用:不要编写自己的安全代码。相反,使用经过验证的库代码。HTML太复杂了,无法用未经验证的代码安全地清理。网络罪犯比你我更聪明,动机更强烈,他们只需要找到一个漏洞就可以攻击我们的Web应用程序。
WordPress项目一直在维护一个名为kses的模块,它是“kses strips evil scripts”的首字母缩写,它删除了危险的标签和属性,还有Lars Moelleken's anti-xss package
同样,在存储输入以供以后使用之前,需要验证和净化输入。
然后,在输出时,您将
转义
您存储的数据。

相关问题