Файлы cookie для входа / сессии, Ajax и безопасность - PullRequest
42 голосов
/ 19 марта 2009

Я пытаюсь определить наиболее безопасный метод для формы входа на основе ajax для аутентификации и установки cookie на стороне клиента. Я видел вещи о XSS-атаках, такие как:

Как cookie-файлы HttpOnly работают с AJAX-запросами?

и

http://www.codinghorror.com/blog/archives/001167.html

Итак, я думаю, мои основные вопросы ...

1) Использование чистого ajax для обеспечения безопасности файлов cookie, если да, то какой метод является наиболее безопасным (httpOnly + SSL + зашифрованные значения и т. Д.)?

2) Включает ли чистый ajax-метод настройку клиентской стороны cookie? Это вообще безопасно?

3) Надежна ли установка файлов cookie таким образом во всех основных браузерах / ОС?

4) Будет ли использование скрытого IFrame более безопасным (вызов веб-страницы для установки файлов cookie)?

5) Если возможно, есть у кого-нибудь код для этого (PHP - мой бэкэнд)?

Моя цель - установить файлы cookie и сделать их доступными для следующего звонка на сервер без перехода со страницы.

Я действительно хочу закрепить консенсус, самый безопасный способ сделать это. В конце концов, этот код планируется сделать открытым исходным кодом, поэтому, пожалуйста, не используйте коммерческий код (или ничего такого, что не выдержало бы публичного контроля)

Спасибо, -Todd

1 Ответ

70 голосов
/ 19 марта 2009
  1. Файл cookie должен быть создан на стороне сервера, поскольку сеанс привязывает клиента к серверу, и поэтому обмен токенами на каком-то этапе должен переходить с сервера на клиент. На самом деле было бы бесполезно создавать cookie-файлы на стороне клиента, поскольку клиент является ненадежным удаленным компьютером.

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

    Таким образом, вы можете использовать AJAX для входа в систему так же, как вы могли полагаться только на POST из формы на странице. Сервер увидит их точно так же, и если сервер установит cookie, браузер сохранит его.

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

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

  2. (см. 1. Я их как бы комбинировал)

  3. Учитывая, что cookie устанавливается сервером в его заголовках ответа HTTP, да, он надежен. Однако, чтобы сделать его кросс-браузерным совместимым, вам все равно нужно убедиться, что вход в систему возможен, когда AJAX недоступен. Это может потребовать реализации альтернативы, которая видна только тогда, когда нет Javascript или если AJAX недоступен. ( Примечание: теперь в 2014 году вам больше не нужно беспокоиться о поддержке браузером AJAX ).

  4. Это не изменит безопасность. В этом не было бы необходимости, за исключением того, что я видел скрытые iframes, использовавшиеся ранее, чтобы «имитировать» AJAX прежде - то есть делать асинхронные вызовы на сервер. По сути, как бы вы это ни делали, это не имеет значения, это сервер, устанавливающий cookie, и клиент примет и вернет cookie независимо от того, делает это AJAX или нет.

По большей части то, используете ли вы AJAX или нет, не влияет на безопасность в той же степени, как и вся реальная безопасность, происходящая на стороне сервера, и для сервера вызов AJAX аналогичен вызову не-AJAX: не быть доверенным. Поэтому вам необходимо знать о таких проблемах, как фиксация сеанса и login CSRF , а также о проблемах, влияющих на сессию в целом, таких как CSRF и XSS так же, как если бы вы не использовали AJAX. При использовании AJAX эти проблемы не меняются, за исключением того, что, я полагаю, вы можете допустить больше ошибок с технологией, если вы менее знакомы с ней или она более сложна.

Ответ обновлен сентябрь 2014

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...