Как сделать проверку подлинности без сохранения состояния (без сеанса) и без файлов cookie?
Боб использует веб-приложение для того, чтобы чего-то добиться. И:
- его браузер находится на диете, поэтому он не поддерживает cookies.
- веб-приложение является популярным, он имеет дело с большим количеством пользователей в данный момент-он должен масштаб хорошо. До тех пор, пока ведение сессии будет навязывать ограничение на количество одновременных подключений, и, конечно же, принесет несущественное производительность штраф, мы хотели бы иметь систему без сеанса:)
некоторые важные замечания:
- у нас есть безопасность на транспорте (HTTPS и его лучшие друзья);
- за занавесками веб-приложение делегирует много операций внешние сервисы, в течение имя пользователя (эти системы распознают Боба как одного из своих пользователей) - это означает, что мы придется переслать им верительные грамоты Боба.
Итак, как мы идентифицируем Боб (на каждый запрос)? Какой был бы разумный способ реализовать такую вещь?
- игры теннис с учетными данными через HTML форма скрытые поля... элемент мяч содержит учетные данные (имя пользователя и пароль) и две ракетки являются браузер и веб-приложение соответственно. Другими словами, мы можем передавать данные туда и обратно через поля формы, а не через файлы cookie. При каждом веб-запросе браузер публикует учетные данные. Хотя, в случае с одностраничное приложение, это может выглядеть как игра сквош от резиновой стены, вместо того, чтобы играть теннис, как веб-форму содержащие учетные данные могут быть сохранены в течение всего срока службы веб-страницы (и сервер будет настроен не предлагать учетные данные обратно).
- сохранение имени пользователя и пароля в контексте страницы-переменные JavaScript и т. д. Одностраничный требуется здесь, ИМХО.
- зашифрованная аутентификация на основе маркеров. В этом случае действие входа в систему приведет к созданию зашифрованного маркера безопасности (имя пользователя + пароль + что-то еще). Этот токен будет возвращен клиенту, и предстоящие запросы будут сопровождаться токеном. Есть ли в этом смысл? Мы уже есть HTTPS...
- другие...
- в крайнем случае: не делайте этого, храните учетные данные в сеансе! Сессия-это хорошо. С печеньем или без него.
приходит ли вам в голову какая-либо проблема веб / безопасности в отношении какой-либо из ранее описанных идей? Например,
- время-выход - мы можем сохранить метка, вместе с учетными данными (отметка времени = время, когда Боб ввел свои учетные данные). Например, когда теперь-метка времени > порог, мы можем отклонить запрос.
- межсайтовый скриптинг защита-не должна отличаться в любом случае, верно?
Большое Спасибо, что нашли время, чтобы прочитать это:)
2 ответа:
Ах, я люблю эти вопросы-поддержание сессии без сессии.
Я видел несколько способов сделать это во время моего пребывания во время оценки приложений. Одним из популярных способов является играть в теннис способ, который вы упомянули-отправка имени пользователя и пароля в каждом запросе для аутентификации пользователя. Это, на мой взгляд, небезопасно, особенно если приложение не одну страницу. Он также не масштабируется, особенно если вы хотите добавить авторизацию ваше приложение в дополнение к проверке подлинности в будущем (хотя я думаю, вы могли бы построить что-то на основе Логинов)
один популярный, хотя и не полностью апатридный механизм (при условии, что у вас есть выполнение JavaScript) заключается во внедрении cookie сеанса в JavaScript. Парень безопасности во мне кричит на это, но это действительно может сработать - каждый запрос имеет
X-Authentication-Token
заголовок или что-то в этом роде, и вы сопоставляете это с базой данных, файловым хранилищем в памяти и т. д. на задней панели, чтобы проверьте пользователя. Этот маркер может иметь тайм-аут любого указанного времени, и если он истекает, пользователь должен снова войти в систему. Он довольно масштабируемый - если вы храните его в базе данных, его один оператор SQL выполняется, и с правильными индексами, это должно занять очень мало времени для выполнения, даже с несколькими одновременными пользователями. Однако нагрузочное тестирование здесь определенно поможет. Если я правильно прочитаю вопрос, это будет ваш зашифрованный механизм токенов - хотя, я бы настоятельно рекомендовал то, что вы используете криптографически случайный токен, скажем, 32 символа, по сравнению с использованием комбинации username + password + whatever else - таким образом, он остается непредсказуемым, но вы все равно можете связать его с идентификатором пользователя или какой-то такой вещью.в зависимости от того, что вы в конечном итоге используете, убедитесь, что он отправляется вам безопасно. HTTPS защищает вас по всему проводу, но он не защищает вас, если вы пропускаете токен сеанса через URL (или, что еще хуже, учетные данные через URL). Я бы рекомендовал использовать заголовок, или если это невозможно, каждый раз отправляйте токен через запрос POST (это будет означать скрытое поле формы в браузере пользователя.) Последний подход использования запроса POST должен использовать защиту CSRF, на всякий случай, хотя я подозреваю, что использование самого токена может быть своего рода защитой CSRF.
и последнее, но не менее важное: убедитесь, что у вас есть какой-то механизм в бэкэнде для очистки устаревших токенов. Это было проклятием многих приложений в прошлом-быстро растущая база данных маркеры аутентификации, которые никогда не исчезают. Если вам необходимо поддерживать несколько учетных записей пользователей, убедитесь, что вы либо ограничиваете число, либо имеете более короткий срок для каждого маркера. Как я уже говорил, нагрузочное тестирование может быть ответом на это.
есть некоторые другие проблемы безопасности, о которых я могу думать, но они слишком широки, чтобы их можно было решить на этом этапе - если вы помните все случаи использования (и злоупотребления), вы, вероятно, сможете сделать довольно хорошую реализацию этого система.
о опции входа в систему - я думаю, что обычно вы хотите поддерживать сеансы также для гостей.
Итак, если вы хотите принудительно ввести логин, опция зашифрованного токена может быть хорошей. Это может быть хорошо и для гостевой сессии как-то. В другом направлении я бы объединил добавление токена в URL-адрес и вариант тенниса.
обратите внимание, что отправка учетных данных только в URL-адрес может быть опасным. Например, вы можете пропустить токен через заголовок HTTP referer или даже тем, кто просто проверяет ваш трафик или смотрит ваш компьютер.
еще одна вещь, даже если вы могли бы использовать куки, я бы рекомендовал вам добавить случайный токен или случайный верификатор, чтобы защитить себя от атаки на подделку межсайтовых запросов (CSRF).