背景
假设我有以下网页:
<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
因为尖括号
<>
是 not valid URL characters它们似乎在进入 JS 运行时之前被浏览器自动编码。我的假设
这让我相信只是 使用
document.write
在客户端直接呈现查询字符串永远安全 ,而不是可能的 XSS 向量。 (我意识到应用程序当然还有很多其他方式容易受到攻击,但让我们坚持这里描述的具体情况。)我的问题
我在这个假设中正确吗?
与问题无关,但很有趣。如果我先解码 URI,那么浏览器的行为就会不同:
document.write(decodeURI(location.search.substr(1)));
. XSS Auditor在 Chrome 和 Safari 中阻止页面,而 Firefox 显示警报。
最佳答案
如果我使用查询字符串 ?<script>alert("d")</script>
在 Windows XP 上的 IE6 上,我得到注入(inject)的代码显示警报,这也发生在使用 decodeURI
或 decodeURIComponent
在页面中,所以我会说你的第二个假设是正确的,如果 IE6仍然是一个合理的浏览器:这是现代浏览器的一个特性
我还看到 Firefox 53 在使用解码方法时显示注入(inject)的 XSS 警报,Opera 44 和 Chrome 57(全部在 Windows 上)阻止代码。
关于javascript - URL 上的 HTML <script> 片段可以用于纯客户端应用程序中的 XSS 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43436111/