如何防止Javascript中变量值的更改

如何防止Javascript中变量值的更改,javascript,static,final,Javascript,Static,Final,可能重复: 有没有一种方法可以在javascript中声明一个最终值的静态值,这样第三方就不能修改它 我拥有的是一个文章共享应用程序,免费用户得到广告支持。 我想做的是通过更改内容的存储变量来防止自由用户更改innerHTML内容 我现在拥有的是一个计时器,它每5秒在用户网站上重新加载文章的innerHTML,我将重新加载的值存储在一个变量中 然而,如果一个天才使用jsbeatify探索哪一个变量是删除广告的关键,并改变它,我们就失去了收入和产品的曝光率 如何防止内部变量的变化 更新 这是我

可能重复:

有没有一种方法可以在javascript中声明一个最终值的静态值,这样第三方就不能修改它

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

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

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

如何防止内部变量的变化


更新 这是我想到的最终结果:





e=函数(){var data={};
Object.defineProperty(数据“secret”{
值:“你好,世界!”,
可写:false,
可枚举:正确,
可配置:false
});this.z=function(){window.setTimeout(“try{document.getElementById('specialdiv').innerHTML='”“+data.secret+””;t.i.z();}catch(err){document.body.innerHTML=err;}”,5000);}
g=函数(){};
g、 原型=新的e();e=零;window.t={}
Object.defineProperty(window.t,'i'{
值:新的g(),
可写:false,
可枚举:false,
可配置:false});g=零;
window.t=Object.freeze(window.t);t=Object.seal(window.t);
t、 i.z();
这将以压缩格式呈现,只是为了更难从源代码中复制代码。 这样,简单地复制和粘贴代码的工作将得到最大化,并且很难实现自动化


谢谢大家的回答。

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

var data = { };

Object.defineProperty(data, 'secret', {
    value: 42,
    writable : false,
    enumerable : true,
    configurable : false
});
这样,我们创建了一个属性
secret
,其值为
42
,位于
data
中,无法修改或删除

这里需要注意的是,genius(就像你所说的)也能够发现这段代码并修改它,如果他愿意的话,再次能够更改内容。您就是不能用这种方式创建安全的前端javascript。代码将始终以纯文本形式提供给每个人


为了使此操作更加完整,您还可以创建一个对象,并在某个点冻结它,使用和/或关闭枚举、删除和修改对象属性的选项


但还是要小心一点:这是为了影响您自己的代码或外部代码,以防止在运行时意外或故意修改。没有办法阻止开发人员,因为他可以在脚本生效之前简单地停止脚本的执行。

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

您再次使用的站点的名称是什么?您不应该关心能够做到这一点的少数用户,在将页面加载到用户浏览器中后无法控制该页面。const关键字@michael dibbets只是为了让事情更清楚。你不能保护任何东西。公司在安全系统上花费了数百万美元,而这些系统在几个月后就被摧毁了。你不会只是编写下一个大型的反易受攻击的东西。。。无论如何……原因是我希望它在加载时不可修改,然后通过javascript代码进行修改。我知道不可能把所有的事情都搞定,但我希望它能让在他们的网站上修改脚本输出时尽可能地困难。对于任何想在努力和结果之间“欺骗”的人来说,都有这样一个陷阱。这样我就把杠铃提高了一个档次。谢谢。+1的短语“没有办法阻止开发人员…”!注意:如果您定义的属性值不是一个原始数据类型,而是一个对象,那么它可以被修改(只是不能重新分配)。有趣的是…,但我认为IE并没有实现this@Ramesh你是说谷歌浏览器@jartaud-啊,我没有意识到chrome部分实现了这一点。但当我在2012年写评论时,IE 10是最后一个稳定的版本,它也不支持const:)@Ramesh ikr?害群之马赢得了这场比赛D
const
不会使变量不可变<代码>常数a=[];a、 推(1)工作。它只是防止变量被重新声明或分配。
 <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>
var data = { };

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