При определенных условиях, таких как запрос AJAX или (что более интересно) соединение через веб-сокет, каков наилучший способ выполнить ответ от сервера?
Основная критикаeval
когда используется для анализа результатов сообщения, это означает, что оно является излишним - вы используете кувалду, чтобы ударить муху со всем дополнительным риском, исходящим от одоленных инструментов - они могут прийти в норму и ударить вас.
Давайте разберем виды ответов на несколько разных категорий:
- Статический javascript, загружаемый по требованию
- Динамический ответ из надежного источника в защищенном канале, который не содержит никакого указанного содержимогоненадежными сторонами.
- Динамический ответ от смешанных источников (может быть, в основном доверенный, но включает закодированные строки, указанные ненадежными сторонами), который в основном представляет собой данные
- Побочные эффекты на основе данных
Для (1) нет разницы между XHR + eval
и <script src>
, но XHR + eval
имеет несколько преимуществ.
Для (2) небольшая разница.Если вы можете распаковать ответ, используя JSON.parse
, вы, скорее всего, столкнетесь с меньшим количеством проблем, но дополнительные права доступа eval
с меньшей вероятностью будут использованы с данными из надежного источника, чем в противном случае, так что нет ничего страшного, если выесть хорошая положительная причина для eval
.
Для (3) есть большая разница.Чрезвычайно оскорбительный авторитет eval
может вас укусить, даже если вы очень осторожны.Это хрупкий с точки зрения безопасности.Не делайте этого.
Для (4) было бы лучше, если бы вы могли разделить его на проблему с данными и код.JSONP позволяет это, если вы можете проверить результат перед выполнением.Разберите данные, используя JSON.parse
или что-то еще с небольшим злоупотреблением полномочиями, поэтому функция, которую вы написали и одобрили для внешнего использования, дает побочные эффекты.Это сводит к минимуму чрезмерное злоупотребление властью.Наивный eval
здесь опасен.