说我有以下网页:


 < html>&# XA; <脚本>
 document.write('querystring ='+ location.search.substr(1));
 < / script>
< html>



 我在这样的网址上打开它:
& #xA;
 http://完全安全网站/?< script> alert('fsecurity')< / script>& #xA;


 在所有尝试的浏览器(Chrome 57,Firefox 52和Safari 10)中,结果是:

&# XA;


querystring =%3Cscript%3Ealert(%27fsecurity%27)%3C / script%3E


因为尖括号 <>
是无效的网址字符它们似乎会在进入JS运行时附近的任何地方被浏览器自动编码。
这让我相信,使用 document.write
直接在客户端上呈现查询字符串始终是安全的,而不是可能的XSS向量。 (我意识到当然还有许多其他方式可以让应用程序容易受到攻击,但让我们坚持这里描述的精确案例。)
我在这个假设中是否正确?


 与问题无关,但有趣的一面。如果我首先解码URI,那么浏览器行为是不同的: document.write(decodeURI(location.search.substr(1)));
。 Chrome和Safari中的 XSS Auditor 会阻止该页面,而Firefox会显示警报。
答案 0 :(得分:8)
如果我在Windows XP上的IE6上使用查询字符串?<script>alert("d")</script>
我得到注入的代码显示警告,这也发生在页面中使用decodeURI
或decodeURIComponent
,所以我会说如果IE6仍然是合理的浏览器,那么您的第二个假设是正确的:它是现代浏览器的一个功能
我还看到Firefox 53在使用解码方法时显示注入的XSS警报,Opera 44&amp; Chrome 57(全部在Windows上)阻止代码。
答案 1 :(得分:1)
根据RFC 3986, section 2.4不安全字符的入站编码 标准化。虽然我建议不要依赖它,原因有两个: