【问题标题】:JS: truly secret vars (for securely submitting a score)JS:真正的秘密变量(用于安全提交分数)
【发布时间】:2013-09-09 06:16:25
【问题描述】:

是否可以找到在匿名函数 (IIFE) 中声明的随机生成的值,如果可以,如何找到?

(function () {
  // assuming an epic, obscured, random function
  var salt = random()*10000|0;

  // assuming an event manager
  Events.on('custom event', function () {
    // do something amazing with salt here
  });
})()

假设:

  • 函数通过ajax加载
  • 它在加载时执行(使其难以包含断点)
  • 有一个合适的优雅解决方案来测试注入(有这样的东西吗?)。

【问题讨论】:

  • 客户端不必运行您的代码。它可以根据需要修改您的代码或运行完全不相关的代码。如果对攻击者方便的话,它可以很容易地总是使用 0 的盐。
  • 如果你想推出自己的密码学,那是一个可怕的想法。密码学很难。有各种你永远不会想到的攻击;你不会做对的。
  • 我真的只是在寻找一种从全局对象中隐藏变量的方法。我能想到更多的方法来对抗注射。

标签: javascript security variables anonymous-function salt


【解决方案1】:

您的 JS 中的一个简单断点会暴露盐值。 IIFE 之外的代码无法访问它(立即调用函数表达式 - 您正在调用匿名函数),但是如果您试图阻止调试器通过 IIFE 内的断点看到它,那么 JS 不会阻止无论如何。

例如,您可以在生成盐值的位置设置断点并查看它是什么,或者如果该代码是通过 ajax 动态加载的,您可以在 ajax 加载代码上设置断点,然后逐步加载代码,直到您可以设置一个断点来创造销售价值。

【讨论】:

  • 决定把我的评论变成答案
  • 为快速响应而欢呼。我应该提到,匿名函数驻留在外部脚本中,通过 ajax 调用(jquery getScript)加载。虽然 eval'ed 功能可用,但我无法在加载时设置断点。这也容易做到吗?
  • @som - 以这种方式加载并不容易,但它仍然可行 - 只需多做一点工作即可设置断点。也可以拦截脚本的加载并在加载之前对其进行修改。基本上,您必须决定是否对模糊感到满意(其中有障碍,但仍然可以击败),或者您是否想要真正的安全。
  • 看起来喜欢在 xhr 上设置断点是要走的路。如果您想更新您的答案,我可以将其标记为正确(目前似乎有点模糊)。感谢您的洞察力。
  • @som - 我的回答中添加了更多内容。
【解决方案2】:

我想办法破解它,首先设置一个断点并覆盖盐,或覆盖Math.random 以始终返回相同的值。并且没有办法保护您的程序免受此影响。另一方面,很难在缩小和混淆的脚本中找到这段代码。

【讨论】:

  • +1 用于覆盖随机函数,但为了争论,我们可以说我自己滚动了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
  • 2021-06-10
  • 2019-12-23
  • 2015-01-03
相关资源
最近更新 更多