javascript: достаточно ли объединить object.seal (класс) с object.seal (класс.прототип)?

#javascript #web-services #web-applications

#javascript #веб-сервисы #веб-приложения

Вопрос:

достаточно ли Object.seal (класса) в сочетании с Object.seal (Class.prototype) для «защиты» моего класса от злоупотреблений?

это мой класс:

 var Lazy;
(function(){
  var value;
  var value_exists=false;
  var init;
  Lazy=function(_init){
    init=_init;
  };
  Lazy.prototype={get V(){
                    if(!value_exists){
                      value=init();
                      value_exists=true;
                    }
                    return value;
                  },set V(_value){
                    value=_value;
                    value_exists=true;
                  }};
  Object.seal(Lazy);Object.seal(Lazy.prototype);
})();
  

Это работает следующим образом, сначала запускается мой код. затем я беру код мэшапа (возможно, сгенерированный динамически) и запускаю. проблема в том, что я не могу определить, является ли мэшап дружественным или грязным. итак, я защищаю свой скрипт от его скрипта, который я взял и запустил после того, как мой код был запущен первым.

вероятно, он не «настоящий злоумышленник». но если он перепутал мой код, скорее всего, приложение выдаст исключение и перестанет работать.. это не то, что я хочу, чтобы мои пользователи испытывали. Следовательно, этот вопрос важен для меня.

Я понимаю, что пользователь может взломать исходный код, поскольку ничто на стороне клиента не безопасно. Но для этого вопроса мы можем предположить, что пользователь здесь не является злоумышленником. Моя цель ясна: я не хочу, чтобы у моих пользователей возникали исключения при использовании сайта (из-за тех мэшапов, которые я включил на свой сайт). Если пользователь сам является злоумышленником, у меня нет проблем с тем, чтобы позволить ему испытать все забавные вещи, в любом случае, это его собственная проблема.

Что меня беспокоит, так это код в мэшапах. (мой веб-сайт не позволяет пользователям вводить какой-либо код, но это может сделать мэшап)

Комментарии:

1. Я не получаю классы запечатывания. Если бы злоумышленник хотел что-то с этим сделать, он бы просто удалил Object.seal и запустил его снова. JavaScript на самом деле не может иметь immutable, потому что его код настолько широко открыт.

2. JavaScript работает на стороне клиента с открытым исходным кодом. Любая защита должна быть выполнена на сервере. Это псевдозащита и бесполезно против реальной атаки.

3. Так зачем это делать, если это бесполезно?

4. @Zirak, чтобы помешать разработчикам, использующим вашу библиотеку, случайно расширять объекты. Это только помогает разработчикам не совершать ошибок

5. кстати, я отредактировал вопрос. ранее в коде была ошибка

Ответ №1:

 Object.freeze(Lazy);
Object.freeze(Lazy.prototype);
  

Object.freeze — это Object.seal, а затем некоторые другие; это также делает существующие свойства недоступными для записи (см. Эту статью.) Это настолько жестко, насколько вы можете получить. Но все еще бесполезно как реальный механизм защиты.

Комментарии:

1. эйс, можете ли вы прокомментировать, почему это бесполезно в качестве реального механизма защиты? (кстати, я немного обновил вопрос)

2. @Pacerier — freeze кажется, время выполнения отличное (имеется в виду, что при попытке ткнуть в него палкой он ведет себя как ожидалось), однако реальная защита работает в 100% ситуаций в 100% случаев, и ничто не мешает пользователю, который также является злоумышленником, изменять исходный код на лету, удаляя ваш механизм защиты. Вот почему вы также никогда не доверяете чему-либо, полученному из фильтра на стороне клиента — вы никогда не можете предположить, что оно выполнялось.

3. @Zirak Хорошо, мы можем предположить, что пользователь здесь не является злоумышленником. Я не хочу, чтобы у моих пользователей возникали исключения при использовании сайта (потому что, если он злоумышленник, у меня нет проблем с тем, чтобы позволить ему получать исключения, в любом случае, это его собственная проблема)

4. @Zirak Я говорю о тех мэшапах, которых я боюсь (что у них целенаправленный или нецелевой код неисправности)

5. @Pacerier Во-первых, пользователь всегда является злоумышленником. Во-вторых, ваш код никогда не может быть идеальным. В-третьих, что происходит в браузере, в котором нет ES5? Object.freeze не существует. В-четвертых, почему вы используете сторонний код, которому вы не доверяете?