繁体   English   中英

尽管在 php 中使用 trim() 和 striplashes() 进行输入过滤器,但仍执行 XSS 攻击

[英]Perform XSS attack despite input filter with trim() and striplashes() in php

对于一个大学项目,我必须构建一个包含 XSS 防御机制的环境。 一种这样的机制是输入过滤器。 这是写在 php 中的,删除/剥离导致执行 xss 攻击的字符。 代码如下所示:

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

是否还有未涵盖的xss攻击方法?

我尝试使用 unicode 编码、javascript 编码和 null 字节注入绕过过滤器。

在大多数情况下, htmlspecialchars将涵盖大多数场景,因为用户将无法通过注入Hello<script>alert('XSS attack;!');</script>等标签来使用 HTML 漏洞利用

但是,这取决于您在哪里使用此输入,如果它正在填充<a>标记的href属性,那么伪攻击仍然可能发生,例如:

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

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

将 XSS 抵抗代码视为具有两个阶段会很有帮助。

  1. 验证和清理,即所谓的输入过滤,以及
  2. Escaping。例如将<script>转换为&le;script&ge; 因此您用户的浏览器不会将您的用户提供的数据视为代码。

验证是检查用户输入是否正确的过程。 例如,如果您收集一个数字,它不应包含任何字母。 如果确实如此,您的代码应该无法通过验证,拒绝输入,并要求用户重试。

清理是在使用或存储用户输入之前去除不需要的部分的过程。 例如,大多数接受来自不受信任用户的 html 输入的 web 应用程序通过删除除 HTML 标签的子集之外的所有标签来清理该输入。 例如, <h1><p>没有被移除,但是<script><iframe>被移除。

逐个验证和净化您选择的技术。 例如,如果您要收集出生日期,您的验证任务就是确保日期有效。 如果您要收集 email 地址,请确保其格式正确。 当验证失败时,您拒绝输入。

PHP 提供数据过滤子系统,具有用于验证和清理各种常见数据类型的内置功能。

如果您的输入数据类型是 HTML,您的验证和清理规则将很复杂。 您可以使用 htmlspecialchars() 进行清理,但这样做会强制您的输入为纯文本,而不是 HTML:它会转义所有内容。 对于简单的系统来说,这是一个很好的解决方案。

如果您正在处理实际的 HTML,则应用安全代码的第一条规则:不要编写自己的安全代码。 相反,使用经过验证的库代码。 HTML 太复杂了,无法使用未经验证的代码进行安全清理。 网络罪犯比你我更聪明、更有动力,他们只需要找到一个漏洞就可以破解我们的 web 应用程序。

WordPress 项目一直在维护一个名为kses的模块。 它是“kses strip evil scripts”的缩写。 它删除危险的标签和属性。 还有Lars Moelleken 的反 xss package

同样,您在存储输入供以后使用之前验证和清理输入。

然后,在 output 上,您将转义存储的数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM