首页 > 解决方案 > 防止用户提供的链接中包含 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&#61;firefox-b-d&amp;q&#61;xss&#43;encoding&#43;url

如果我将编码后的链接粘贴到浏览器中,它不会直接将我定向到谷歌搜索。

我觉得我误解了 XSS 攻击如何对 URL 起作用,并且希望帮助理解为什么消毒剂不能按我预期的那样工作。我希望消毒剂能够编码像'<'和'"'这样的字符,而不是像'='这样的字符编码。

标签: javasecurityxssowasp

解决方案


顾名思义,HTML Sanitizer 旨在清理 html 内容(尤其是生成的正文内容、javascript 等)。也就是说,如果您将经过清理的字符串放入 html 页面,它将完美地工作。

只需尝试以下操作:

<html>
<body>
<a href="https://www.google.com/search?client&#61;firefox-b-d&amp;q&#61;xss&#43;encoding&#43;url">
   Click here.
<a/>
</body>
</html>

点击经过清理的链接确实会引导您进入您想要的 Google 搜索。

如 OWASP 所述

积极的 XSS 预防模型 (...) 将 HTML 页面视为模板,其中包含允许开发人员放置不受信任数据的插槽。这些插槽涵盖了开发人员可能希望放置不受信任数据的绝大多数常见位置。不允许将不受信任的数据放在 HTML 中的其他位置。这是一个“白名单”模型,它拒绝所有未明确允许的内容。

鉴于浏览器解析 HTML 的方式,每种不同类型的插槽都有略微不同的安全规则。当您将不受信任的数据放入这些插槽时,您需要采取某些步骤来确保数据不会从该插槽中突破到允许代码执行的上下文中。在某种程度上,这种方法将 HTML 文档视为参数化数据库查询 - 数据保存在特定位置,并通过转义与代码上下文隔离。

您的消毒剂旨在使这些插槽成为“更安全”的地方。


推荐阅读