我们如何允许在防止XSS的同时使用?
我正在使用ASP.NET Web窗体进行博客样式注释。
编辑1:这看起来比我最初想到的要复杂得多。我们如何过滤src?
我宁愿仍然使用真正的html标签,但是如果事情太复杂了,我可能会采用自定义路线。我还没有完成任何XML,所以我需要了解更多有关它的信息吗?
解决方案
使用XML解析器来验证输入,并删除或者编码所有我们不想允许的元素和属性。在这种情况下,删除或者编码除<img>标签之外的所有标签以及该标签中除src,alt和title以外的所有属性。
如果只允许使用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!')]
如果最终使用非HTML格式(使b / c变得更容易,我们可以从字面上转义所有HTML),请使用markdown之类的标准语法。降价图片的语法是
还有其他,例如纺织。它的图像语法是!imageurl!
。
@chakrit建议使用自定义语法,例如带括号的URL这可能是最好的解决方案。我们绝对不希望开始进行解析等操作。
只要确保我们正确编码了整个注释即可(根据上下文,请参见此处的答案,HTML编码会阻止所有类型的XSS攻击吗?)
(顺便说一句,我刚刚发现了一个很好的自定义语法的例子... ;-))
还要提到的是,即使可以绕过jpg / gif / etc,也要限制文件扩展名为jpg / gif / etc,并且还要限制协议(例如http://)。
除了XSS之外,还要考虑的另一个问题是CSRF(http://www.owasp.org/index.php/Cross-Site_Request_Forgery)。如果我们不熟悉此安全问题,则基本上可以使攻击者强迫我的浏览器向应用程序提交经过身份验证的有效请求,例如转移资金或者更改我的密码。如果将其托管在网站上,则他可以匿名攻击包括我们在内的任何易受攻击的应用程序。 (请注意,即使其他应用程序容易受到攻击,它们受到攻击也不是错,但我们仍然不希望成为漏洞利用主机或者攻击源...)。就我们自己的站点而言,例如,攻击者更容易更改我们站点上的用户密码。