javascript - 在函数之间安全地传递 token

标签 javascript security

我正在寻找一种方法,让一段代码(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/

相关文章:

javascript - Facebook Javascript SDK 安全问题?

java - Java 类加载器安全模型

swift - 在沙盒 macOS 应用程序的 ApplicationScripts 目录中创建文件

javascript - ng-repeat 上的 AngularJS 工具提示

javascript - 使用 javascript 获取我当前的地址

javascript - 注销时jQuery清除缓存

javascript - JS 内部无法访问iron-router 数据

javascript - 将 &lt;input&gt; 元素附加到 <td> 时,appendChild 为未定义

javascript - JS加密-python解密

javascript - 使用 JavaScript 使 Firefox 崩溃