跨站点脚本:限制使用<和>标签是减少跨站点脚本的有效方法吗?

时间:2016-07-25 15:46:12

标签: javascript xss

如果我想阻止XSS,会限制特殊字符的输入,例如<和>在所有文本输入表格中是预防它的最佳方法吗?

我的意思是,这会阻止输入<script><img>等html标记,并有效阻止XSS。

你同意吗?

2 个答案:

答案 0 :(得分:2)

没有。阻止它的最佳方法是确保您在页面上输出的所有信息都经过适当编码。

为什么尖括号(和其他特殊字符阻塞)不足的一些可能的例子:

https://security.stackexchange.com/questions/36629/cross-site-scripting-without-special-chars

答案 1 :(得分:1)

防止XSS的一个最大问题是单个网页有许多不同的编码上下文,其中一些可能重叠也可能不重叠。双重编码被认为具有内在的危险性。

我们来看一个例子。您禁止<>,因此我无法再在您的网页中输入HTML元素,对吧?嗯,不太好。例如,如果您将我加载的文本放入属性中,它将以不同的方式进行解释:

onload="document.write('&lt;script&gt;window.alert(&quot;Gotcha!&quot;)&lt;/script&gt;')"

有很多这样的机会,每个都需要自己的正确编码变体。即使将输入编码为正确的HTML文本(例如,将<转换为&lt;),如果文本随后在javascript中使用,并且在例如innerHTML之类的内容中使用,则可能是漏洞。

任何类型的网址(img src="javascript:alert('I can't let you do that, Dave')")或在任何类型的脚本中嵌入用户输入(\x3C)都会出现同样的问题。 URL特别危险,因为它执行三重编码 - URL编码,(X)HTML编码以及可能的JavaScript编码。我不确定在这些条件下是否可以安全地使用用户输入:D

理想情况下,您希望尽可能多地限制曝光范围。除非您信任用户(例如管理员),否则请勿从生成的文档中读取。避免多次编码,并始终确保您确切知道每个可能不安全的编码的位置。在XHTML中,您在CDATA部分中有一个很好的选项,这使得编码具有潜在危险的代码变得容易,但是可能会被不正确支持XHTML的浏览器错误地解释。否则,使用适当的文档编码方法 - 在JS中,这将是innerText。当然,您需要确保您的JS脚本不会因用户数据而受到损害。