Да, куки HTTP-Only подойдут для этой функции. Они по-прежнему будут предоставлены с запросом XmlHttpRequest к серверу.
В случае переполнения стека файлы cookie автоматически предоставляются как часть запроса XmlHttpRequest. Я не знаю деталей реализации провайдера аутентификации Stack Overflow, но эти данные cookie, вероятно, автоматически используются для проверки вашей личности на более низком уровне, чем метод контроллера «голосования».
В целом, файлы cookie не требуются для AJAX. Техническая поддержка - это поддержка XmlHttpRequest (или даже удаленного взаимодействия в старых браузерах).
Однако, если вы хотите обеспечить безопасность для функциональности с поддержкой AJAX, то применяются те же правила, что и для традиционных сайтов. Вам нужен какой-то метод для идентификации пользователя за каждым запросом, и куки почти всегда являются средством для достижения этой цели.
В вашем примере я не могу написать в ваш document.cookie, но я все равно могу украсть ваш cookie и отправить его на мой домен, используя объект XMLHttpRequest.
XmlHttpRequest не будет отправлять междоменные запросы (именно по тем причинам, к которым вы обращаетесь).
Обычно вы можете внедрить скрипт для отправки куки в ваш домен, используя удаленное взаимодействие iframe или JSONP, но тогда HTTP-Only снова защищает куки, так как он недоступен.
Если вы не взломали StackOverflow.com на стороне сервера, вы не смогли бы украсть мой файл cookie.
Редактировать 2: Вопрос 2. Если цель Http-Only состоит в том, чтобы запретить JavaScript-доступ к cookie-файлам, и вы все равно можете получать cookie-файлы через JavaScript через объект XmlHttpRequest, в чем смысл Http-Only?
Рассмотрим этот сценарий:
- Я нашел способ ввести код JavaScript на страницу.
- Джефф загружает страницу, и мой вредоносный JavaScript модифицирует его cookie, чтобы он соответствовал моему.
- Джефф отправляет звездный ответ на ваш вопрос.
- Поскольку он передает мои данные cookie вместо своих, ответ станет моим.
- Вы голосуете за "мой" звездный ответ.
- Мой реальный счет получает очко.
При использовании файлов cookie только для HTTP второй шаг будет невозможен, что приведет к поражению моей попытки XSS.
Редактировать 4: Извините, я имел в виду, что вы можете отправить запрос XMLHttpRequest в домен StackOverflow, а затем сохранить результат getAllResponseHeaders () в строку, вывести файл cookie и затем опубликовать его во внешнем домене. Похоже, что со мной согласны Википедия и хакеры, но я бы с удовольствием перевоспитался ...
Это верно. Вы все еще можете захватить сеанс таким образом. Это значительно уменьшает количество людей, которые могут успешно выполнить даже этот XSS-хак против вас.
Однако, если вы вернетесь к моему примеру сценария, вы увидите, где HTTP-Only действительно успешно отключает XSS-атаки, которые основаны на модификации куки-файлов клиента (не редкость).
Это сводится к тому, что а) ни одно усовершенствование не решит всех уязвимостей и б) ни одна система не будет никогда полностью защищенной. HTTP-Only - это полезный инструмент для защиты от XSS.
Аналогично, несмотря на то, что междоменное ограничение для XmlHttpRequest не на 100% успешно предотвращает все эксплойты XSS, вы все равно никогда не мечтали бы снять ограничение.