说我有以下网页:
<html>
<script>
document.write('querystring=' + location.search.substr(1));
</script>
<html>
Run Code Online (Sandbox Code Playgroud)
我在这样的URL打开它:
http://completely-secure-site/?<script>alert('fsecurity')</script>
Run Code Online (Sandbox Code Playgroud)
在所有尝试的浏览器(Chrome 57,Firefox 52和Safari 10)中,结果是:
查询字符串=%3Cscript%3Ealert(%27fsecurity%27)%3C /脚本%3E
因为尖括号<>是无效的URL字符,他们似乎得到自动的方式浏览器中编码,才可以拿到附近的JS运行时的任何地方.
这让我相信简单地在客户端上直接渲染查询字符串document.write总是安全的,而不是可能的XSS向量.(我意识到当然还有许多其他方式可以让应用程序容易受到攻击,但让我们坚持这里描述的精确案例.)
我在这个假设中是否正确?
与问题无关,但有趣的是一边.如果我首先解码URI,那么浏览器的行为是不同的:document.write(decodeURI(location.search.substr(1)));.Chrome和Safari中的XSS Auditor会阻止该页面,而Firefox会显示警报.
我知道有几种方法可以做到这一点,但它们都有一些缺点.是否有"接受"的方式,这被认为是最好的?
我以前使用的Microsoft.Security.Application.AntiXss.JavaScriptEncode()是很棒的,但AntiXSS已经结束了,因为编码器现在包含在4.5中的.NET中.
但是,由于某种原因,System.Web.Security.AntiXss.AntiXssEncoder不包括该JavaScriptEncode方法.
有System.Web.HttpUtility.JavaScriptStringEncode(),但它使用黑名单方法进行编码,因此它不太可能像白名单编码器一样好.
我已经看到了一些使用的建议System.Web.Script.Serialization.JavaScriptSerializer.Serialize(),但这只是打电话HttpUtility.JavaScriptStringEncode().
那么目前用于编码作为JS变量编写的值的最佳接受白名单方法是什么?