Безопасность с помощью AJAX и установить innerHTML?

Рассмотрим следующие обстоятельства:

  • Я отправляю запрос AJAX (без ввода данных пользователем) в PHP, который запускает функцию.
  • Функция возвращает строку необработанного HTML. Может быть что угодно — список ссылок, куча пустых div-ов, SVG для вставки в строку, большая часть страницы … Никакие пользовательские входные данные не используются при его создании.
  • Я получаю строку в качестве ответа и вставляю ее в
    дела.
  • Я (в настоящее время и в идеале хотел бы продолжить) использую чистый JS — без библиотек.

Принимая во внимание тот факт, что JS присущ определенный уровень безопасности, насколько небезопасным является то, что я только что сделал?

Шпаргалка OWASP XSS говорит, чтобы избежать всех «ненадежных данных». Является ли результат моего запроса AJAX ненадежным с учетом вышеуказанных обстоятельств? Является ли результат любого запроса AJAX «ненадежным»?

Является ли вставка HTML таким способом плохой практикой? Если так, что я должен делать вместо этого?

Изменить, чтобы уточнить пару вещей:

  • Переменные URL в запросе AJAX используются только для запуска функции PHP на сервере. Переменные этой функции вообще не передаются (в частности, я использую компонент com_ajax Joomla).
  • Все из возвращенного кода является статическим и написанным мной.

1

Решение

Пока ответ действительно статичен и не связан с пользовательским вводом любого вида, это отлично. Сам AJAX (как вы намекали) не делает его уязвимым для XSS (при условии, что транспорт безопасен, что практически означает https).

Одним из предостережений (не обязательно в вашем случае, но в целом) может быть то, что вы считаете вводом пользователя, а что нет. Ваше приложение всегда получает ввод от пользователя, или он может использовать параметры, полученные ранее, или даже другим приложением. Даже если вы не передаете параметры, существуют заголовки запросов, файлы cookie (если они есть), и пользовательский ввод также может быть считан из базы данных. Даже если они выглядят как статические данные в базе данных, в какой-то момент они могли быть получены от какого-то пользователя, вероятно, законного (но неконтролируемого), или внешнего злоумышленника, или они могли быть получены из другого приложения, которое пишет в та же база данных (в любом случае, это не очень хорошая практика).

Короче говоря, если данные, которые вы отправляете обратно, на самом деле являются просто статическими данными (как в жестком коде), они не уязвимы, но есть много способов, которыми они могут стать динамичными, и оттуда это ваше (в идеале основанное на риске) решение, что вы защищать и от того, что вы доверяете.

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]