#security #api #xss
#Безопасность #API #xss
Вопрос:
У меня есть RESTful API, который может возвращать оба JSON
и XML
.
Скажем, например, что запрос выполняется для всех комментариев к артефакту, такому как документ как таковой: GET /document/DOCUMENT_ID/comments.json
. Ответ выглядит следующим образом:
[
{
"created_time": 1304598075,
"text": "<script type="text/javascript">alert(document.cookie)</script>",
"user_id": 2293,
"id": 184124
},
{
"created_time": 1304598043,
"text": "It's over ninethousaaaaaanddd!!!",
"user_id": 2293,
"id": 184122
}
]
В моем собственном сервисе первый комментарий был бы экранирован XSS перед представлением. Но при доступе через API мне пришлось бы доверять разработчику API для выполнения экранирования.
Если API реализован в веб-сервисе, представленном через браузер, вектор атаки вполне реален.
С другой стороны, если API реализован в настольном приложении или мобильном приложении, экранирование XSS было бы полной неприятностью и не требовалось.
Должен ли я экранировать все строки, которые я возвращаю через API? Или я должен реализовать настройку, чтобы при регистрации стороннего приложения разработчик API мог указать, хочет ли он, чтобы экранированные ответы или нет?
Было бы интересно узнать, как другие справлялись с этой проблемой.
Ответ №1:
Нет, вы не должны — обработка XSS должна выполняться тем, что на самом деле собирается отображать данные. Многие сторонние ASP.NET элементы управления уже реализуют защиту XSS для текста, который они отображают, поэтому вы можете столкнуться с ситуацией, когда текст имеет двойное кодирование.
Комментарии:
1. Хорошо, теперь это действительно была очень веская причина. Было бы по-прежнему хорошей идеей предоставить эту опцию тем разработчикам, которые этого хотят? Что-то вроде подписки?
2. @John, лично я бы не стал, это задача веб-сервиса (или REST API) доставлять данные, а не форматировать их для отображения. Вокруг достаточно библиотек защиты от XSS, чтобы, какую бы форму ни принимал пользовательский интерфейс, не возникало проблем с экранированием текстового вывода.