Насколько опасна отправка HTML в AJAX по сравнению с отправкой JSON и построением HTML?

Possible Duplicate:
Why is it a bad practice to return generated HTML instead of JSON? Or is it?

Мне кажется, что любой перехват этого может вызвать мгновенные проблемы, потому что любой может просто отправить клиенту любой HTML / скрипт.

Единственная причина, по которой я заинтересован в этом, - это огромная боль, с которой сталкиваются разработчики интерфейса каждый раз, когда происходит изменение структуры DOM / CSS, поэтому теперь вам нужно выяснить, где в процессе сборки Javascript HTML у вас может быть обновить.

Как вы, ребята, с этим справляетесь? Что я могу сделать, чтобы снизить риск, или это просто плохая идея?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
11
0
8 868
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Мне кажется, что было бы еще более сложной задачей выяснить, где на внутреннем сервере, что нужно будет изменить, когда произойдет изменение структуры DOM или CSS.

Хранение всего этого в одном месте (файл HTML), вероятно, лучшая причина ограничить связь ajax только JSON.

Не совсем в Rails. Хорошее использование партиалов сделает это несущественным.

Ben Crouse 09.01.2009 20:51

С обоими необработанными html JSON вы все еще беспокоитесь о безопасности содержимого, в конце концов, JSON - это код JavaScript. Я полагаю, что если вы не доверяете источнику своих данных HTML, тогда вы открыты для всевозможных атак межсайтового скриптинга. Рассмотрите возможность отправки данных в формате JSON и использования библиотеки шаблонов Javascript, например библиотеки пользовательского интерфейса Yahoo, см. http://developer.yahoo.com/yui/docs/YAHOO.lang.html#method_substitute затем позвольте специалистам по интерфейсу поддерживать шаблоны.

Ну, нет, если вы используете специальный парсер JSON вместо juat "eval". «eval» - это то, что делает поврежденный JSON потенциально небезопасным, а не сам JSON. То же самое и с HTML. Это не HTML, пока вы не установите для него значение "innerHtml". Если вы относитесь к нему как к XML и обрабатываете его соответствующим образом, это намного безопаснее.

Will Hartung 12.05.2009 10:13
Ответ принят как подходящий

Я обычно использую следующие правила:

  1. Запросите и верните HTML для быстрых фрагментов, а затем используйте клиентский (статический) Javascript для их вставки. Отлично подходит для предупреждающих сообщений.

  2. Запрос и возврат JSON для больших наборов данных. Это отлично работает, когда вы хотите выполнять фильтрацию, группировку или сортировку на стороне клиента без повторного запроса данных в другой форме.

  3. Запросить и вернуть JSON для больших наборов данных, но включить (экранированный) фрагмент HTML для каждой записи в записи JSON. Это означает больше времени рендеринга и больше использования полосы пропускания, чем (2), но может уменьшить дублирование часто сложного рендеринга HTML.

  4. Запросить и вернуть Javascript, а eval - на стороне клиента. Это лучше всего подходит для таких взаимодействий, как скрытие, отображение, перемещение и удаление. Он также может работать для вставок, но часто для этого лучше использовать тип (1) или (5).

  5. Запросить и вернуть Javascript, а eval - на стороне клиента, но включить экранированный HTML в Javascript, чтобы сервер выполнял рендеринг HTML.

Я, наверное, чаще всего использую 5 и 1.

Просто чтобы прояснить # 5: в клиенте есть eval, а на сервере вы генерируете html, экранируете его и встраиваете в исполняемый javascript, правильно? Вы считаете это ремонтопригодным?

Crescent Fresh 09.01.2009 21:24

Я считаю, что его можно поддерживать в среде MVC, такой как Rails. Я уже генерирую части HTML для представления HTML, поэтому мне просто нужно встроить их в JS.

James A. Rosen 20.01.2009 18:04

Не уверен, что понимаю вопрос на 100% ... но ...

Мы используем GWT и отправляем XML между клиентом и сервером. Я реализовал систему сопоставления XML с помощью генератора кода GWT, поэтому код для преобразования между объектами XML и JavaScript автоматически генерируется на основе самих объектов (с использованием аннотаций в классах java).

Отправка прямого HTML делает ваше приложение менее функциональным, поскольку оно больше не может каким-либо образом интерпретировать данные, а просто обновляет ими экран. Это также усложняет серверную часть, которая теперь должна генерировать HTML ... Я бы серьезно избегал этой стратегии.

У меня есть своего рода идиома /task/action/parameter на стороне javascript. Мой бэкэнд строго возвращает данные, которые мне нужны в JSON, клиент (js) заботится об их отображении. Скажем, я загружаю эту страницу /#/item/product/5, javascript знает, что он должен вызвать объект «item», метод «product» с переданным в него параметром 5.

Это очень хорошо работает для закладок ссылок, поэтому, когда кто-то решает добавлять mysite.com/#/item/product/5 в закладки при каждой загрузке страницы, он точно знает, какой объект..метод вызвать.

Думаю, с точки зрения безопасности большой разницы нет - вы можете анализировать небезопасный JSON, а также небезопасный HTML / JS.

Это больше о правильном разбиении вашего приложения на слои - если вы напрямую вставляете HTML на свою страницу, вам придется создать код, специфичный для представления, на уровне бизнес-логики, что, на мой взгляд, не способствует чистым и легко заменяемым слоям.

Только мои 2 цента ...

The only reason I'm interested in doing this is because of the huge pain it is for front-end developers every time there's a DOM structure/CSS change so you now have to go figure out where in the Javascript HTML building process you may have to update.

Вы, должно быть, делаете это неправильно.

Данные, возвращаемые из AJAX, должны быть только семантические данные, то есть вещи, которые не меняются, если изменяется только макет. Преобразование данных в манипуляции с DOM лучше всего оставить функции Javascript, определенной на самой главной странице.

Я сделал это в качестве комментария, но я настаиваю на этом.

JSON по своей сути безопасен, проблема в том, что с ним делают.

Проблема заключается в использовании eval для оценки, а не формата, поскольку формат неявно ограничен спецификацией JSON. Поврежденный JSON может сделать eval небезопасным. Так что ... не делай этого. Не используйте eval, используйте специальный парсер JSON.

Та же логика может быть применена к HTML. Относитесь к HTML как к «данным», как к простому XML, и обрабатывайте его, а не просто слепо прикрепляйте к своим страницам.

Гораздо труднее махинациям ускользнуть по этому пути.

Другие вопросы по теме