有没有办法在javascript中声明最终值的静态,以便第三方不能更改它?
我所拥有的是文章共享应用程序,免费用户受广告支持。 我想做的是通过改变内容的存储变量来阻止免费用户改变innerHTML内容。
我目前所拥有的是一个计时器,每5秒钟在用户网站上重新加载文章的innerHTML,并且我将重载的值存储在一个变量中。
但是,如果使用jsbeatify的天才探索哪个变量是删除广告的关键并改变了这一点,那么我们就会失去收入和产品曝光率。
如何防止内部变量的改变?
这是我提出的最终结果:
<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>
这将以压缩格式呈现,只是为了使代码复制出来更难。 这样,简单地复制和粘贴代码的工作量将最大化,并且很难实现自动化。
谢谢大家的回答。
答案 0 :(得分:17)
是的,有。至少对于对象属性,ES5为我们提供了手动更改属性描述符标志的可能性。所以我们可以这样做
var data = { };
Object.defineProperty(data, 'secret', {
value: 42,
writable : false,
enumerable : true,
configurable : false
});
这样,我们在secret
内创建了一个值为42
的属性data
,该属性无法修改也无法删除。
这里需要注意的是,天才(就像你所说的那样)也能够发现这个代码,只是修改它,如果他愿意,可以再次改变内容。您只是无法以这种方式创建安全的前端JavaScript。代码将始终以纯文本形式提供给每个人。
为了使其更加完整,您还可以使用Object.freeze()
和/或Object.seal()
创建一个对象freeze
,以关闭枚举<的选项/ em>,删除和修改对象的属性。
但请注意:这是为了影响您自己的代码或外国代码,以防止在运行时意外或故意修改。没有办法阻止开发人员,因为他甚至可以停止执行你的脚本,然后才能生效。
答案 1 :(得分:3)
尝试使用const关键字。它应该创建一个不可变的变量。