如何在阻止XSS的同时允许使用<img/>?

时间:2008-09-21 03:09:40

标签: xss image

我正在使用ASP.NET Web Forms进行博客风格评论。

编辑1:这看起来比我想象的要复杂得多。你如何过滤src?
我宁愿仍然使用真正的HTML标签,但如果事情变得太复杂,我可能会去自定义路线。我还没有做过任何XML,所以我需要了解更多信息吗?

4 个答案:

答案 0 :(得分:3)

如果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!')]

答案 1 :(得分:1)

使用XML解析器验证您的输入,并删除或编码您不希望允许的所有元素和属性。在这种情况下,删除或编码除<img> tag, and all attributes from that except src, alt and title以外的所有标记。

答案 2 :(得分:0)

如果您最终使用的是非HTML格式(这使得b / c变得更容易,您可以完全逃脱所有HTML),请使用标准语法,如markdownmarkdown image syntax![alt text](/path/to/image.jpg)

还有其他人,例如Textile。它的图像语法是!imageurl!

答案 3 :(得分:0)

@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)。如果您不熟悉此安全问题,它基本上允许攻击者强制我的浏览器向您的应用程序提交有效的身份验证请求,例如转账或更改密码。如果这是托管在您的网站上,他可以匿名攻击任何易受攻击的应用程序 - 包括您的。 (请注意,即使其他应用程序容易受到攻击,也不是你的错,它们会受到攻击,但你仍然不想成为攻击主机或攻击源......)。例如,就您自己的网站而言,攻击者更容易更改您网站上的用户密码。