【发布时间】:2010-09-11 17:27:15
【问题描述】:
我正在将 ASP.NET Web 窗体用于博客风格的 cmets。
编辑 1:这看起来比我最初想的要复杂得多。如何过滤 src?
我宁愿仍然使用真正的 html 标签,但如果事情变得太复杂,我可能会采用自定义路线。我还没有做过任何 XML,所以我需要了解更多吗?
【问题讨论】:
我正在将 ASP.NET Web 窗体用于博客风格的 cmets。
编辑 1:这看起来比我最初想的要复杂得多。如何过滤 src?
我宁愿仍然使用真正的 html 标签,但如果事情变得太复杂,我可能会采用自定义路线。我还没有做过任何 XML,所以我需要了解更多吗?
【问题讨论】:
如果 IMG 是您唯一允许的,我建议您使用简单的方括号语法来允许它。这将消除对解析器的需求,并减少使用解析器的其他危险边缘情况的负载。比如说:
Look at this! [http://a.b.c/m.jpg]
哪个会被转换成
Look at this! <img src="http://a.b.c/m.jpg" />
您应该过滤 SRC 地址,以免恶意内容也通过 SRC 部分。像也许
Look at this! [javascript:alert('pwned!')]
【讨论】:
使用 XML 解析器来验证您的输入,并删除或编码您不希望允许的所有元素和属性。在这种情况下,删除或编码除<img> 之外的所有标签。 tag, and all attributes from that except and titlesrc, alt
【讨论】:
如果您最终使用非 HTML 格式(这使得事情变得更容易 b/c 您可以从字面上转义所有 HTML),请使用像 markdown 这样的标准语法。 markdown image syntax 是 
还有其他的,比如Textile。它的图像语法是!imageurl!
【讨论】:
@chakrit 建议使用自定义语法,例如括号内的 URL - 这很可能是最好的解决方案。你绝对不想开始搞乱解析等。
只需确保正确编码整个评论(根据上下文 - 请在此处查看我的答案Will HTML Encoding prevent all kinds of XSS attacks?)
(顺便说一句,我刚刚在那里发现了一个很好的自定义语法示例...... ;-))
如前所述,将文件扩展名限制为 jpg/gif/etc - 即使可以绕过,也限制协议(例如 http://)。
除了 XSS 之外要考虑的另一个问题是 CSRF (http://www.owasp.org/index.php/Cross-Site_Request_Forgery)。如果您不熟悉这个安全问题,它基本上允许攻击者强制我的浏览器向您的应用程序提交一个有效的经过身份验证的请求,例如转账或更改我的密码。如果它托管在您的网站上,他可以匿名攻击任何易受攻击的应用程序 - 包括您的。 (请注意,即使其他应用程序易受攻击,它们受到攻击也不是你的错,但你仍然不想成为漏洞利用主机或攻击源......)。例如,就您自己的网站而言,攻击者更容易更改您网站上的用户密码。
【讨论】: