【问题标题】:How to prevent the changing of a variable value in Javascript [duplicate]如何防止在Javascript中更改变量值[重复]
【发布时间】:2012-10-15 10:03:23
【问题描述】:

可能重复:
Are there constants in Javascript?

有没有办法在 javascript 中声明一个静态的最终值,这样它就不能被第 3 方更改?

我拥有的是一个文章共享应用程序,支持免费用户的广告。 我希望做的是阻止免费用户通过更改内容的存储变量来更改 innerHTML 内容。

我现在有一个计时器,它每 5 秒在用户网站上重新加载文章的 innerHTML,我将重新加载的值存储在一个变量中。

但是,如果使用 jsbeatify 的天才探索了哪个变量是删除广告的关键并改变了它,我们就会失去收入和产品的曝光率。

如何防止内部变量被篡改?


更新

这是我想出的最终结果:

http://jsfiddle.net/PgdYP/1/

<div id="specialdiv"></div>
<input type="button" value="try to change the function i to do something different" onclick="t.i = function(){alert(data.secret);}"><BR>
<input type="button" value="set function to null out of spite" onclick="t=null;">


 <script type="text/javascript">
    e = function(){var data = { };
    Object.defineProperty(data, 'secret', {
       value: "Hello world!",
       writable : false,
       enumerable : true,
       configurable : false
       });this.z=function(){window.setTimeout("try{document.getElementById('specialdiv').innerHTML =   '"+data.secret+"';t.i.z();}catch(err) {document.body.innerHTML=err;}",5000);}}
        g = function(){};
        g.prototype = new e();e=null;window.t = {}
        Object.defineProperty(window.t, 'i', {
        value: new g(),
        writable : false,
        enumerable : false,
        configurable : false });g = null;
        window.t = Object.freeze(window.t); t = Object.seal(window.t);
        t.i.z();
    </script>

这将以打包格式呈现,只是为了更难将代码从源代码中复制出来。 这样一来,简单地复制和粘贴代码的工作就会最大化,而且很难自动化。

谢谢大家的回答。

【问题讨论】:

标签: javascript static final


【解决方案1】:

是的,有。至少对于对象属性,ES5 为我们提供了手动更改属性描述符 标志的可能性。所以我们可以这样做

var data = { };

Object.defineProperty(data, 'secret', {
    value: 42,
    writable : false,
    enumerable : true,
    configurable : false
});

这样,我们在data 中创建了一个值为42 的属性secret,它不能被修改或删除。

这里需要注意的是,天才(就像您所说的那样)也能够发现此代码并对其进行修改,以便再次能够根据需要更改内容。您只是不能以这种方式创建安全的前端 javascript。代码将始终以纯文本形式提供给所有人。


为了使这更完整,您还可以在某个时候创建​​一个对象并freeze 它,使用Object.freeze() 和/或Object.seal() 关闭枚举选项删除修改对象的属性。

再次提醒一下:这是为了影响您自己的代码或外部代码,以防止在运行时意外或故意修改。没有办法阻止开发人员,因为他可以在脚本生效之前停止执行您的脚本。

【讨论】:

  • @michael-dibbets 只是为了让事情更清楚。你无法保护任何东西。公司在安全系统上花费了数百万美元,这些系统在几个月后就被盗用了。你不会只是编写下一个大的反易受攻击的东西......以任何方式......
  • 原因是我希望它在加载时不可修改,之后通过 javascript 代码。我知道不可能将所有内容都关闭,但我希望它尽可能难以在脚本输出位于他们的站点时对其进行更改。任何想要在努力和结果之间“作弊”的人都有这个门槛。通过这种方式,我将标准提高了一个档次。谢谢。
  • +1 表示“无法阻止开发人员...”!
  • 注意:如果您定义的属性值不是原始数据类型而是对象,则可以对其进行修改(只是不能重新分配)。
【解决方案2】:

试试const 关键字。它应该创建一个不可变的变量。

【讨论】:

  • 有趣...,但我不认为 IE 实现了这个
  • @Ramesh 你的意思是谷歌浏览器? caniuse.com/#feat=const
  • @jartaud - 啊,我没有意识到 chrome 正在部分实现这一点。但是当我在 2012 年写评论时,IE 10 是最后一个稳定版本,它也不支持 const :)
  • @Ramesh ikr?害群之马赢得了这个。 :D
  • const not 使变量不可变。 const a = []; a.push(1); 有效。它只是防止变量被重新声明或重新分配。
猜你喜欢
  • 2012-09-03
  • 1970-01-01
  • 1970-01-01
  • 2015-08-19
  • 2022-06-28
  • 1970-01-01
  • 2017-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多