Недавно я узнал, что jQuery $.getJSON()
не безопасен для вызова ненадежного URL. Что насчет $.get()
? Безопасно ли jQuery $.get()
вызывать, когда параметр URL поступает из ненадежного источника или это небезопасно?
Это появилось в обзоре кода безопасности, который я делал, чтобы проверить уязвимости XSS. Пример кода:
$.get(url, function (...) { ... })
Создает ли этот шаблон кода уязвимость XSS, если злоумышленник выбрал url
злонамеренно?
Предположим, что функция будет обрабатывать ответ из запроса AJAX безопасно и что url
поступает из ненадежного источника (например, другого пользователя) и может полностью контролироваться противником.
Мое беспокойство: если url
выбран злоумышленником, злоумышленник может выбрать вредоносный URL (например, содержащий callback=?
и указывая на свой собственный сайт или что-то умное подобное), что заставляет jQuery угадать, что тип данных должен быть JSONP, включить JSONP, вставить тег script в документ и ввести уязвимость XSS таким же образом, как и для getJSON()? (Поскольку я не передаю явный аргумент dataType
в $.get()
, jQuery угадает тип данных, так как описанный в документах. Я не уверен, что это последствия безопасности.)
Я просмотрел этот код в обзоре кода, и я пытаюсь понять, является ли это потенциальной уязвимостью. Я не ищу альтернативные способы написания этого кода; вместо этого я хочу знать, безопасен ли этот тип кода, как есть.
Поскольку модель угроз немного сложна, позвольте мне привести пример, чтобы лучше понять это. Предположим, что Боб является пользователем службы, и он может предоставить URL-адрес, связанный с его профилем. Предположим, что когда Алиса посещает страницу профиля Боба в своем браузере, код Javascript на странице принимает URL-адрес, который предоставил Боб, и передает его в качестве аргумента $.get()
. Вопрос в том, является ли это безопасным? Может ли Боб использовать это для атаки Алисы? Может ли Боб запустить браузер Алисы для выполнения произвольного кода Javascript со всей силой Алисы? Как объясняет связанный вопрос, $.getJSON()
небезопасен в этом сценарии, но как насчет $.get()
? Это тоже небезопасно, или это безопасно?
Поскольку у меня есть некоторые просьбы о разъяснении, позвольте мне попытаться объяснить/задать вопрос другим способом. Предположим, я делаю обзор кода, чтобы проверить, содержит ли какой-либо код Javascript какие-либо уязвимости XSS, и я вижу следующую строку кода:
$.get(url, function(resp) { /* do nothing */ });
Предположим, я знаю, что url
может полностью контролироваться атакующим. Является ли это автоматически уязвимостью XSS? Или это всегда безопасно? Или, если ответ "зависит", от чего он зависит?
Или еще один способ подумать об этом. Предположим, что я делаю обзор кода, и вижу следующую строку кода:
$.get(url, f);
Предположим, я знаю, что url
может полностью контролироваться атакующим. Что мне нужно проверить, чтобы убедиться, что это безопасно (без ошибок XSS)? Я знаю, что мне нужно проверить код f
, чтобы убедиться, что он безопасно обрабатывает ответ, потому что если f
небрежно, он может ввести ошибку XSS. Мой вопрос: это единственное, что мне нужно проверить? Или этот шаблон кода всегда является уязвимостью XSS, независимо от того, как кодируется f
?