假设我有以下网页:
<html>
<script>
document.write('querystring=' + location.search.substr(1));
</script>
<html>
我打开它像这样的URL:
http://completely-secure-site/?<script>alert('fsecurity')</script>
在所有浏览器尝试过(Chrome 57,Firefox 52和Safari 10)的结果是:
querystring=%3Cscript%3Ealert(%27fsecurity%27)%3C/script%3E
因为尖括号<>
是无效的URL字符,他们似乎得到自动的方式浏览器中编码,才可以拿到附近的JS运行时的任何地方。
直接在客户端上直接渲染querystring document.write是
安全的,而不是可能的XSS向量。(当然还有很多其他方式可以使应用程序易受攻击)
与这个问题无关,但有一个有趣的地方。如果我先解码URI,那么浏览器的行为是不同的:document.write(decodeURI(location.search.substr(1)));
。Chrome和Safari中的XSS审核程序会阻止该页面,而Firefox会显示警报。
发布于 2018-04-03 08:59:05
如果我使用的查询字符串?<script>alert("d")</script>
在Windows XP上的IE6我获得注入的代码显示警告,这种情况也使用decodeURI
或decodeURIComponent
页面,所以第二个假设是正确的,如果IE6仍然是一个合理的浏览器:它是一个功能现代浏览器
我还看到Firefox 53在使用解码方法时显示注入XSS警报,Opera 44和Chrome 57(全部在Windows上)阻止代码。
发布于 2018-04-03 10:29:52
根据RFC 3986,第2.4节的不安全的字符的入站编码的标准化。虽然我建议不要依赖这个:
https://stackoverflow.com/questions/-100007929
复制相似问题