2015-12-18 2 views
0

Я хочу проверить свой webapp, если пользователь является администратором.Object.defineProperty - запретить пользователю изменять этот JavaScript

var obj = { admin: false; }; 

    Object.defineProperty(obj, "admin", { 
     writable: false 
    }); 

Теперь пользователь может перейти в консоль, и сделать:

Object.defineProperty(obj, "admin", { 
      writable: true 
     }); 

obj.admin = true; 

Есть ли способ, чтобы предотвратить это? Есть ли другой лучший способ предотвратить выполнение частей кода JavaScript, если применяются определенные критерии? Я понимаю, что пользователи могут изменить код в любом случае, поэтому я немного ищу хорошую практику.

+0

Вы можете инкапсулировать инициализацию свойств так же, как в java-аксессуарах и мутаторах. – fuzzy28

+0

Почему не 'var obj = {admin: function() {return false; }}; '? –

+1

@YeldarKurmangaliyev: не позволяет ли эта собственность переписываться? Не стоимость, а сама собственность. –

ответ

3

Нет. Вы не можете запретить пользователям (например, мне) запускать мой собственный javascript в моем OWN-браузере. Необходимо проверить, аутентифицировать и авторизировать на стороне сервера. Чтобы аутентифицировать и разрешать запрос, вам необходимо использовать стандартные механизмы, такие как файлы cookie, токены, ключи доступа api и т. Д.

+0

Открытый ответ. Я подозревал это. –

0

Свойства объектов можно создавать без изменений с помощью Object.defineProperty. Запустите снимок ниже, и вы увидите TypeError: Cannot redefine property: admin в консоли.

const User = {}; 
 

 
Object.defineProperty(User, "admin", { 
 
\t value: false 
 
}); 
 

 
Object.defineProperty(User, "admin", { 
 
\t value: true 
 
});

Это происходит потому, что Object.defineProperty по умолчанию ложно для перезаписываемых, конфигурируемый, и перечислим. Вот за исключением MDN Object.defineProperty documentation, который говорит о переопределении существующих свойств.

Когда свойство уже существует, Object.defineProperty() пытается изменить свойство в соответствии со значениями в дескрипторе и текущей конфигурацией объекта. Если старый дескриптор имеет свой настраиваемый атрибут, установленный в false, свойство считается «неконфигурируемым», и никакой атрибут не может быть изменен (кроме одностороннего изменения записи на false). Невозможно переключиться между типами данных и типами доступа, когда свойство не настраивается.

Все, что сказано, использование этого в качестве меры безопасности вызовет у вас проблемы. Что касается обеспечения безопасности вашего кода, то ...

  1. ВСЕГДА проверяем данные, входящие в ваше приложение.
  2. Минимизировать и запутать ваш код.
  3. Использование strict mode. Это предотвратит много небезопасных практик.
  4. Вы можете использовать линт, чтобы предотвратить более опасные действия.
  5. Читайте о спадах общей безопасности. OWASP Top Ten - хорошее место, чтобы прочитать о некоторых из них.