这与使用jQuery选择器的XSS attack有关。我在我的代码中读取url哈希。如果我有像这样的格式错误的网址
http://www.example.com/#<img src='/' onerror='alert(1)'>
在创建选择器之前,一种安全的解决方法是在我的代码中使用escape
函数(例如_.escape)(我知道我可以使用$('body').find(...)
避免这种情况,但我的问题并不是要避免它)
var wHash = escape(window.location.hash.replace('#',''));
$(wHash);
问题:是否可以在有效负载内重新定义escape
,使其无效。像这样:
<img src='/' onerror='(function(){window.escape = function(x) { return x; } })()'>
我无法精确地制作它以使其正常工作,但我想知道是什么阻止攻击者从网址哈希中重新定义代码的escaping
部分?
答案 0 :(得分:2)
wHash = escape(…)
在 $(wHash)
之前执行,这将从<img …>
创建图像元素。但是,当escape
在之前修改值时,它由$
进行评估,escape
函数重新定义只会在之后发生已被召唤。