[英]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 抵抗代码视为具有两个阶段会很有帮助。
<script>
转换为≤script≥
因此您用户的浏览器不会将您的用户提供的数据视为代码。验证是检查用户输入是否正确的过程。 例如,如果您收集一个数字,它不应包含任何字母。 如果确实如此,您的代码应该无法通过验证,拒绝输入,并要求用户重试。
清理是在使用或存储用户输入之前去除不需要的部分的过程。 例如,大多数接受来自不受信任用户的 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.