#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
не существует. В-четвертых, почему вы используете сторонний код, которому вы не доверяете?