Должен ли я XSS защищать ответы от моего API?

#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, чтобы, какую бы форму ни принимал пользовательский интерфейс, не возникало проблем с экранированием текстового вывода.