Подтвердить что ты не робот

Лучшая практика для внедрения Secure "Запомнить меня"

Иногда я сталкиваюсь с определенными платформами веб-разработки, которые не предоставляют функцию проверки подлинности, например, в Authentication ASP.NET.

Мне было интересно, какие меры безопасности необходимо учитывать при внедрении функций входа "Запомнить меня" вручную?

Вот что я обычно делаю:

  • Сохраните имя пользователя в cookie. Имя пользователя не зашифровано.

  • Храните секретный ключ в файле cookie. Секретный ключ генерируется с использованием односторонней функции, основанной на имени пользователя. Сервер будет проверять секретный ключ от имени пользователя, чтобы гарантировать, что это имя пользователя не изменяется.

  • Используйте HttpOnly в cookie. http://www.codinghorror.com/blog/2008/08/protecting-your-cookies-httponly.html

Что-нибудь еще я пропустил, что может привести к дырам в безопасности?

4b9b3361

Ответ 1

Файл cookie всегда должен быть случайным значением, которое истекает. Бывают случаи, когда вы можете сохранить состояние как значение cookie, и это не будет опасным, например, предпочитаемым пользователем языком, но этого следует избегать как можно больше. Превращение HttpOnlyCookies в, отличная идея.

Прочитайте A3: "Сломанная аутентификация и управление сеансами" в OWASP топ-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 позаботится об этом.

Если сеанс не истекает, это будет намного проще для грубой силы. Эти значения большие, но позволяют хакеру потратить годы, пытаясь угадать идентификатор сеанса, является уязвимостью.