我正在寻找一种方法,让一段代码(A)可以生成某种 token ,然后将其传递给其他一段代码(B),而第三段代码则无法拦截它(E)。
就本问题而言,假设 A 可以安全地生成 token 。
如果 B 向 A 公开某个函数 F,该函数接受一个包含 token 的对象作为其参数之一,则 A 可以直接传递该 token 。
但是 E 可以通过覆盖 console.log
并检查堆栈等方式找到该标记。
var x = console.log
console.log = function Eve()
{
x.apply(this, arguments);
console.info(Thing.caller.arguments);
}
(当然假设F调用console.log
,但实际上有很多这样的函数可以用这种方式覆盖)
我认为我有一个缓解措施,即在调用任何可能受损的函数之前从传递的对象中删除安全 token 。 即
var y = function Y(Secure)
{
var Thing = Secure.Arg;
delete Secure.Arg;
console.log('SomeMessage', arguments) ;
}
y({Arg:'SomeArg'})
(至少在 FF 中)操作对象参数也会更改其在堆栈上的值,因此堆栈上的 arguments
对象现在包含一个空对象。
E 是否还有其他方法可以访问传递的数据?
如果是,这些方法是否可以缓解,或者我应该考虑其他安全性更好的选项?
编辑清楚:假设 E 是通过 A 或 B 控制之外的方式注入(inject)的 - 例如Greasemonkey 用户脚本
最佳答案
您可以使用一次运行的 getter 和闭包来将私有(private)数据保留在堆栈之外:
function A(secret){
return function(){
var s=secret;
secret=null;
return s;
};
}
function B(fn){
var v=fn();
console.log(fn);
alert("In B(): " + v);
}
var x=A(123); //give secret number to A, getting back a function
alert(x); // no secret here
B(x); // extract the secret by executing a one-time getter
alert(x); // no secret here
alert(x()); // still no secret, it's used-up
由于 JS 使用基于引用的安全性,因此删除引用可以提供安全性。
另请注意,您可以设置断点来获取参数值,但不能使用 try/catch、console.log() 或任何其他用户空间技巧来恢复代码中 A 和 B 之间的 123多于。
您必须运行该函数才能获取该值,而运行该函数会破坏该值。
OP 代码使用的对象属性的问题是,如果发生异常, secret 值在对象上是可见的,而闭包将保留其 secret 。
关于javascript - 在函数之间安全地传递 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36859937/