Как предотвратить изменение значения переменной в Javascript

Возможный дубликат:
Существуют ли константы в Javascript?

Есть ли способ объявить статическое значение final в javascript, чтобы оно не могло быть изменено третьей стороной?

У меня есть приложение для обмена статьями, где бесплатные пользователи поддерживают рекламу. Что я хочу сделать, так это запретить свободным пользователям изменять содержимое innerHTML путем изменения переменной хранения для содержимого.

На данный момент у меня есть таймер, который перезагружает innerHTML статьи на веб-сайте пользователя каждые 5 секунд, и я сохраняю значение для перезагрузки в переменной.

Однако, если гений, использующий 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>

Он будет представлен в упакованном формате, чтобы было сложнее просто скопировать код из источника. Таким образом, усилия по простому копированию и вставке кода будут максимальными, и их будет очень сложно автоматизировать.

Спасибо всем за ответы.


person Tschallacka    schedule 25.10.2012    source источник
comment
как назывался сайт, над которым вы снова работали?   -  person Jacob George    schedule 25.10.2012
comment
Вам не следует беспокоиться о том, что очень немногие пользователи способны на это, нет возможности управлять страницей после ее загрузки в браузерах пользователей.   -  person Esailija    schedule 25.10.2012
comment
ключевое слово const? developer.mozilla.org/en/Core_JavaScript_1.5_Guide/   -  person Tom Sarduy    schedule 25.10.2012


Ответы (2)


Да, есть. По крайней мере, для свойств объекта, ES5 дал нам возможность вручную изменять флаги дескриптора свойства. Так что мы можем сделать это как

var data = { };

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

Таким образом, мы создали свойство secret со значением 42 в data, которое нельзя изменить или удалить.

Предостережение здесь в том, что гений (как вы его назвали) также сможет обнаружить этот код и просто изменить его, чтобы снова иметь возможность изменять содержимое, если он пожелает. Вы просто не можете создать таким образом защищенный интерфейсный javascript. Код всегда будет доступен в виде обычного текста для всех.


Чтобы сделать это более полным, вы также можете создать объект и freeze его в какой-то момент, используя Object.freeze() и / или Object.seal(), чтобы выключить опция для перечисления, удаления и изменения свойств объекта.

Но еще раз предостережение: это сделано для того, чтобы повлиять на ваш собственный или внешний код, чтобы предотвратить случайные или преднамеренные модификации во время выполнения. Невозможно остановить разработчика, так как он может просто остановить выполнение вашего скрипта, прежде чем это даже повлияет.

person jAndy    schedule 25.10.2012
comment
@ michael-dibbets Просто чтобы еще больше прояснить ситуацию. Вы не можете защитить ничего. Компании тратят миллионы на системы безопасности, которые через несколько месяцев после этого разрываются. Вы не просто закодируете следующую большую анти-уязвимую вещь ... в любом случае ... - person alexandernst; 25.10.2012
comment
Причина в том, что я хочу, чтобы его нельзя было изменять при загрузке, а затем с помощью кода javascript. Я знаю, что невозможно все закрыть, но я хочу, чтобы было как можно труднее изменять вывод скрипта, когда он находится на их сайте. Это порог для всех, кто хочет выбирать между усилием и результатом. Таким образом я поднимаю планку еще на одну ступень. Спасибо. - person Tschallacka; 25.10.2012
comment
+1 за фразу Разработчика не остановить ...! - person Kate; 29.05.2014
comment
Примечание. Если определенное вами значение свойства является не примитивным типом данных, а объектом, его можно изменить (но не переназначить). - person le_m; 13.06.2016

попробуйте const ключевое слово. он должен создать неизменяемую переменную.

person Rorchackh    schedule 25.10.2012
comment
интересно ... но я не думаю, что IE реализует это - person Ramesh; 25.10.2012
comment
@Ramesh ты имеешь в виду Google Chrome? caniuse.com/#feat=const - person jartaud; 14.02.2016
comment
@jartaud - Ах, я не понимал, что Chrome частично реализует это. Но когда я написал комментарий в 2012 году, IE 10 был последней стабильной версией, и он также не поддерживал const :) - person Ramesh; 15.02.2016
comment
@ Рамеш икр? паршивая овца побеждает в этом. : D - person jartaud; 15.02.2016
comment
const не делает переменную неизменной. const a = []; a.push(1); работает. Это просто предотвращает повторное объявление или повторное присвоение переменной. - person le_m; 13.06.2016
comment
исключая объекты - person Si7ius; 12.12.2019