Дополнительно
Окончательное руководство по аутентификации веб-сайтов на основе форм
Аутентификация на основе форм для веб-сайтов
Мы считаем, что Stack Overflow должен быть не только ресурсом для очень специфических технических вопросов, но и общим руководством по решению вариаций распространенных проблем. "Аутентификация на основе форм для веб-сайтов" должна быть прекрасной темой для такого эксперимента.
Он должен включать такие темы, как:
- Как войти в систему
- Как выйти из системы
- Как оставаться в системе
- Управление файлами cookie (включая рекомендуемые настройки)
- Шифрование SSL/HTTPS
- Как хранить пароли
- Использование секретных вопросов
- Функциональность забытого имени пользователя/пароля
- Использование несов для предотвращения подделки межсайтовых запросов (CSRF)
- OpenID
- флажок "Запомнить меня".
- Автозаполнение имен пользователей и паролей в браузере
- Секретные URL (публичный URL защищен дайджестом)
- Проверка надежности пароля
- Валидация электронной почты
- и многое другое об аутентификации на основе форм...
Он не должен включать такие вещи, как:
- Роли и авторизация
- Базовая аутентификация HTTP
Пожалуйста, помогите нам:
- Предложите подтемы
- Присылайте хорошие статьи на эту тему
- Редактирование официального ответа
5304
12
ЧАСТЬ I: Как войти в систему
Мы'будем считать, что вы уже знаете, как построить HTML-форму логин+пароль, которая передает значения скрипту на стороне сервера для аутентификации. В следующих разделах будут рассмотрены шаблоны для надежной практической аутентификации, а также то, как избежать наиболее распространенных ловушек безопасности. To HTTPS or not to HTTPS? Если соединение не является защищенным (то есть, туннелировано через HTTPS с использованием SSL/TLS), значения вашей формы входа будут отправлены в открытом виде, что позволит любому, кто подслушивает на линии между браузером и веб-сервером, прочитать логины по мере их прохождения. Этот тип прослушки регулярно используется правительствами, но в целом, мы не будем рассматривать 'собственные' провода, кроме как сказать следующее: Просто используйте HTTPS. По сути, единственный практичный способ защиты от прослушки/перехвата пакетов при входе в систему - это использование HTTPS или другой схемы шифрования на основе сертификатов (например, [TLS][1]) или проверенной схемы "вызов-ответ" (например, SRP на основе [Diffie-Hellman][2]). Любой другой метод может быть легко обойден подслушивающим злоумышленником. Конечно, если вы хотите быть немного непрактичным, вы можете использовать какую-либо схему двухфакторной аутентификации (например, приложение Google Authenticator, физическую кодовую книгу в стиле холодной войны или ключ-генератор RSA). При правильном применении это может работать даже при незащищенном соединении, но трудно представить, что разработчик захочет внедрить двухфакторную аутентификацию, но не SSL. (Не) Применять собственное шифрование/хеширование JavaScript. Учитывая предполагаемую (хотя сейчас ее можно избежать[27]) стоимость и техническую сложность установки SSL-сертификата на вашем сайте, некоторые разработчики поддаются искушению внедрить собственные схемы хэширования или шифрования в браузере, чтобы избежать передачи логинов в открытом виде по незащищенному проводу. Хотя это благородная мысль, она бесполезна (и может стать [недостатком безопасности][3]), если не сочетается с одним из вышеперечисленных способов - то есть либо с надежным шифрованием, либо с использованием проверенного механизма "вызов-ответ" (если вы не знаете, что это такое, просто знайте, что это одна из самых труднодоказуемых, самых трудноразрабатываемых и самых труднореализуемых концепций цифровой безопасности). Хотя хэширование пароля действительно может быть эффективно против раскрытия пароля, оно уязвимо для атак повторного воспроизведения, атак типа "человек посередине"/перехвата (если злоумышленник может внедрить несколько байт в вашу незащищенную HTML-страницу до того, как она попадет в ваш браузер, он может просто закомментировать хэширование в JavaScript), или атак перебором (поскольку вы передаете злоумышленнику и имя пользователя, и соль, и хэшированный пароль). Каптча против человечества [CAPTCHA][4] предназначена для предотвращения одной конкретной категории атак: автоматизированных атак по словарю/перебором без участия человека. Несомненно, это реальная угроза, однако существуют способы борьбы с ней, которые не требуют использования CAPTCHA, в частности, правильно разработанные схемы дросселирования входа на стороне сервера - о них мы поговорим позже. Знайте, что реализации CAPTCHA не одинаковы; они часто не решаемы человеком, большинство из них неэффективны против ботов, все они неэффективны против дешевой рабочей силы из стран третьего мира (согласно [OWASP][5], текущая ставка потогонного труда составляет $12 за 500 тестов), а некоторые реализации могут быть технически незаконными в некоторых странах (см. [OWASP Authentication Cheat Sheet][6]). Если вы должны использовать CAPTCHA, используйте Google [reCAPTCHA][7], так как он по определению является OCR-трудным (поскольку использует уже OCR-мисслессифицированные сканы книг) и очень старается быть удобным для пользователя. Лично я считаю CAPTCHA раздражающими, и использую их только в крайнем случае, когда пользователь не смог войти в систему несколько раз, а задержки дросселирования максимальны. Это происходит достаточно редко, чтобы быть приемлемым, и это укрепляет систему в целом. Хранение паролей / проверка логинов. Возможно, это уже стало общеизвестным после всех широко разрекламированных взломов и утечек пользовательских данных, которые мы наблюдали в последние годы, но об этом необходимо сказать: Не храните пароли в открытом виде в вашей базе данных. Базы данных пользователей регулярно взламываются, утекают или перехватываются с помощью SQL-инъекций, и если вы храните пароли в открытом виде, это означает, что безопасность входа в систему мгновенно нарушена. Итак, если вы не можете хранить пароль, как проверить, что комбинация логин+пароль, отправленная из формы входа, верна? Ответ - хэшированием с использованием [функции выведения ключа][24]. Каждый раз, когда создается новый пользователь или меняется пароль, вы берете пароль и прогоняете его через KDF, такую как Argon2, bcrypt, scrypt или PBKDF2, превращая пароль в открытом виде ("correcthorsebatterystaple") в длинную, случайно выглядящую строку, которую гораздо безопаснее хранить в базе данных. Для проверки входа в систему вы запускаете ту же хэш-функцию для введенного пароля, на этот раз с добавлением соли, и сравниваете полученную хэш-строку со значением, хранящимся в вашей базе данных. Argon2, bcrypt и scrypt уже хранят соль вместе с хэшем. Более подробную информацию можно найти в этой [статье][23] на sec.stackexchange. Причина использования соли заключается в том, что хэширования самого по себе недостаточно - вам нужно добавить так называемую 'соль' для защиты хэша от [радужных таблиц][8]. Соль эффективно предотвращает хранение двух точно совпадающих паролей в виде одного и того же хэш-значения, предотвращая сканирование всей базы данных за один запуск, если злоумышленник выполняет атаку угадывания пароля. Криптографический хэш не следует использовать для хранения паролей, поскольку выбранные пользователем пароли недостаточно надежны (т.е. обычно не содержат достаточной энтропии), и атака на угадывание пароля может быть выполнена за относительно короткое время злоумышленником, имеющим доступ к хэшам. Именно поэтому используются KDF - они эффективно ["растягивают ключ"][25], что означает, что каждое угадывание пароля злоумышленником приводит к многократному повторению алгоритма хэширования, например, 10 000 раз, что заставляет злоумышленника угадывать пароль в 10 000 раз медленнее. Данные сессии - "Вы вошли в систему как Spiderman69"**. После того как сервер проверил логин и пароль по вашей базе данных пользователей и нашел совпадение, системе необходимо запомнить, что браузер прошел аутентификацию. Этот факт должен храниться только на стороне сервера в данных сессии.
Определяющая статья
Отправка учетных данных
Единственный практический способ 100% безопасной отправки учетных данных - это использование [SSL][1]. Использование JavaScript для хэширования пароля небезопасно. Общие подводные камни при хешировании пароля на стороне клиента:
Хранение паролей
Никогда не храните пароли в базе данных в виде открытого текста. Даже если вы не заботитесь о безопасности своего сайта. Предположим, что некоторые из ваших пользователей будут повторно использовать пароль от своего банковского счета в Интернете. Поэтому храните хэшированный пароль, а оригинал выбросьте. И убедитесь, что пароль не отображается в журналах доступа или журналах приложений. OWASP рекомендует использовать Argon2 в качестве первого выбора для новых приложений. Если он недоступен, вместо него следует использовать PBKDF2 или scrypt. И наконец, если ничего из вышеперечисленного не доступно, используйте bcrypt. Сами по себе хэши также небезопасны. Например, одинаковые пароли означают одинаковые хэши - это делает таблицы поиска хэшей эффективным способом взлома множества паролей одновременно. Вместо этого храните соленый хэш. Соль - это строка, добавляемая к паролю перед хэшированием - используйте разную (случайную) соль для каждого пользователя. Соль - это публичное значение, поэтому вы можете хранить его вместе с хэшем в базе данных. Подробнее об этом смотрите здесь. Это означает, что вы не можете отправить пользователю его забытый пароль (потому что у вас есть только хэш). Не сбрасывайте пароль пользователя, пока не проведете аутентификацию пользователя (пользователи должны доказать, что они могут читать письма, отправленные на сохраненный (и проверенный) адрес электронной почты).
Вопросы безопасности
Вопросы безопасности небезопасны - избегайте их использования. Почему? Все, что делает вопрос безопасности, пароль делает лучше. Читайте ЧАСТЬ III: Использование секретных вопросов в [ответе @Jens Roland][6] здесь, в этой вики.
Куки сеанса
После того как пользователь вошел в систему, сервер посылает ему сессионный файл cookie. Сервер может получить имя пользователя или id из куки, но никто другой не может сгенерировать такие куки (TODO объясняет механизмы). [Cookies могут быть перехвачены][7]: они защищены только так же, как остальная часть машины клиента и другие коммуникации. Они могут быть считаны с диска, перехвачены в сетевом трафике, перехвачены атакой межсайтового скриптинга, подделаны из отравленного DNS, так что клиент отправляет свои куки на неправильные серверы. Не отправляйте постоянные файлы cookie. Срок действия cookies должен истекать по окончании сеанса клиента (закрытие браузера или выход из вашего домена). Если вы хотите автологинить своих пользователей, вы можете установить постоянный cookie, но он должен отличаться от полносеансного cookie. Вы можете установить дополнительный флаг о том, что пользователь автологинился, и для выполнения важных операций ему необходимо войти в систему по-настоящему. Это популярно среди торговых сайтов, которые хотят предоставить вам беспрепятственный, персонализированный опыт покупок, но при этом защитить ваши финансовые данные. Например, когда вы возвращаетесь на сайт Amazon, он показывает вам страницу, которая выглядит так, будто вы вошли в систему, но когда вы переходите к оформлению заказа (или меняете адрес доставки, кредитную карту и т.д.), он просит вас подтвердить пароль. С другой стороны, финансовые веб-сайты, такие как банки и кредитные карты, содержат только конфиденциальные данные и не должны допускать автологин или режим низкой безопасности.
Список внешних ресурсов
Во-первых, сразу предупреждаем, что этот ответ не является лучшим для данного вопроса. Он определенно не должен быть главным ответом!
Я продолжу и упомяну предложенный Mozilla BrowserID (или, возможно, более точно, Verified Email Protocol) в духе поиска пути обновления к лучшим подходам к аутентификации в будущем.
Я резюмирую это следующим образом:
@
domain" лаконична и поддерживается широким спектром протоколов и схем URI. Такой идентификатор, конечно, наиболее универсально распознается как адрес электронной почты.Это не совсем "аутентификация на основе форм для веб-сайтов". Но это попытка перейти от нынешней нормы аутентификации на основе форм к чему-то более надежному: аутентификации с поддержкой браузера.
Я просто думал I' d разделяют это решение, которое я нашел, чтобы работать просто великолепно.
Я называю его Фиктивная Область (хотя я haven' t изобрел это так don' t верят мне).
Короче говоря: Вы просто должны вставить это в свой '< form>'; и проверьте на него, чтобы быть пустыми в, утверждая:
Уловка должна дурачить личинку, заставляя думать, она должна вставить данные в обязательное поле, that' s, почему я назвал вход " email". если у Вас уже есть область, названная электронной почтой это you' ре используя Вас должно попытаться назвать куклу, выставляют что-то еще как " company" " phone" или " emailaddress". просто выберите что-то, что Вы знаете Вас don' t потребность и что походит на что-то, люди обычно находили бы логичным, чтобы заполнить в веб-форму. Теперь скройте 'входную' область, использующую CSS или JavaScript/jQuery - безотносительно судорог Вы лучше всего - просто don' t устанавливает вход 'тип' в 'скрытый' или иначе личинку won' t попадаются на него.
Когда Вы утверждаете форму (или клиент или сторона сервера) проверка, если Ваша фиктивная область была заполнена, чтобы определить, послали ли это человек или личинка.
Пример:
В случае человека: Пользователь не будет видеть фиктивную область (в моем случае, названном " email") и не попытается заполнить его. Таким образом, ценность фиктивной области должна все еще быть пустой, когда форму послали.
В случае личинки: Личинка будет видеть область, тип которой - 'текст' и имя 'электронная почта' (или независимо от того, что это - Вы, назвал его), и логически попытается заполнить его соответствующими данными. Это doesn' t заботятся, разработали ли Вы входную форму с некоторым необычным CSS, веб-разработчики делают все это время. Независимо от того, что стоимость в фиктивной области, мы don' t заботятся о целом it' s больше, чем '0' знаки.
Я использовал этот метод на гостевой книге в сочетании с КАПЧОЙ, и я haven' t замеченный единственная почта спама с тех пор. Я использовал решение ТОЛЬКО ДЛЯ КАПЧИ прежде, но в конечном счете, оно приводило приблизительно к пяти постам спама каждый час. Добавление фиктивной области в форме остановило (по крайней мере, до сих пор) весь спам от появления.
Я полагаю, что это может также использоваться очень хорошо с формой логина/идентификации.
Предупреждение : Конечно, этот метод не на 100% надежный. Личинки могут быть запрограммированы, чтобы проигнорировать поля ввода со стилем 'display:none', относился к нему. Вы также должны думать о людях, которые используют некоторую форму автозавершения (как большинство браузеров, имеют встроенный!), чтобы автозаполнить все области формы для них. Они могли бы точно также взять фиктивную область.
Вы можете также изменить это немного, оставив фиктивную область видимой, но вне границ экрана, но это полностью ваше дело.
Будьте творческими!
Я не думаю, что вышеупомянутый ответ - " wrong" но есть большие площади идентификации, которые не затронуты (или скорее акцент находится на " как осуществить печенье sessions" не на " какие варианты доступны и что является trade-offs".
Мой предложенный редактирует/отвечает,
Это избегает любой потребности иметь " sessions" или печенье как сам браузер повторно зашифрует коммуникацию каждый раз. Это - большая часть " lightweight" подход развития.
Однако я не рекомендую это, за исключением общественных, услуг низкой стоимости. Это - проблема с некоторыми из других ответов выше - не пробуют идентификацию стороны сервера переорудия механизмы - эта проблема была решена и поддержана большинством главных браузеров. Не используйте печенье. Ничего не храните в своей собственной скрученной вручную базе данных. Просто спросите за запрос, если запрос заверен. Все остальное должно быть поддержано конфигурацией, и третье лицо доверяло программному обеспечению.
Так...
Во-первых, мы путаем начальное создание счета (с паролем) с перепроверкой пароля впоследствии. Если я - Flickr и создание Вашего сайта впервые, у нового пользователя есть доступ к нулевой стоимости (чистое интернет-пространство). Я действительно не забочусь, лжет ли человек, создающий счет, об их имени. Если я создаю счет больницы intranet/extranet, стоимость находится во всей медицинской документации, и таким образом, я делаю забота об идентичности (*) создателя счета.
Это - очень очень твердая часть. только достойное решение - паутина доверия. Например, Вы присоединяетесь к больнице как доктор. Вы создаете веб-страницу, принятую где-нибудь с Вашей фотографией, Вашим номером паспорта и открытым ключом, и крошите их всех с частным ключом. Вы тогда посещаете больницу, и системный администратор смотрит на Ваш паспорт, видит, соответствует ли фотография Вам, и затем крошит веб-страницу / фото мешанина с больницей частный ключ. С этого времени мы можем надежно обменять ключи и символы. Как может любой, кто доверяет больнице (есть секретный соус BTW). Системный администратор может также дать Вам защитную заглушку [RSA] [2] или другую двухфакторную аутентификацию.
Но это партия стычки, и не очень web 2.0. Однако это - единственный безопасный способ создать новые счета, у которых есть доступ к ценной информации, которая не самостоятельно создана.
Kerberos и SPNEGO - единственные механизмы входа в систему с доверенной третьей стороной - в основном пользователь проверяют против доверенной третьей стороны. (NB это ни в коем случае не, чтобы не доверяться OAuth),
SRP - вид умной идентификации пароля без доверенной третьей стороны. Но здесь мы входим в сферы " it' s более безопасный использовать двухфакторную аутентификацию, даже если that' s costlier"
Сторона SSL клиента - дает клиентам свидетельство открытого ключа (поддержка во всех главных браузерах - но вызывает вопросы по машинной безопасности клиента).
В конце, it' s компромисс - что является стоимостью нарушения правил безопасности против стоимости осуществления более безопасных подходов. Однажды, мы можем видеть надлежащий PKI, широко принятый и так больше собственных кативших форм идентификации и баз данных. Однажды...
[2]: http://en.wikipedia.org/wiki/RSA _ % 28security_firm%29
Хорошая статья о реалистической оценке силы пароля:
Кроша, don' t используют быстрые алгоритмы хеширования, такие как MD5 (много внедрений аппаратных средств существуют). Используйте что-то как SHA-512. Для паролей более медленные мешанины лучше.
Чем быстрее Вы можете создать мешанины, тем быстрее любой контролер грубой силы может работать. Более медленные мешанины поэтому замедлят грубое принуждение. Медленный алгоритм хеширования сделает грубое принуждение непрактичным для более длительных паролей (8 цифр +)
Мое любимое правление в отношении систем идентификации: используйте пароли, не пароли. Легкий помнить, трудно расколоться. Больше информации: Кодирование Ужаса: Пароли против Фраз Прохода
I' d нравится добавлять одно предложение I' используемый ve, на основе защиты подробно. Вы don' у t должен быть тот же auth& подлинная система для администраторов как постоянные пользователи. У Вас может быть отдельная форма логина на отдельном URL, выполняющем отдельный код для запросов, которые предоставят высокие привилегии. Этот может сделать выбор, который был бы полной болью постоянным пользователям. Один таким образом, что I' используемый ve должен на самом деле зашифровать URL логина для доступа администратора и послать администратору по электронной почте новый URL. Остановки любое нападение грубой силы сразу же как Ваш новый URL могут быть произвольно трудными (очень длинная случайная последовательность), но Ваш администратор user' s только неудобство переходит по ссылке в их электронном письме. Нападавший больше не знает, где даже ОТПРАВИТЬ.
Я dont' t знают, было ли лучше ответить на это как на ответ или как комментарий. Я выбрал право преимущественной покупки.
Относительно открытия ЧАСТЬ IV: Функциональность Забытого пароля в первом ответе, я высказал бы мнение о Выборе времени Нападений.
В Помнят Ваш пароль формы, нападавший мог потенциально проверить полный список электронных писем и обнаружить, которые зарегистрированы к системе (см. ссылку ниже).
Относительно Формы Забытого пароля я добавил бы, что это - хорошая идея равняться временам между успешными и неудачными вопросами с некоторой функцией задержки.
https://crypto.stanford.edu / ~ dabo/papers/webtiming.pdf
Я хотел бы добавить один очень важный комментарий: -
Многие корпорации развертывают " внутреннее пользование only" веб-сайты, которые являются, эффективно, " корпоративный applications" это, оказывается, было осуществлено через URL. Эти URL могут (предположительно...) только быть решенными в " company' s внутренняя сеть " (Какая сеть волшебно включает все VPN-связанный ' дорожные воины ')
Когда пользователь покорно связан с вышеупомянутой сетью, их идентичность (" authentication") [уже...] " окончательно известный, " как их разрешение (" authorization") , чтобы сделать определенные вещи... такой как... " получить доступ к этому веб-сайту "
Этот " идентификация + authorization" услуга может быть предоставлена несколькими различными технологиями, такими как LDAP (Microsoft OpenDirectory) , или Kerberos.
С Вашей точки зрения Вы просто знаете это: это любой, кто законно ветры на Вашем веб-сайте должны сопровождаться [переменная окружения, волшебно содержащая...] " символ " (i.e. Отсутствие такого символа должно быть непосредственными основаниями для '404, Не Найденных'.)
token' s стоимость не имеет никакого смысла Вам, но, должен потребность возникать, " соответствующий означает exist" которым Ваш веб-сайт может " [авторитетно] спросите кого-то, кто знает (LDAP... и т.д.)" о любом и каждый (!) вопрос, который Вы можете иметь. Другими словами, Вы делаете не , пользуются любой " отечественная логика " Вместо этого Вы спрашиваете о Властях и слепо доверяете его вердикту.
Ага... it' s вполне умственный выключатель от " дикий-и-покрытый-шерстью Интернет "
Используйте OpenID соединяются или управляемый пользователями доступ.
Поскольку ничто не более эффективно, чем не выполнение его вообще.