- Описание
- Отправленные решения
501. Защита пользовательских данных
Вы — сотрудник отдела безопасности. Ваша задача — сохранить в целостности пользовательские данные. У вас имеются личные данные пользователя. Какие-то из них — публичные, какие-то — приватные. Пользователь может менять данные, но вы должны следить за их целостностью.
Формат данных:
- Приватные поля начинаются с
_
. - Каждое поле имеет значение и тип этого значения.
- Имеется метод
phone
, который имеет доступ для чтения приватного поля_phone
и позволяет выводить его в шифрованном виде.
{
publicName: {value: 'User80lvl', type: 'string'},
_phone: {value: 79990000011, type: 'number'},
phone () {
let phoneValue = this._phone.value.toString();
return '+' + phoneValue.slice(0,4) + '*****' + phoneValue.slice(-2);
},
}
Правила работы с данными
- Приватные поля нельзя читать, удалять или перезаписывать, никто не должен догадываться об их наличии.
- Методы нельзя изменять или удалять, иначе доступ к приватным данным будет утерян.
- Обращение к
phone
должно быть для пользователя такое же, как к публичному полю. - При чтении, записи или удалении несуществующего или приватного поля возвращаем
false
. - При чтении публичного поля возвращаем только его значение.
- Изменение публичных полей допустимо, если новое значение соответствует типу поля.
Требования к решению
Личные данные обёрнуты Proxy
, который сейчас не имеет никаких ловушек. Вам нужно написать такой объект-обработчик (handler), который будет перехватывать действия над оригинальным объектом и соблюдать перечисленные правила.
Пример простого решения:
module.exports = {}
Ограничения
Ограничение времени
10 с
Ограничение памяти
18 МБ
Пример 1
Ввод
module.exports = {
publicName: {value: 'User80lvl', type: 'string'},
age: {value: 22, type: 'number'},
_firstName: {value: 'Вася', type: 'string'},
};
Вывод
Чтение приватного поля: false
Чтение публичного: User80lvl
Удаление приватного поля: false
Удаление публичного поля: true
Вызов метода: false
Удаление метода: true
Изменение данных пользователя: User90lvl
Пример 2
Ввод
module.exports = {
publicName: {value: 'User80lvl', type: 'string'},
age: {value: 22, type: 'number'},
sex: {value: 'male', type: 'string'},
_firstName: {value: 'Вася', type: 'string'},
_lastName: {value: 'Пупкин', type: 'string'},
_phone: {value: 79990000011, type: 'number'},
phone () {
let phoneValue = this._phone.value.toString();
return '+' + phoneValue.slice(0,4) + '*****' + phoneValue.slice(-2);
},
};
Вывод
Чтение приватного поля: false
Чтение публичного: User80lvl
Удаление приватного поля: false
Удаление публичного поля: true
Вызов метода: +7999*****11
Удаление метода: false
Изменение данных пользователя: User90lvl,male,+7999*****11