Иногда, я сталкиваюсь с определенными платформами веб-разработки, которые не обеспечивают функцию аутентификации, такой как в Аутентификации ASP.NET.
Я задавался вопросом, какие меры безопасности нужно рассмотреть, когда реализация "Помнит Меня" функции входа в систему ручным кодированием?
Вот вещи, которые я обычно делаю:
Сохраните имя пользователя в cookie. Имя пользователя не шифруется.
Сохраните секретный ключ в cookie. Секретный ключ сгенерирован с помощью одного пути функция на основе имени пользователя. Сервер проверит секретный ключ против имени пользователя, чтобы гарантировать, что это имя пользователя не изменяется.
Используйте HttpOnly в cookie. http://www.codinghorror.com/blog/2008/08/protecting-your-cookies-httponly.html
Что-либо еще, что я пропустил, который мог возможно привести дыры в системе безопасности?
Cookie всегда должен быть случайным значением, срок действия которого истекает. Существуют случаи, когда вы можете хранить состояние как значение cookie и это не будет представлять угрозу безопасности, например, предпочитаемый язык пользователя, но этого следует избегать как можно чаще. Включение HttpOnlyCookies - отличная идея.
Прочитайте раздел A3: "Нарушенная аутентификация и управление сеансами" в OWASP top 10 за 2010 год. Один важный момент в этом разделе - https должен использоваться в течение всей сессии. Если сессия длится очень долго, то это еще более важно.
Также следует помнить, что "Remember Me" создает большое окно, в котором злоумышленник может "оседлать" сессию. Это дает злоумышленнику очень длительное время (месяцы?), в течение которого он может осуществить CSRF-атаку. Даже если у вас есть защита от CSRF, злоумышленник все равно может воспользоваться сессией с помощью XSS и XmlHttpRequest (HttpOnlyCookies предотвратит полный перехват). "Remember Me" делает другие угрозы, такие как xss, csrf, сниффинг, более серьезными. Если эти уязвимости были устранены, то у вас не должно быть проблем с реальными хакерами.
Самый простой (и безопасный) подход к реализации функции "запомнить меня" заключается в изменении тайм-аута сессии в файле web.config:
<configuration>
<system.web>
<sessionState timeout="60"/>
</sessionState>
</system.web>
</configuration>
Установите тайм-аут на что-то большое, может быть месяц или около того. Если флажок "Запомнить меня" снят, то сохраните переменную сессии с более нормальным таймаутом (например, 24 часа). Проверьте эту переменную сессии в заголовочном файле для каждого запроса. Если флажок установлен, действуйте нормально и позвольте asp.net позаботиться об этом.
Если срок действия сессии не истек, то перебор будет намного проще. Эти значения велики, но позволить хакеру потратить годы на попытки угадать идентификатор сессии - это уязвимость.