Я хочу проверить в своем веб-приложении, является ли пользователь администратором.

  var obj = { admin: false; };

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

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

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

obj.admin = true;

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

0
Riël 18 Дек 2015 в 11:53

3 ответа

Лучший ответ

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

3
Leo 18 Дек 2015 в 08:59

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

const User = {};

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

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

Это связано с тем, что Object.defineProperty по умолчанию имеет значение false для записи, настройки и перечисления. Вот исключение из объекта MDN объекта Документация .defineProperty, в которой говорится о переопределении существующих свойств.

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

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

  1. ВСЕГДА проверяйте данные, поступающие в ваше приложение.
  2. Сократите и запутайте ваш код.
  3. Используйте строгий режим. Это предотвратит множество небезопасных практик.
  4. Вы можете использовать линтеры для предотвращения более небезопасных действий.
  5. Читайте о распространенных ямах безопасности. Первая десятка OWASP - хорошее место, чтобы прочитать о некоторых из них.
3
Kyle Richardson 7 Ноя 2017 в 05:16

Вы можете использовать Object.freeze

var obj = { admin: false };
Object.freeze(obj);
obj.admin = true;
console.log(obj)

// output {admin: false}

0
HALİL 19 Апр 2019 в 06:46