如果攻击者在页面上成功运行了一些Javascript代码,他是否可以访问内存中的所有JavaScript对象?
例如,如果攻击者的代码运行,然后我们使用AJAX请求收到JWT令牌。有没有办法保持该JWT令牌的句柄,以使攻击者无法读取它?
考虑以下代码:
(function (window) {
'use strict';
function MyLib() {
var _MyLibObject = {}
_MyLibObject.retrieveJWTToken = function() {
_MyLibObject.jwtToken = "blabla"
}
return _MyLibObject;
}
if (typeof (window.MyLib) === 'undefined') {
window.MyLib = MyLib;
}
})(window);
一旦调用了restoreJWTToken():
var lib = MyLib();
lib.retrieveJWTToken()
通过执行以下操作,可以轻松访问JWT令牌:
lib.jwtToken
有什么方法可以设计此变量,以便MyLib只能读取此变量,以避免使用XSS?
答案 0 :(得分:1)
如果攻击者在页面上成功运行了一些Javascript代码,他是否可以访问内存中的所有JavaScript对象?
只要没有旁道攻击,攻击者就只能读取脚本有权访问的范围内的变量。
您可以使用以下方法创建仅类/对象可访问的变量: Range.Copy:
(function (window) {
'use strict';
var tokenList = new WeakMap()
function MyLib() {
var _MyLibObject = {}
_MyLibObject.retrieveJWTToken = function() {
tokenList.set(this, "blabla");
console.log(tokenList.get(this))
}
return _MyLibObject;
}
if (typeof (window.MyLib) === 'undefined') {
window.MyLib = MyLib;
}
})(window);
var lib = MyLib()
lib.retrieveJWTToken()
但是,如果您使用AJAX请求该令牌,那么问题就不会是保护变量,而是保护请求,以使恶意脚本无法拦截该请求。
您可以假设,如果某人设法在页面上执行脚本,那么他们将能够访问数据。
他们可以覆盖与使用ajax发送或获取数据有关的所有功能。并已在该阶段获取关键数据。
打包脚本可能会更加麻烦,因为根据它们的配置,它们允许某些脚本稍后加载,并且可以被滥用。
首先应重点注意防止脚本注入,例如使用WeakMap,以便仅允许从某些域加载脚本。要恢复eval
权限,请防止内联脚本确保Content Security Policy