如何在 JavaScript 中隐藏变量值?

7
我目前正在开发一个JavaScript项目,知道JavaScript源代码可以通过浏览器访问。在代码中,我有一个变量存储了程序使用的秘密字符串。然而,我不希望其他人查看源代码并找到这个变量的值。有没有一种方法可以隐藏变量的值?或者在之后改变变量的值?例如,更改实际的源代码以将变量设置为不同的值?这个变量仅在加载图像时第一次使用,如果可能的话完全删除它也是可以的。

7
完全不可能;攻击者对调试器拥有完全控制。 - SLaks
2
你正在做的事情听起来不安全。请重新考虑你的方法。 - royhowie
@SLaks,攻击者如何在 (function(){ const x = prompt("give me a secret"); ... })() 中注入调试器关键字? - user985399
那么攻击者就不可能回家并打开客户端控制台。 - user985399
用户输入的值可以是来自 prompt("password") 的秘密字符串,在大多数浏览器中应该相当安全。 - user985399
显示剩余4条评论
5个回答

5

你无法将 JavaScript 内容对程序员隐藏。他们可以打开开发者控制台并获取您所有的变量。

更糟糕的是,他们可以使用该控制台直接绕过任何 JavaScript 验证,因此它不能成为您的主要安全解决方案。

如果它是必须要隐藏或保护的内容,您必须考虑使用服务器端解决方案。


有相当安全的CDN服务器来存放代码,因此我们可以排除上传的操纵服务器。在客户端,程序员不会进入你家并打开控制台。因为这个答案被接受了,所以帖子所有者没有一个存储秘密字符串的变量。它可能是一个硬编码的字符串,而不是一个秘密字符串。 - user985399
我们不是在谈论保护源代码。我们在谈论保护变量值。这是不可能的。获取JS变量值非常容易。 - Nelson
仅仅说某人“plain wrong”并不能对你所说的任何事情有意义。我并没有声称“Javascript变量是‘不可能的’”!我可以声称“Javascript变量可能用于存储秘密” - 但这是不可能的,因为你们这种人是团队合作的。 - user985399
这个回答应该被删除,因为它只是基于“安全感”的“事实”,如果受到质疑,似乎是基于对浏览器控制台工作原理没有基本了解的狂想。 - user985399

1
JavaScript在客户端运行,因此我认为这是不可能的。任何需要保密的内容都需要在服务器端进行处理。

JavaScript是同构的,因此它也可以在服务器上运行。 - user985399

1

你所问的目前是不可能的。

但有一个 JavaScript 提案函数实现隐藏,正如其名称所示,它可以隐藏函数实现以防被观察到。该提案始于2019年中期,目前处于第2阶段(共4个阶段)。我个人怀疑它是否会成为标准的一部分,但如果确实如此,在理论上,你可以将秘密隐藏在一个隐藏函数的主体内:

function fetchData() {
  "sensitive"; // ← the proposal

  const SECRET = "VGhlIG1lc3NhZ2UgaXM6IFIyeHZjbmtnZEc4Z1ZXdHlZV2x1WmZDZmg3cnduNGVt";

  return fetch(DATA_URL, {
    headers: {
      "Authorization": `Bearer ${SECRET}`,
    },
  });
}

SECRET变量无法通过调试器或fetchData.toString()进行检查。但是,在控制台的网络选项卡中,Authorization头的值是可见的,因此整个过程不适用于此用例。


-1

JavaScript 是客户端的,实际上没有任何方法可以隐藏代码。

你可以做的:防止普通用户看到它(即使让它更难找到)

我的建议是使用某种密码加密数据(最好不要使用在线加密工具)。这可以阻止大多数懒惰的人看到它。

(假设没有人真的试图找到这个神秘的值)


-3

嗯,你可以将整个代码放入一个函数中,然后在同一脚本中执行它。这对我很有帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接