java - 防止用户提供的链接中包含 XSS 攻击的正确方法是什么?
问题描述
我正在尝试修复网站上的 XSS 问题,其中用户提供的链接被发送到服务器端,然后呈现回网页。可以执行 XSS 攻击,攻击者的链接将关闭 HTML 标签,方法是在其末尾附加如下内容:
"/><img+src/onerror%3d'alert(document.domain)'><"
我正在尝试使用OWASP Java HTML Sanitizer Library,但无法使其正常工作。
它似乎打破了链接。例如,如果我将此链接输入到LINKS
默认策略,它会破坏它:
前:https://www.google.com/search?client=firefox-b-d&q=xss+encoding+url
后:https://www.google.com/search?client=firefox-b-d&q=xss+encoding+url
如果我将编码后的链接粘贴到浏览器中,它不会直接将我定向到谷歌搜索。
我觉得我误解了 XSS 攻击如何对 URL 起作用,并且希望帮助理解为什么消毒剂不能按我预期的那样工作。我希望消毒剂能够编码像'<'和'"'这样的字符,而不是像'='这样的字符编码。
解决方案
顾名思义,HTML Sanitizer 旨在清理 html 内容(尤其是生成的正文内容、javascript 等)。也就是说,如果您将经过清理的字符串放入 html 页面,它将完美地工作。
只需尝试以下操作:
<html>
<body>
<a href="https://www.google.com/search?client=firefox-b-d&q=xss+encoding+url">
Click here.
<a/>
</body>
</html>
点击经过清理的链接确实会引导您进入您想要的 Google 搜索。
如 OWASP 所述
积极的 XSS 预防模型 (...) 将 HTML 页面视为模板,其中包含允许开发人员放置不受信任数据的插槽。这些插槽涵盖了开发人员可能希望放置不受信任数据的绝大多数常见位置。不允许将不受信任的数据放在 HTML 中的其他位置。这是一个“白名单”模型,它拒绝所有未明确允许的内容。
鉴于浏览器解析 HTML 的方式,每种不同类型的插槽都有略微不同的安全规则。当您将不受信任的数据放入这些插槽时,您需要采取某些步骤来确保数据不会从该插槽中突破到允许代码执行的上下文中。在某种程度上,这种方法将 HTML 文档视为参数化数据库查询 - 数据保存在特定位置,并通过转义与代码上下文隔离。
您的消毒剂旨在使这些插槽成为“更安全”的地方。
推荐阅读
- php - 在 PHP 中读取特殊字符
- sql-server - SSIS 缓冲区分配失败
- mlr - 包装器 normalizeFeatures 如何处理验证集?
- r - 如何显示来自 lm 输出的参考电平?
- android - Dagger2 注入未发生 - 注入的字段结果为空
- wordpress - 如果常规价格为空白,则仅在 Woocommerce 中显示销售价格
- c# - 强制 HttpClient 强制 TSL 高于 1.0
- amazon-redshift - DBeaver 更改 Redshift 视图的格式
- jq - 如何使用jq通过索引更新数组中的元素?
- azure-devops - Azure DevOps,管道 nuget 还原失败在文件中找不到中性语言版本资源