Подробное руководство по аутентификации веб-сайтов на основе форм

Аутентификация на основе форм для веб-сайтов

Мы считаем, что Stack Overflow должен быть источником не только для очень конкретных технических вопросов, но и для общих рекомендаций по решению вариантов решения общих проблем. «Аутентификация на основе форм для веб-сайтов» должна стать хорошей темой для такого эксперимента.

Он должен включать такие темы, как:

  • Как войти
  • Как выйти
  • Как оставаться в системе
  • Управление файлами cookie (включая рекомендуемые настройки)
  • SSL / HTTPS шифрование
  • Как хранить пароли
  • Использование секретных вопросов
  • Функция забытого имени пользователя / пароля
  • Использование одноразовых номеров для предотвращения подделка межсайтовых запросов (CSRF)
  • OpenID
  • Флажок "Запомнить меня"
  • Браузерное автозаполнение логинов и паролей
  • Секретные URL-адреса (общедоступные URL, защищенные дайджестом)
  • Проверка надежности пароля
  • Подтверждение электронной почты
  • и многое другое об аутентификации на основе форм ...

Он не должен включать такие вещи, как:

  • Роли и авторизация
  • Базовая аутентификация HTTP

Пожалуйста, помогите нам:

  1. Предлагаем подтемы
  2. Отправка хороших статей на эту тему
  3. Редактирование официального ответа

person Community    schedule 02.08.2008    source источник
comment
Зачем исключать базовую аутентификацию HTTP? Он может работать в формах HTML через Ajax: http://www.peej.co.uk/articles/http-auth-with-html-forms.html.   -  person system PAUSE    schedule 26.06.2009
comment
HTTP Basic Auth имеет свойство (сравнительно) трудно заставить браузер забыть об этом. Это также ужасно небезопасно, если вы не используете его с SSL для защиты соединения (например, HTTPS).   -  person Donal Fellows    schedule 15.06.2010
comment
Я думаю, что стоит поговорить о сеансах (включая фиксацию и захват), cookie (флаги безопасности и только http) SSO на основе HTTP   -  person symcbean    schedule 20.06.2011
comment
Key Stretching для уменьшения атак по словарю, если ваши пароли компрометируются - en.wikipedia.org/wiki/Key_strengthing   -  person James    schedule 08.08.2011
comment
Также следует где-то упомянуть суперполезный флаг HttpOnly cookie, который предотвращает кражу файлов cookie на основе JavaScript (подмножество атак XSS).   -  person Alan H.    schedule 09.08.2011
comment
Вероятно, у нас должен быть тег лучших практик или что-то подобное для отличных вопросов и ответов, подобных этому.   -  person ptman    schedule 09.08.2011
comment
Я голосую за закрытие, потому что считаю, что этот вопрос в его текущем состоянии не подходит для формата SO. Один длинный ответ, который все редактируют, кажется совершенно неправильным. Вместо этого я бы переформатировал его в небольшой полезные куски, как в этом вопросе (самый популярный вопрос о программистах).   -  person Dan Abramov    schedule 10.08.2011
comment
Вот это да. Длинные ответы, десятки голосов за некоторые из них, но никто не упоминает о распространенной ошибке обслуживания форм входа через HTTP. Я даже спорил с людьми, которые говорили, что он отправляется на https: // ... и смотрели пустым взглядом только тогда, когда я спросил, уверены ли они, что злоумышленник не переписал незашифрованную страницу, на которой была отправлена ​​форма.   -  person dzuelke    schedule 09.11.2012
comment
Хороший замечание @dzuelke, не говоря уже о том, что у пользователя нет прямого способа проверить, что его конфиденциальные данные будут переданы через безопасное соединение на надежный сервер (я имею в виду, проверка сертификата сервера)   -  person idelvall    schedule 09.02.2016
comment
github.com/FallibleInc/security-guide-for-developers - хороший ссылка   -  person Matt Kocaj    schedule 22.07.2016
comment
Предлагается переместить вопрос в SO Documentation meta.stackoverflow.com/questions/332092/   -  person Michael Freidgeim    schedule 18.12.2016
comment
Как насчет использования времени, необходимого для заполнения формы? Следует провести небольшое исследование, представить веб-сайт таким ботам, как мясо, и оценить время, необходимое для заполнения формы и отправки. Должно быть меньше секунды. Затем посмотрите, сколько времени нужно пользователям-людям. Просто возьмите среднее значение или даже сделайте байесовскую классификацию, чтобы отличить одно от другого ...   -  person Chris Pillen    schedule 23.05.2017
comment
@ChrisPillen Какое-то время люди могли определить, был ли пользователь ботом, потому что при перемещении, чтобы щелкнуть кнопку ввода, бот сначала шел вниз, а затем прямо поперек. Люди, конечно, движутся по странным, псевдослучайным диагональным линиям. Поэтому авторы-боты в ответ заставили своих ботов двигаться по странным, псевдослучайным диагональным линиям. Если вы можете запрограммировать свой сайт на ожидаемое поведение, кто-то может запрограммировать своего бота на такое поведение; это просто гонка вооружений. Гораздо лучше полагаться на вещи, которые для компьютеров невозможно доказать.   -  person Lord Farquaad    schedule 03.10.2017
comment
@LordFarquaad Я понимаю это. Но это означает, что есть несколько писателей-ботов, которые не прилагают усилий. А время особенное. Потому что писатель-бот должен создавать временные петли. Это означает, что авторам ботов нужно больше времени для запуска своих ботов. Что, в некоторых случаях, разрушит их бизнес-модель.   -  person Chris Pillen    schedule 06.10.2017
comment
@Chris Части VI и VII в регулировке верхнего адреса ответа, поэтому время влияет независимо. Я считаю, что вычисление некоторого числа, которое человек, вероятно, не сможет превзойти, идет вразрез с одним из принципов безопасности, а именно: вы не должны пытаться перехитрить бота. Это правда, что если вы достаточно умны, вы можете победить большинство ботов, но участие в такой гонке вооружений обычно означает, что у вас есть фундаментальный недостаток где-то еще. Гораздо лучше устранить этот недостаток, чем пытаться оставаться на шаг впереди, потому что рано или поздно бот опередит вас, а им нужно сделать это только один раз.   -  person Lord Farquaad    schedule 10.10.2017
comment
Хотя чтение увлекательное, тема действительно слишком широка. Безопасность - это игра в кошки-мышки. Хакеры все время находят новые дыры, которые закроет новая система безопасности, и наоборот. Еще не упомянуто в ответах: проверка поведения. Например. Google будет время от времени запрашивать ваш пароль, особенно если вы делаете неожиданные вещи. Так что используйте бесконтактные банковские карты, если вы платите в магазине или городе, где вас раньше не видели.   -  person Roland    schedule 27.03.2018


Ответы (11)


PART I: How To Log In

Предположим, вы уже знаете, как создать HTML-форму для входа в систему и пароля, которая отправляет значения POST в сценарий на стороне сервера для аутентификации. В следующих разделах будут рассмотрены шаблоны для надежной практической аутентификации и способы избежать наиболее распространенных ошибок безопасности.

На HTTPS или не на HTTPS?

Если соединение уже не является безопасным (то есть туннелировано через HTTPS с использованием SSL / TLS), значения вашей формы входа (вздох! Включая ваш пароль) будут отправлены в виде открытого текста, что позволит любому, кто прослушивает линию между браузером и веб-сервером, будет может читать логины по мере их прохождения. Этот тип прослушки регулярно осуществляется правительствами, но в целом мы не будем обращаться к «собственным» проводам, кроме как сказать следующее: просто используйте HTTPS.

По сути, единственный практический способ защиты от прослушивания телефонных разговоров / перехвата пакетов во время входа в систему - это использование HTTPS или другой схемы шифрования на основе сертификатов (например, TLS) или проверенная и проверенная схема запрос-ответ (например, SRP на основе Диффи-Хеллмана). Любой другой метод может быть легко обойден злоумышленником.

Конечно, если вы хотите стать немного непрактичным, вы также можете использовать какую-либо форму двухфакторной схемы аутентификации (например, приложение Google Authenticator, физическую кодовую книгу в стиле холодной войны или ключ генератора ключей RSA). При правильном применении это может работать даже при незащищенном соединении, но трудно представить, что разработчик захочет реализовать двухфакторную аутентификацию, но не SSL.

(Запрещается) применять собственное шифрование / хеширование JavaScript

Учитывая предполагаемые (хотя сейчас которых можно избежать) стоимость и технические сложности установки сертификата SSL на вашем веб-сайте, некоторые разработчики соблазнялись использовать собственные схемы хеширования или шифрования в браузере, чтобы избежать передачи открытого текста по незащищенному проводу.

Хотя это благородная мысль, она по сути бесполезна (и может быть недостаток безопасности), если он не сочетается с одним из вышеперечисленных, т. е. либо обеспечение безопасности линии с помощью надежного шифрования, либо использование проверенного механизма запроса-ответа (если вы этого не сделаете) не знаю, что это такое, просто знайте, что это одна из самых трудных для доказательства, самых трудных для разработки и самых сложных концепций в области цифровой безопасности).

Хотя это правда, что хеширование пароля может быть эффективным против раскрытия пароля, оно уязвимо для повторных атак, атак / перехватов Man-In-The-Middle (если злоумышленник могут вставить несколько байтов в вашу незащищенную HTML-страницу до того, как она попадет в ваш браузер, они могут просто закомментировать хеширование в JavaScript) или атаки методом перебора (поскольку вы передаете злоумышленнику и имя пользователя, и соль, и хешированный пароль).

КАПЧАС против человечности

CAPTCHA предназначена для предотвращения одной конкретной категории атак: автоматизированный словарь / метод грубой силы. ошибка без человека-оператора. Нет никаких сомнений в том, что это реальная угроза, однако есть способы беспрепятственно с ней справиться, не требующие CAPTCHA, специально разработанные схемы регулирования входа на стороне сервера - мы обсудим их позже.

Знайте, что реализации CAPTCHA не созданы одинаково; они часто не поддаются решению человека, большинство из них на самом деле неэффективны против ботов, все они неэффективны против дешевой рабочей силы из стран третьего мира (согласно OWASP, текущий тариф составляет 12 долларов за 500 тестов), а некоторые реализации могут быть технически незаконными в некоторых странах (см. Памятка по аутентификации OWASP).

CAPTCHA вредны для слабовидящих. Традиционную копию было практически невозможно завершить даже людям с идеальным зрением 20/20 с первой попытки. Так что не используйте традиционную капчу!

Если вам необходимо использовать CAPTCHA, используйте reCAPTCHA Google, так как она по определению затрудняет распознавание текста ( поскольку он использует сканированные книги, уже неправильно классифицированные с помощью оптического распознавания символов) и очень старается сделать его удобным для пользователя.

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

Сохранение паролей / проверка логинов

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

Итак, если вы не можете сохранить пароль, как проверить правильность комбинации логина и пароля, отправленной из формы входа в систему? Ответ - хеширование с использованием функции получения ключа. Всякий раз, когда создается новый пользователь или изменяется пароль, вы берете пароль и запускаете его через KDF, например Argon2, bcrypt, scrypt или PBKDF2, превращая пароль в открытом виде (правильная лошадь-аккумулятор) в длинную строку произвольного вида, которая намного безопаснее хранить в вашей базе данных. Чтобы проверить логин, вы запускаете ту же хеш-функцию для введенного пароля, на этот раз передавая соль и сравнивая полученную хеш-строку со значением, хранящимся в вашей базе данных. Argon2, bcrypt и scrypt уже хранят соль с хешем. Ознакомьтесь с этой статьей на sec.stackexchange для получения более подробной информации.

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

Криптографический хэш не следует использовать для хранения паролей, поскольку выбранные пользователем пароли недостаточно надежны (т.е. обычно не содержат достаточной энтропии), и атака с подборами пароля может быть завершена за относительно короткое время злоумышленником, имеющим доступ к хешам. Вот почему используются KDF - они эффективно растягивают ключ, что означает, что каждый пароль угадывает злоумышленник вызывает многократное повторение алгоритма хеширования, например 10 000 раз, в результате чего злоумышленник угадывает пароль в 10 000 раз медленнее.

Данные сеанса - вы вошли как Spiderman69

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

Если вы не знакомы с данными сеанса, вот как это работает: одна случайно сгенерированная строка сохраняется в cookie с истекающим сроком действия и используется для ссылки на коллекцию данных - данные сеанса, которые хранятся на сервере. Если вы используете фреймворк MVC, это, несомненно, уже обработано.

Если это возможно, убедитесь, что для файла cookie сеанса установлены флаги безопасности и Только HTTP при отправке в браузер. Флаг HttpOnly обеспечивает некоторую защиту от чтения файла cookie в результате атаки XSS. Флаг безопасности гарантирует, что cookie отправляется обратно только через HTTPS, и, следовательно, защищает от атак сетевого сниффинга. Ценность файла cookie не должна быть предсказуемой. Если представлен файл cookie, указывающий на несуществующий сеанс, его значение следует немедленно заменить, чтобы предотвратить фиксацию сеанса.

Состояние сеанса также может поддерживаться на стороне клиента. Это достигается с помощью таких методов, как JWT (JSON Web Token).

PART II: How To Remain Logged In - The Infamous "Remember Me" Checkbox

Постоянные файлы cookie для входа (функция «запомни меня») представляют собой опасную зону; с одной стороны, они так же безопасны, как и обычные входы в систему, когда пользователи понимают, как с ними обращаться; и, с другой стороны, они представляют собой огромную угрозу безопасности в руках неосторожных пользователей, которые могут использовать их на общедоступных компьютерах и забыть выйти из системы, и которые могут не знать, что такое файлы cookie браузера или как их удалить.

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

Конечно, некоторые системы не могут позволить себе взлом каких-либо учетных записей; для таких систем невозможно оправдать постоянный вход в систему.

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

  1. Сначала найдите время, чтобы прочитать статью Paragon Initiative по теме. Вам нужно будет правильно изложить кучу элементов, и статья прекрасно объясняет каждый из них.

  2. И просто повторим одну из самых распространенных ошибок: НЕ СОХРАНЯЙТЕ НАСТОЯЩИЙ COOKIE (ЖЕТОН) В СВОЕЙ БАЗЕ ДАННЫХ, ТОЛЬКО ЕГО ХЕШ! Токен входа в систему эквивалентен паролю, поэтому, если злоумышленник получил попав в вашу базу данных, они могут использовать токены для входа в любую учетную запись, как если бы они были комбинациями логина и пароля в открытом виде. Поэтому используйте хеширование (согласно https://security.stackexchange.com/a/63438/5002 слабой hash отлично подойдет для этой цели) при хранении постоянных токенов входа.

PART III: Using Secret Questions

Не задавайте «секретные вопросы». Функция «секретные вопросы» - это анти-шаблон безопасности. Прочтите статью по ссылке 4 из списка ДОЛЖНО ПРОЧИТАТЬ. Вы можете спросить об этом Сару Пэйлин после ее Yahoo! учетная запись электронной почты была взломана во время предыдущей президентской кампании, потому что ответ на ее секретный вопрос был ... Средняя школа Василлы!

Даже если у вас есть вопросы, заданные пользователем, весьма вероятно, что большинство пользователей выберут либо:

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

  • Простая мелочь, которую каждый может извлечь из своего блога, профиля LinkedIn или подобного.

  • Любой вопрос, на который легче ответить, чем угадать пароль. Что для любого приличного пароля - это любой вопрос, который вы можете себе представить.

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

Истинная причина, по которой вопросы безопасности вообще существуют, заключается в том, что они позволяют сэкономить на стоимости нескольких звонков в службу поддержки от пользователей, которые не могут получить доступ к своей электронной почте, чтобы получить код повторной активации. Это за счет безопасности и репутации Сары Пэйлин. Стоило того? Возможно нет.

PART IV: Forgotten Password Functionality

Я уже упоминал, почему вы не должны никогда не использовать контрольные вопросы для работы с забытыми / утерянными паролями пользователей; Само собой разумеется, что вы никогда не должны отправлять пользователям их настоящие пароли по электронной почте. В этой области следует избегать как минимум двух слишком распространенных ошибок:

  1. Не сбрасывайте забытый пароль на автоматически сгенерированный надежный пароль - такие пароли, как известно, трудно запомнить, а это означает, что пользователь должен либо изменить его, либо записать - скажем, на ярко-желтом стикере. на краю их монитора. Вместо того, чтобы устанавливать новый пароль, просто позвольте пользователям сразу выбрать новый - это то, что они хотят сделать в любом случае. (Исключением может быть случай, если пользователи повсеместно используют диспетчер паролей для хранения / управления паролями, которые обычно невозможно запомнить, не записав его).

  2. Всегда хешируйте код / ​​токен утерянного пароля в базе данных. СНОВА, этот код является еще одним примером эквивалента пароля, поэтому он ДОЛЖЕН быть хеширован на случай, если злоумышленник заполучит вашу базу данных. При запросе кода утерянного пароля отправьте код в виде открытого текста на адрес электронной почты пользователя, затем хешируйте его, сохраните хеш в своей базе данных - и выбросьте оригинал. Так же, как пароль или постоянный токен входа.

Последнее замечание: всегда убедитесь, что ваш интерфейс для ввода «кода утерянного пароля» не менее безопасен, чем сама форма входа, иначе злоумышленник просто воспользуется этим для получения доступа. Убедитесь, что вы генерируете очень длинные «коды потерянных паролей» (например, 16 буквенно-цифровых символов с учетом регистра) - хорошее начало, но рассмотрите возможность добавления той же схемы регулирования, что и для самой формы входа.

PART V: Checking Password Strength

Во-первых, вы захотите прочитать эту небольшую статью, чтобы убедиться в реальности: 500 самых распространенных паролей

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

Итак: без минимальных требований к надежности пароля 2% пользователей используют один из 20 самых распространенных паролей. Это означает: если злоумышленник сделает всего 20 попыток, 1 из 50 аккаунтов на вашем сайте будет взломан.

Чтобы предотвратить это, необходимо вычислить энтропию пароля и затем применить порог. Специальная публикация 800-63 Национального института стандартов и технологий набор очень хороших предложений. Это, в сочетании с анализом словаря и раскладки клавиатуры (например, «qwertyuiop» - неверный пароль), может отклонять 99% всех плохо выбранных паролей на уровне 18 бит энтропии. Простое вычисление надежности пароля и визуальный индикатор надежности для пользователя - это хорошо, но недостаточно. Если этого не сделать принудительно, многие пользователи, скорее всего, проигнорируют это.

А для освежающего взгляда на удобство использования паролей с высокой энтропией настоятельно рекомендуется надежность пароля xkcd от Рэндалла Манро. .

Используйте Have I Been Pwned API Троя Ханта для проверки паролей пользователей на соответствие паролям, скомпрометированным в результате утечки общедоступных данных.

PART VI: Much More - Or: Preventing Rapid-Fire Login Attempts

Во-первых, взгляните на цифры: Скорость восстановления пароля - как долго будет стоять ваш пароль вверх

Если у вас нет времени просматривать таблицы по этой ссылке, вот их список:

  1. На взлом слабого пароля практически не требуется времени, даже если вы взламываете его с помощью счётов.

  2. Чтобы взломать буквенно-цифровой 9-значный пароль, практически мгновенно, если он нечувствителен к регистру.

  3. На взлом сложного пароля, состоящего из символов, букв и цифр, верхнего и нижнего регистра, практически не требуется времени, если он меньше 8 символов ( настольный ПК может выполнять поиск по всему пространству клавиш до 7 символов в течение нескольких дней или даже часов)

  4. Однако взломать даже 6-значный пароль потребовалось бы слишком много времени, если бы вы ограничивались одной попыткой в ​​секунду!

Итак, что мы можем узнать из этих чисел? Что ж, много, но мы можем сосредоточиться на самой важной части: на том факте, что предотвратить большое количество последовательных попыток быстрого входа в систему (т. Е. Атака грубой силой) на самом деле не так уж и сложно. Но предотвратить это правильно не так просто, как кажется.

Вообще говоря, у вас есть три варианта, которые эффективны против атак грубой силы (и атак по словарю, но, поскольку вы уже используете политику надежных паролей, они не должны быть проблемой):

  • Показывать CAPTCHA после N неудачных попыток (чертовски досадно и часто неэффективно, но здесь я повторяюсь)

  • Блокировка учетных записей и требование подтверждения адреса электронной почты после N неудачных попыток (это DoS атака ждет своего часа)

  • И, наконец, регулирование входа: то есть установка временной задержки между попытками после N неудачных попыток (да, DoS-атаки все еще возможны, но, по крайней мере, они гораздо менее вероятны и их намного сложнее вытащить выключенный).

Рекомендация №1. Небольшая задержка, которая увеличивается с количеством неудачных попыток, например:

  • 1 неудачная попытка = без задержки
  • 2 неудачных попытки = задержка 2 секунды
  • 3 неудачных попытки = задержка 4 секунды
  • 4 неудачных попытки = задержка 8 секунд
  • 5 неудачных попыток = задержка 16 секунд
  • и т.п.

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

Чтобы уточнить: задержка - это не задержка перед возвратом ответа браузеру. Это больше похоже на тайм-аут или невосприимчивый период, в течение которого попытки входа в систему с определенной учетной записью или с определенного IP-адреса вообще не будут приняты или оценены. То есть правильные учетные данные не вернутся при успешном входе в систему, а неправильные учетные данные не вызовут увеличения задержки.

Рекомендация №2. Средняя задержка, которая вступает в силу после N неудачных попыток, например:

  • 1-4 неудачных попытки = без задержки
  • 5 неудачных попыток = задержка 15-30 мин.

DoS-атака на эту схему была бы непрактичной, но, безусловно, выполнимой. Кроме того, уместно отметить, что такая долгая задержка может очень раздражать законного пользователя. Забывчивые пользователи вас не полюбят.

Рекомендация №3: сочетание двух подходов - либо фиксированная короткая временная задержка, которая вступает в силу после N неудачных попыток, например:

  • 1-4 неудачных попытки = без задержки
  • 5+ неудачных попыток = задержка 20 секунд

Или увеличивающаяся задержка с фиксированной верхней границей, например:

  • 1 неудачная попытка = задержка 5 секунд
  • 2 неудачных попытки = задержка 15 секунд
  • 3+ неудачных попытки = задержка 45 секунд

Эта окончательная схема была взята из рекомендаций по передовому опыту OWASP (ссылка 1 из списка ОБЯЗАТЕЛЬНО ПРОЧИТАЕМ) и должна считаться лучшей практикой, даже если она, по общему признанию, носит ограничительный характер.

Тем не менее, как правило, я бы сказал: чем надежнее ваша политика паролей, тем меньше вам придется приставать к пользователям с задержками. Если вам требуются надежные (с учетом регистра букв, цифр + обязательные числа и символы) пароли из 9+ символов, вы можете дать пользователям 2–4 попытки ввода пароля без задержки, прежде чем активировать регулирование.

DoS-атака на эту окончательную схему регулирования входа была бы очень непрактичной. И в качестве последнего штриха всегда разрешайте постоянный вход (файлы cookie) (и / или форму входа с проверкой CAPTCHA), чтобы законные пользователи даже не задерживались во время атаки . Таким образом, очень непрактичная DoS-атака становится крайне непрактичной атакой.

Кроме того, имеет смысл сделать более агрессивное регулирование для учетных записей администраторов, поскольку это наиболее привлекательные точки входа.

PART VII: Distributed Brute Force Attacks

Кроме того, более продвинутые злоумышленники попытаются обойти ограничение входа в систему, «распространив свои действия»:

  • Распределение попыток в ботнете для предотвращения пометки IP-адресов

  • Вместо того, чтобы выбрать одного пользователя и попробовать 50 000 наиболее распространенных паролей (чего они не могут из-за нашего ограничения), они выберут САМЫЙ самый распространенный пароль и попробуют его вместо 50 000 пользователей. Таким образом, они не только обходят меры по максимальному количеству попыток, такие как CAPTCHA и регулирование входа в систему, но и их шансы на успех возрастают, поскольку самый распространенный пароль номер 1 гораздо более вероятен, чем номер 49,995.

  • Разнесение запросов на вход для каждой учетной записи пользователя, скажем, на 30 секунд, чтобы незаметно для вас.

Здесь лучше всего регистрировать количество неудачных попыток входа в систему в масштабе всей системы и использовать среднее значение частоты неудачных входов на ваш сайт в качестве основы для верхнего предела, который вы затем устанавливаете для всех пользователей.

Слишком абстрактно? Перефразирую:

Допустим, на вашем сайте было в среднем 120 неудачных входов в систему в день за последние 3 месяца. Используя это (текущее среднее), ваша система может установить глобальный предел в 3 раза больше, т.е. 360 неудачных попыток за 24 часа. Затем, если общее количество неудачных попыток для всех учетных записей превышает это число в течение одного дня (или, что еще лучше, отслеживайте скорость ускорения и запускайте по рассчитанному порогу), он активирует общесистемное регулирование входа в систему, что означает короткие задержки для ВСЕХ пользователей. (все же, за исключением логинов cookie и / или резервных логинов CAPTCHA).

Я также разместил вопрос с более подробной информацией и действительно хорошим обсуждением того, как избегайте хитрых ловушек в отражении распределенных атак грубой силы

PART VIII: Two-Factor Authentication and Authentication Providers

Учетные данные могут быть скомпрометированы, будь то эксплойты, записываемые и утерянные пароли, украденные ноутбуки с ключами или ввод пользователей на фишинговые сайты. Логины могут быть дополнительно защищены с помощью двухфакторной аутентификации, которая использует внеполосные факторы, такие как одноразовые коды, полученные от телефонного звонка, SMS-сообщения, приложения или электронного ключа. Некоторые провайдеры предлагают услуги двухфакторной аутентификации.

Аутентификацию можно полностью делегировать службе единого входа, где другой провайдер обрабатывает учетные данные. Это перекладывает проблему на доверенную третью сторону. Google и Twitter предоставляют услуги единого входа на основе стандартов, а Facebook предоставляет аналогичное проприетарное решение.

  1. Руководство по аутентификации OWASP / Памятка по аутентификации OWASP
  2. Что можно и чего нельзя делать при аутентификации клиентов в Интернете (очень удобочитаемый исследовательский документ MIT)
  3. Википедия: HTTP cookie
  4. Вопросы личного знания для резервной аутентификации: вопросы безопасности в эпоху Facebook (очень удобочитаемый исследовательский документ Беркли)
person Community    schedule 25.01.2009
comment
Что ж, я не совсем согласен с частью Captcha, да, Captcha раздражает, и их можно сломать (кроме recaptcha, но это едва ли решается людьми!) менее 0,1% ложноотрицательных результатов .. на этом самом сайте используются капчи, они не идеальны, но они сокращают значительный объем спама и им просто нет хорошей альтернативы - person Waleed Eissa; 27.04.2009
comment
@ Джефф: Мне жаль слышать, что у вас возникли проблемы с моим ответом. Я не знал, что по поводу этого ответа ведутся споры по Мете, я бы с радостью отредактировал его сам, если бы вы попросили меня. А удаление моих сообщений просто удалило 1200 репутации из моего аккаунта, что больно :( - person Jens Roland; 19.06.2011
comment
Отличный ответ, спасибо. Можете ли вы объяснить, почему «Улучшенные» рекомендации по постоянному входу в систему ошибочны? На первый взгляд кажется, что он обращается к сценарию DOS для аннулирования сеансов с помощью подхода Миллера, что мне не хватает? - person jfager; 04.08.2011
comment
Не забудьте взглянуть на свой криптоалгоритм. Вы бы не хотели, чтобы вас поразила атака побочного канала, такая как тайминг. - person Colin Bowern; 08.08.2011
comment
После отправки токенов аутентификации системе необходим способ запомнить, что вы прошли аутентификацию - этот факт должен храниться только на стороне сервера в данных сеанса. Файл cookie может использоваться для ссылки на данные сеанса. Не совсем. Вы можете (и должны для серверов без сохранения состояния!) Использовать файл cookie с криптографической подписью. Это невозможно подделать, он не связывает ресурсы сервера и не требует липких сессий или других махинаций. - person Martin Probst; 08.08.2011
comment
Есть ли какие-нибудь хорошие статьи, в которых обсуждаются (1) теория, лежащая в основе и / или (2) реализация механизмов запрос-ответ? - person eykanal; 08.08.2011
comment
Для постоянного входа в систему. Чем токен Username + лучше, чем просто случайный идентификатор сеанса, который сервер сопоставил с именем пользователя и статусом входа? Я никогда раньше даже не слышал о первом методе. - person aero; 08.08.2011
comment
Это самый длинный и самый интересный ответ, который я когда-либо видел на Stack Overflow. Но это действительно больше подходит для поста в блоге! - person r3st0r3; 09.08.2011
comment
Чем второй файл cookie для постоянного входа в систему лучше, чем один файл cookie / сеанс с более длительным сроком действия? - person s4y; 09.08.2011
comment
Хотя библиотека надежности пароля Тайлера Аткина выглядит превосходно, она распространяется под лицензией GPL, что довольно странно для библиотеки JavaScript. Было бы хорошо предоставить ссылку на альтернативную реализацию, которую можно без ограничений использовать в коммерческом веб-приложении. - person Bayard Randel; 09.08.2011
comment
настольный ПК может выполнять поиск по ПОЛНОМУ КЛЮЧЕВОМУ ПРОСТРАНСТВУ до 7 символов менее чем за 90 дней. Машина с новейшим графическим процессором может выполнять поиск по полному 7-символьному ключевому пространству менее чем за 1 день. Топовый графический процессор может обрабатывать 1 миллиард хэшей в секунду. golubev.com/hashgpu.htm Это приводит к некоторым выводам о хранении паролей, которые напрямую не связаны адресованный. - person Frank Farmer; 09.08.2011
comment
Полностью согласен с вами по вопросам безопасности. Они очень плохие. Я просто хотел бы объяснить это своему банку. - person Tim Matthews; 09.08.2011
comment
OpenID был пропущен. Есть шанс, что кто-нибудь сможет это добавить? - person Tamás Szelei; 09.08.2011
comment
@aero: включив имя пользователя в постоянный токен cookie для входа, вы избегаете сценария, в котором у злоумышленника есть 10 миллионов шансов угадать правильный токен (на сайте с 10 миллионами пользователей). Конечно, если строка токена достаточно длинная, это не должно быть большой проблемой, но я все равно рекомендую ее. - person Jens Roland; 09.08.2011
comment
@Sidnicious: файлы cookie сеанса являются временными по определению, т.е. они автоматически истекают, когда пользователь закрывает окно браузера. - person Jens Roland; 09.08.2011
comment
@ Колин Бауэрн: Известно ли вам об успешных атаках по времени на удаленные веб-сайты? Из литературы, которую я читал об успешных атаках по времени, следует, что для них требуется дисперсия менее миллисекунды, что делает их непрактичными для удаленных атак на веб-сайты (где обычное время отклика находится в диапазоне 20-50 миллисекунд). - person Jens Roland; 09.08.2011
comment
@fjager: конечно - я добавил к сообщению простую заметку, объясняющую, почему он не добавляет значительной безопасности системе. - person Jens Roland; 09.08.2011
comment
@ Дженс Почему? Если целью cookie является хранение информации о сеансе входа в систему, почему бы ему не длиться столько времени, сколько будет длиться вход в систему? Кажется, что отдельные файлы cookie сеанса / запоминания просто добавляют сложности. - person s4y; 10.08.2011
comment
@Sidnicious: Значит, вы не говорите о cookie сеанса. Сессионные файлы cookie по определению не имеют директивы expires. Если вы добавите директиву expires в файл cookie сеанса, он станет постоянным файлом cookie. Похоже, вы хотите сделать cookie сеанса постоянным и удалить настоящий cookie с ограничением сеанса. Я предполагаю, что это возможно, но вы теряете все полезные вещи, которые можете делать с сеансовыми cookie-файлами, то есть сохраняя временные легковесные объекты состояния в памяти (вы не хотите, чтобы все данные сеанса были активными в течение месяцев, поверьте мне). - person Jens Roland; 11.08.2011
comment
Я удивлен, что о защите CSRF не упомянули ... - person Flukey; 16.08.2011
comment
@Jens Roland: Что касается RememberMe, в cookie я должен сохранить тот же токен, который хранится в БД? Если нет, я должен сохранить в файле cookie значение, из которого был создан токен? - person jonathancardoso; 05.09.2011
comment
@Jonathan: токен - это просто случайно сгенерированное значение. Сохраните идентификатор пользователя и токен в cookie, затем сохраните хэш токена в БД. Таким образом, вы можете проверить файл cookie для входа, повторно хешировав токен и проверив запись пользователя на предмет совпадения. - person Jens Roland; 06.09.2011
comment
@Mike: Хорошие моменты. Если пользователь пытается войти в систему (т. Е. Отправляет учетные данные для входа на сервер), они не будут проверены, и будет возвращена ошибка. Синхронизированные с сервером часы обратного отсчета должны отображаться рядом с формой входа в систему, чтобы информировать пользователя о регулировании. Сама форма или кнопка отправки должны быть отключены, пока не закончится обратный отсчет. - person Jens Roland; 14.10.2011
comment
@Mike: «Блокировка» на основе учетной записи должна происходить IMO только в том случае, если пользователь нарушает TOS вашего сайта при входе в систему, если плата за учетную запись не выплачена или если в отношении пользователя проводится расследование властей. Пока пользователь не вошел в систему правильно, вы (как правило) не можете быть уверены, что неудачные попытки входа в систему не являются злонамеренной третьей стороной, пытающейся заблокировать реального пользователя. - person Jens Roland; 14.10.2011
comment
@Mike: «Блокировка» на основе IP может быть рекомендована в случае очевидных DoS-атак. Само по себе это не имеет ничего общего с безопасностью формы входа в систему и обычно обрабатывается непосредственно в сетевом трафике, поэтому лавинная рассылка запросов с одного IP-адреса автоматически запускает блокировку IP-адресов на несколько часов. - person Jens Roland; 14.10.2011
comment
@Jens, спасибо за разъяснения. Я просто подумал, что у меня есть счета в двух разных банках. Один из них блокирует вашу учетную запись на 2 часа с 3 неудачными входами. Другой блокирует вашу учетную запись на неопределенный срок после 5 неудачных попыток входа в систему и вынуждает вас позвонить в службу технической поддержки, чтобы снова включить ее. Также (насколько я могу судить) не блокируйте свой IP-адрес. - person Mike; 15.10.2011
comment
@jfager: когда пользователь повторно входит в систему, ничего не удаляется, поскольку безопасное удаление происходит только в том случае, если сайту передается старый файл cookie, содержащий действительный идентификатор серии и недопустимый токен. Поскольку такого файла cookie нет (потому что злоумышленник удалил его), система просто инициирует новую серию и даже не предупреждает пользователя. (помните: у пользователя может быть много ноутбуков = много идентификаторов серий, и «улучшенная» система не заметит разницы) - person Jens Roland; 16.10.2012
comment
@jfager: Абсолютно верно - я не хотел изображать это как недостаток, моя единственная точка зрения в том, что «улучшение» на самом деле не выполняет своих обещаний. Это может заставить разработчиков и владельцев сайтов поверить, что их система аутентификации защищает от кражи файлов cookie, но это не так - а фальшивая безопасность хуже, чем ее отсутствие. - person Jens Roland; 17.10.2012
comment
Здесь есть несколько вещей, которые были либо кратко упомянуты, либо вовсе не упомянуты. Одним из них является использование алгоритмов хеширования, специфичных для паролей (например, bcrypt). Это означает, что время вычисления хэша увеличивается до 0,1 секунды (по крайней мере), но это имеет большое значение при поиске всего пространства ключей. Во-вторых, безопасность должна быть повсюду: санация пользовательского ввода, использование подготовленных операторов для sql, проверка того, что URL-адрес ресурсов непредсказуем, тогда возникает весь набор проблем XSS ... - person chacham15; 08.11.2012
comment
Согласен с @ chacham15. Политика блокировки и регулирования - это замечательно, но использование дайджеста пароля, такого как bcrypt или scrypt, вместо функции хеширования общего назначения, обеспечивает это на самом низком уровне. Невозможно обойтись без полной работы по созданию дайджеста пароля, поэтому ни один разработчик не может просто забыть реализовать или случайно отключить механизм регулирования. - person Stephen Touset; 08.11.2012
comment
@namelessjon: Исправление: даже если бы у всех пользователей были пароли с высокой энтропией, мы все равно хотели бы хэшировать их в случае кражи базы данных - person Jens Roland; 11.11.2012
comment
@Ferdy: Спасибо :) фиксированная задержка в 1-2 секунды будет работать, но ее постепенное увеличение до 10 или 20 секунд увеличит устойчивость к атакам грубой силы. - person Jens Roland; 13.11.2012
comment
@JensRoland Спасибо за подтверждение работоспособности упрощенной модели. Хотя это и менее эффективно, я бы предпочел избежать боли, связанной с надежным отслеживанием попыток входа в систему. Еще лучше, мне больше всего нравится часть VIII вашего ответа: передача всего вопроса на аутсорсинг. Проблема не только в безопасности при построении вашей собственной системы управления пользователями, но и в том, что кажется таким простым, как надежная отправка электронных писем, также является проблемой. - person Fer; 13.11.2012
comment
НИКОГДА не используйте recaptcha, если вы хотите сохранить кого-либо из своих клиентов. Серьезно, если вам нужно использовать капчу, а затем использовать ту, которую люди могут решить с первого раза, они могут быть небезопасными, но они являются хорошим компромиссом, потому что большинство из них остановят множество ботов, не слишком раздражая ваших клиентов. - person jonhobbs; 26.11.2012
comment
@MikeMike: ..и прокрутите их в php - почему бы просто не выбрать строку в SQL? SELECT * FROM LoginTokens WHERE UserID=[userid from cookie] AND HashedToken=[hash(token from cookie)] должен работать нормально (не забудьте использовать подготовленные операторы / хранимые процедуры для SQL) - person Jens Roland; 12.03.2013
comment
Кто-нибудь знает, где я могу найти проверенную реализацию PHP / MySQL решения Чарльза Миллера с постоянным входом в систему cookie, которому уже почти 10 лет? Опубликуйте его здесь: stackoverflow.com/questions/15647261/ - person ProgrammerGirl; 27.03.2013
comment
@JensRoland: Как бы вы выбрали строку в SQL, когда токен хешируется с помощью bcrypt? Ответьте здесь: stackoverflow.com/questions/15685951/ - person ProgrammerGirl; 28.03.2013
comment
@Jesse: Я бы согласился с вами, если бы `` улучшенная '' система действительно сделала это, но если злоумышленник удаляет cookie, сайт не имеет ни малейшего представления о том, что атака произошла - только то, что новая цепочка была добавлена ​​в коллекцию файлов cookie. действующие цепочки. Если и только если пользователь отслеживает собственное количество действительных цепочек, хранящихся в базе данных, никогда не очищает свои собственные файлы cookie и отслеживает 100% устройств, которые он использует для аутентификации на сайте, сможет ли он сделать вывод, что атака МОЖЕТ иметь место. Сценарий, при котором система автоматически обнаруживает вторжение, не применяется к удалению файлов cookie. - person Jens Roland; 27.05.2013
comment
@Jesse: Вы правы, но это улучшение кажется мне в высшей степени спекулятивным, поскольку практически каждый вектор атаки, который позволил бы третьим сторонам получить доступ к cookie, также позволил бы им удалить его. Надеяться, что они этого не сделают, - не что иное, как безопасность через безвестность. Даже если будет добавлена ​​дополнительная защита от самых слабых злоумышленников, я все равно буду утверждать, что давать владельцам сайтов / законным пользователям ложное ощущение безопасности путем рекламы механизма «обнаружения вторжений», который на самом деле не защищает их, является совершенно безответственным и должно быть обескуражен. - person Jens Roland; 06.06.2013
comment
Просто мысль. Как насчет биткойн-подобного хеширования учетных данных на клиенте? Итеративное хеширование имени пользователя, пароля и случайного числа (зависит от сеанса), которое занимает у клиента пару секунд (легитимные пользователи не будут возражать против небольшой задержки), и это станет кошмаром для злоумышленников. Для успешной аутентификации потребуются действительные учетные данные и подтверждение работы. - person Patrick; 25.08.2013
comment
хеширование пароля на стороне клиента: больше, чем просто сказать, что это бесполезно, следует сделать очень ясно, что это недостаток безопасности. Это делает хэш эквивалентным паролю и означает, что сервер, сохраняя хэш пароля, эффективно хранит пароль (и никто из нас этого не делает, верно?) Вот вопрос именно по этому поводу. - person jameshfisher; 24.12.2013
comment
@JensRoland Отличный пост, спасибо. Если у моего сайта нет состояния, которое он хотел бы сохранить в файле cookie сеанса, например, тогда каждый из моих файлов cookie сеанса и постоянного файла cookie в основном содержит только отдельные большие случайные строки (и имя пользователя для постоянного)? - person Newtang; 26.01.2014
comment
@Newtang: постоянный файл cookie всегда должен быть большой случайной строкой (и, возможно, именем пользователя для удобства). Файл cookie сеанса обычно устанавливается вашей веб-платформой / MVC (ASP.NET_SessionId, PHPSESSID, ci_session, JSESSIONID) и должен содержать только идентификатор сеанса (другую большую случайную строку). Если вы хотите сохранить дополнительное состояние сеанса, это состояние обычно должно храниться на стороне сервера с идентификатором сеанса, используемым в качестве первичного ключа. - person Jens Roland; 26.01.2014
comment
@shannon: Совершенно верно - пока ваши пользовательские данные защищены надежным шифрованием, вы теоретически можете загрузить их в Pastebin, и это не будет проблемой - и все же я не думаю, что кому-то будет комфортно с такой настройкой. Некоторые фреймворки фактически предоставляют такое решение для зашифрованных файлов cookie в качестве альтернативы сеансовой базе данных, и это, без сомнения, жизнеспособное решение. Проблемы начинаются, когда люди реализуют это решение со слабым шифрованием или без него (а они это делают) или превышают лимиты данных для данных cookie. - person Jens Roland; 23.03.2014
comment
@JensRoland: Думаю, я подумал, что если мы предположим, что шифрование слабое, то мы должны беспокоиться, что даже простой токен сеанса также небезопасен, и мы рискуем захватить сеанс, повторы и любое количество других связанных атак. - person shannon; 23.03.2014
comment
Разве секретный вопрос не будет полезен при использовании в сочетании с типичной функцией сброса пароля? Типичный процесс сброса пароля гарантирует, что только владелец учетной записи электронной почты может сбросить свой пароль. Но если учетная запись пользователя была скомпрометирована, то добавление секретного вопроса может помешать попытке сбросить пароль и получить доступ к сайту. - person Courtney Miles; 24.06.2014
comment
Я видел одну капчу, которая была сделана в Canvas HTML 5, которая перемещала три шара так, чтобы они были от самого маленького до самого большого (круги, а не шары), и это было действительно здорово. Я давно не сталкивался с этой страницей. - person Doug Hauf; 08.07.2014
comment
@ Андрей: На самом деле это не так. Разрешены несколько SID (цепочек), потому что таким образом поддерживается несколько устройств, вошедших в систему (например, домашний ПК, рабочий ПК и iPad). В схеме с одной цепочкой (одно устройство) каждый раз, когда пользователь переключается между устройствами, появляется предупреждение о «краже», что в конечном итоге делает его бесполезным, потому что пользователь видит его все время. - person Jens Roland; 02.09.2014
comment
@JensRoland Если вы хотите разрешить запоминание меня для нескольких устройств, вам нужно изменить решение. Я думаю, что одним из способов было бы вместо SID хранить IP (хешированный) в cookie и в БД. БД будет иметь пул IP-адресов, некоторые из которых помечены как действительные, а другие - как запрещенные. При ручном входе в систему IP-адрес пользователя сохраняется в файле cookie и в базе данных и помечается как действительный. При каждом автоматическом или ручном входе в систему IP входящего пользователя проверяется на соответствие БД (также токену). Если IP найден и действителен - зеленый свет. Если IP не найден - загорится зеленый свет, НО IP входящего пользователя помечен как Действительный и - person Andrew; 03.09.2014
comment
а старый IP-адрес (из файла cookie) помечается в БД как запрещенный. Если владелец авторизуется со старым (забаненным) IP, горит красный свет - предполагается кража. Все очищается. Это не 100% доказательство, так как до тех пор, пока настоящий владелец не вернется, вор будет использовать сайт, а также в течение этого времени IP-адрес владельца может измениться, но шансы сведены к минимуму, и разрешено использование нескольких устройств. По желанию, заблокированные IP-адреса могут удаляться каждый месяц / 3 месяца и т. Д., Поскольку интернет-провайдер может снова назначить «старый» IP. - person Andrew; 03.09.2014
comment
Просто примечание: SSL - НЕ единственное решение для безопасного входа в систему. Фактически вы можете сделать процесс входа в систему безопасным для сниффера, используя хешированный пароль. По сути, при создании страницы входа вы отправляете в браузер соль (которая также будет сохранена на стороне сервера), а при отправке данных формы вы отправляете хешированный пароль и соль (посмотрите @ crypto-js), Затем сервер хеширует пароль + сгенерированную соль в сеансе и сравнивает оба. Если пароль на сервере хеширован, просто хешируйте пароль в браузере, а затем снова объедините соль и хеш. - person WoLfulus; 16.10.2014
comment
@WoLfulus: Прежде всего, как злоумышленнику MITM все, что мне нужно сделать, это заменить соль (или функцию хеширования JS), которую вы отправляете в браузер через незашифрованное соединение, и вся ваша схема недействительна. Во-вторых, даже если я не могу управлять ответом сервера раньше времени, простое сниффинг даст мне соль, хеш-функцию и хешированный пароль + соль, что откроет вам простой словарь и атаки грубой силы. Никогда не доверяйте хешированию на стороне клиента ради безопасности. - person Jens Roland; 25.10.2014
comment
@JensRoland Соль также хранится на стороне сервера для проверки, если вы измените ее на клиенте, вы не пройдете проверку на сервере, что приведет к неверному паролю. Я согласен с грубой силой. - person WoLfulus; 26.10.2014
comment
@WoLfulus: Даже если логин не прошел, теперь ваш пароль принадлежит мне, несмотря на ваши попытки замаскировать его с помощью хеширования. - person Jens Roland; 27.10.2014
comment
@jameshfisher - это больше, чем просто сказать, что это бесполезно, нужно очень четко указать, что это недостаток безопасности. Это делает хэш-пароль эквивалентным и означает, что сервер, сохраняя хеш-пароль, эффективно хранит пароль. Это только недостаток безопасности, если вы также не используете отдельный соленый хеш на стороне сервера. Если у вас простой хеш на стороне клиента, затем соленый хеш на стороне сервера, сам пароль никогда не передается, и взлом базы данных по-прежнему не означает возможность аутентификации. - person Parthian Shot; 15.02.2015
comment
@ParthianShot имеет смысл, но хеширование на стороне клиента по-прежнему бесполезно, а добавление ненужной сложности к системе безопасности просто создает еще одну движущуюся часть, которая может сбить с толку обслуживающего персонала и потенциально внести недостатки безопасности (например, заставить неопытного разработчика отказаться от серверной части). соль + перепрошивка) - person Jens Roland; 26.02.2015
comment
@JensRoland ведет неопытного разработчика к отказу от соли на стороне сервера + перефразирование Напоминает мне о распространенной ошибке, которую люди допускают, пытаясь разработать что-то полностью защищенное от дурака, - это недооценивать изобретательность полных дураков. Вы должны предположить, что у вас есть компетентная команда разработчиков. Однако использование хеш-кода на стороне клиента имеет одно огромное преимущество; человек, который расшифровывает трафик постфактум, по-прежнему может использовать только то, что он получил, в качестве токена аутентификации на вашем сайте, независимо от того, использует ли конечный пользователь один и тот же пароль на нескольких сайтах. Хотя глубокоэшелонированная защита действительно добавляет сложности. - person Parthian Shot; 05.03.2015
comment
Честно говоря, я не поклонник стратегии Чарли Миллера. Система, которую я предпочитаю, просто использует два случайных значения: одно хранится в базе данных как индекс, другое хранится в cookie клиента, а его хэш хранится в базе данных. Затем мы сравниваем хэши за постоянное время. paragonie.com/blog/2015/04/ - подробно описано здесь. - person Scott Arciszewski; 08.05.2015
comment
Я думаю о данных сеанса: этот факт должен храниться только на стороне сервера в данных сеанса. А насчет кластерной среды (как в облаке)? Как должна храниться пользовательская сессия? - person kavain; 10.08.2015
comment
@kavain: в таких средах сеансы обычно хранятся в базе данных (размещенной на отдельном сервере). Это отделяет сеансы от конкретного веб-сервера, обрабатывающего запрос (HTTP FTW без сохранения состояния), и имеет минимальный уровень безопасности, равный безопасности вашей базы данных, что обычно хорошо. - person Jens Roland; 25.08.2015
comment
Интересно, что в ответе упоминается SRP, но во многих комментариях обсуждается устаревшее хеширование. Библиотеки SRP JavaScript, такие как thinbus-srp, являются быстрыми и эффективными с единственными накладными расходами, которые связаны с извлечением соли и вызовом немногим серверам для выполнения проверки пароля с нулевым разглашением на сервере. - person simbo1905; 12.11.2015
comment
@JensRoland Спасибо за отличный ответ! Не могли бы вы подробнее рассказать об этом? Задержка - это не задержка перед возвратом ответа в браузер. Это больше похоже на тайм-аут ... во время которого попытки входа в конкретную учетную запись ... не будут приняты или оценены вообще. - Я понимаю, что вы в основном говорите, что использование чего-то вроде sleep (30) перед отправкой ответа с недопустимыми данными для входа в систему не годится, поскольку бот / хакер может продолжать отправлять попытки входа в систему с отдельными запросами, выполняемыми параллельно; но как тогда вы предлагаете установить тайм-аут? Отключить кнопку входа в форму? - person Kosta Kontos; 20.03.2016
comment
@KostaKontos вам нужно будет запустить асинхронный тайм-аут, который запускается на стороне сервера, вот и все. То, как вы показываете это пользователю, - это всего лишь проблема пользовательского интерфейса, поскольку меры безопасности вообще не находятся в интерфейсе. - person Jens Roland; 12.04.2016
comment
Хорошая штука. Однако надежность пароля практически не имеет значения - все, что имеет значение, - уникальность между сайтами. Либо база данных была захвачена, и в этом случае фактические данные пользователя теряются. Или злоумышленник пытается провести веб-атаку методом грубой силы, которую вы легко можете предотвратить. Если пароль пользователя не является чрезвычайно слабым (например, monkey123) - до тех пор, пока пароль уникален на всех сайтах, сверхнадежные пароли в большинстве своем бессмысленны и будут способствовать тому, что пользователи их забудут. Если вы специально говорите пользователям использовать уникальный пароль, а они этого не делают, это их ответственность. - person niico; 29.12.2016
comment
Надежность пароля @niico не имеет значения, если злоумышленник хочет атаковать определенного пользователя (в некоторых системах злоумышленнику может быть достаточно получить доступ к любой случайной учетной записи, но во многих случаях, например, на социальных сайтах, злоумышленники хотят взломать определенные учетные записи пользователей). Сложность взлома пароля одного пользователя зависит от количества разрешенных попыток входа в систему, но также в значительной степени от надежности пароля. Если людям разрешено использовать пароли с низкой энтропией, они выберут «пароль», «секрет», «qwerty» и «letmein» (и имя своей собаки). Вам не нужно много попыток их угадать. - person Jens Roland; 03.01.2017
comment
Что касается «Не сбрасывайте забытый пароль на автоматически сгенерированный надежный пароль» - такие пароли, как известно, трудно запомнить, а это означает, что пользователь должен ... просто позволить пользователям сразу же выбрать новый - что они и хотят делать в любом случае. ' Я бы сказал, что если вы используете сторонний менеджер паролей, это (запоминание автоматически сгенерированных паролей) больше не проблема. Я бы также сказал, что позволяя пользователю выбрать новый (если он полагается на человеческую память, чтобы сохранить пароль), он в любом случае выберет легко взломанный или повторяющийся пароль 9 раз из 10. Теперь вы вернулись к более серьезной проблеме. - person Jeff Mergler; 18.07.2018
comment
Когда запрашивается код утерянного пароля, отправьте текстовый код на адрес электронной почты пользователя, вы не должны хранить простой пароль в базе данных. - person Webwoman; 27.08.2018
comment
@Webman: Я думаю, вы запутались. Это предложение продолжается, затем хешируется, сохраняется хеш в своей базе данных - и отбрасывается оригинал. Он явно говорит, что не следует хранить открытый текстовый код в БД. Что касается капчи, да, многие реализации в наши дни неэффективны против приличного программного обеспечения для распознавания образов. - person Jens Roland; 10.09.2018
comment
хорошо, я понял, что если вы можете отправить текстовый код пользователю, это будет означать, что вы сохраните его как обычный в базе данных, потому что, AFAIK, невозможно отменить процесс хеширования, но я могу ошибаться, хорошо для captcha, я понимаю, что вы имеете в виду сейчас - person Webwoman; 10.09.2018
comment
Дело в том, что вы каждый раз генерируете новый случайный. Если предыдущий хэш кода сброса все еще находится в базе данных (он должен автоматически истечь через ограниченное время, скажем, 30 минут), вы просто перезаписываете его. Другой вариант - создать полезную нагрузку и обернуть ее чем-то вроде JWT, который сервер может проверить при получении, но это действительно того стоит, если вы используете JWT в другом месте, чтобы у вас уже была эта логика. - person Jens Roland; 10.09.2018
comment
Почему здесь не объясняется защита CSRF? - person Temp O'rary; 18.01.2021
comment
@ TempO'rary этот ответ был первоначально написан в 2009 году, и CSRF не был так широко распространен или так хорошо понят в то время; CORS не появлялся в браузерах до ~ 2013 года (и CSRF был добавлен к вопросу OP в 2016 году); правда в том, что я не включил его, потому что он казался немного экзотическим. Но вы правы, с тех пор его должны были добавить. - person Jens Roland; 11.03.2021

Окончательная статья

Отправка учетных данных

Единственный практический способ 100% безопасной отправки учетных данных - использование SSL. Использование JavaScript для хеширования пароля небезопасно. Распространенные ошибки при хешировании паролей на стороне клиента:

  • Если соединение между клиентом и сервером не зашифровано, все, что вы делаете, уязвимо для человека. Атаки посередине. Злоумышленник может заменить входящий javascript, чтобы нарушить хеширование или отправить все учетные данные на свой сервер, он может прослушивать ответы клиентов и идеально выдавать себя за пользователей и т. Д. И т. Д. SSL с доверенными центрами сертификации разработан для предотвращения атак MitM.
  • Хешированный пароль, полученный сервером, менее безопасен, если вы не выполняйте дополнительную, избыточную работу на сервере.

Есть еще один безопасный метод под названием SRP, но он запатентован (хотя он свободно лицензируется), и есть несколько хороших реализаций.

Хранение паролей

Никогда не храните пароли в базе данных в виде открытого текста. Даже если вы не заботитесь о безопасности своего сайта. Предположим, что некоторые из ваших пользователей будут повторно использовать пароль своего банковского счета в Интернете. Итак, сохраните хешированный пароль, а оригинал выбросьте. И убедитесь, что пароль не отображается в журналах доступа или журналах приложений. OWASP рекомендует использовать Argon2 в качестве первого выбора для новых приложений. Если это недоступно, вместо него следует использовать PBKDF2 или scrypt. И, наконец, если ничего из вышеперечисленного не доступно, используйте bcrypt.

Сами по себе хеши тоже небезопасны. Например, одинаковые пароли означают одинаковые хэши - это делает таблицы поиска по хешам эффективным способом одновременного взлома большого количества паролей. Вместо этого сохраните хэш соленый. Соль - это строка, добавляемая к паролю перед хешированием - используйте разные (случайные) соли для каждого пользователя. Соль - это общедоступное значение, поэтому вы можете хранить их вместе с хешем в базе данных. Дополнительную информацию см. здесь.

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

Вопросы безопасности

Вопросы безопасности небезопасны - избегайте их использования. Почему? Что бы ни делал секретный вопрос, лучше использовать пароль. Прочтите ЧАСТЬ III: Использование секретных вопросов в @Jens Roland ответ здесь, в этой вики.

Сессионные куки

После входа пользователя в систему сервер отправляет пользователю файл cookie сеанса. Сервер может получить имя пользователя или идентификатор из файла cookie, но никто другой не может сгенерировать такой файл cookie (механизмы объяснения TODO).

Файлы cookie могут быть перехвачены: они безопасны только в той степени, в которой безопасность остального компьютера клиента и других коммуникаций. Их можно читать с диска, анализировать в сетевом трафике, снимать с помощью межсайтовых скриптовых атак, фишинговать с зараженного DNS, чтобы клиент отправлял свои файлы cookie не на те серверы. Не отправляйте постоянные файлы cookie. Срок действия файлов cookie должен истечь в конце клиентского сеанса (закрытие браузера или выход из вашего домена).

Если вы хотите автоматически входить в систему для своих пользователей, вы можете установить постоянный файл cookie, но он должен отличаться от файла cookie полного сеанса. Вы можете установить дополнительный флаг, что пользователь вошел в систему автоматически и должен войти в систему для реальных операций с конфиденциальными данными. Это популярно на сайтах покупок, которые хотят предоставить вам удобный индивидуальный опыт покупок, но при этом защитить ваши финансовые данные. Например, когда вы вернетесь на Amazon, они покажут вам страницу, которая выглядит так, как будто вы вошли в систему, но когда вы идете разместить заказ (или измените адрес доставки, кредитную карту и т. Д.), Они просят вас подтвердить ваш пароль.

С другой стороны, финансовые веб-сайты, такие как банки и кредитные карты, содержат только конфиденциальные данные и не должны разрешать автоматический вход или режим с низким уровнем безопасности.

Список внешних ресурсов

person Community    schedule 02.08.2008
comment
Учитывая недавнюю уязвимость MITM, связанную с подписанными сертификатами SSL (blog.startcom.org/?p=145), поэтому комбинация SSL и какой-то аутентификации ответа на вызов (есть альтернативы SRP), вероятно, является лучшим решением. - person Kevin Loney; 20.01.2009
comment
многое из этого ситуативно. я вообще не использую файлы cookie сеанса. Захват cookie-файлов почти всегда происходит по вине серверов. человек посередине / обнюхивание пакетов не так уж часто - person Shawn; 28.01.2009
comment
Пакет BCrypt Nuget: nuget.org/List/Packages/BCrypt - person Fabian Vilers; 09.08.2011
comment
Примечание 1 об этом ответе: это черновик, который нужно редактировать как вики. Если вы можете отредактировать это, добро пожаловать в. - person Peter Mortensen; 18.08.2012
comment
SRP специфичен для присутствия нескольких сторон, если я хорошо понимаю - person Webwoman; 27.08.2018

Во-первых, серьезное предупреждение о том, что этот ответ не наилучшим образом подходит для этого точного вопроса. Это определенно не должно быть лучшим ответом!

Я продолжу и упомяну предложенный Mozilla BrowserID (или, возможно, более точно, Verified Email Protocol) в духе поиска пути обновления для более эффективных подходов к аутентификации в будущем.

Я резюмирую это так:

  1. Mozilla - некоммерческая организация с ценностями, которые хорошо согласуются с поиском хороших решений этой проблемы.
  2. Сегодняшняя реальность такова, что большинство веб-сайтов используют аутентификацию на основе форм.
  3. Аутентификация на основе форм имеет большой недостаток - повышенный риск фишинга. Пользователей просят вводить конфиденциальную информацию в область, контролируемую удаленным объектом, а не в область, контролируемую их пользовательским агентом (браузером).
  4. Поскольку браузерам неявно доверяют (вся идея агента пользователя заключается в том, чтобы действовать от имени пользователя), они могут помочь улучшить эту ситуацию.
  5. Основная сила, сдерживающая прогресс здесь, - это тупик при развертывании. Решения необходимо разбивать на этапы, которые сами по себе обеспечивают некоторую дополнительную выгоду.
  6. Самым простым децентрализованным методом выражения идентичности, встроенной в инфраструктуру Интернета, является доменное имя.
  7. В качестве второго уровня выражения идентичности каждый домен управляет своим собственным набором учетных записей.
  8. Форма account@domain является краткой и поддерживается широким спектром протоколов и схем URI. Такой идентификатор, конечно же, наиболее широко известен как адрес электронной почты.
  9. Поставщики услуг электронной почты уже де-факто являются основными поставщиками идентификационной информации в Интернете. Текущие процессы сброса пароля обычно позволяют вам взять под свой контроль учетную запись, если вы можете доказать, что контролируете связанный с ней адрес электронной почты.
  10. Протокол проверенной электронной почты был предложен для обеспечения безопасного метода, основанного на криптографии с открытым ключом, для оптимизации процесса подтверждения домену B того, что у вас есть учетная запись в домене A.
  11. Для браузеров, которые не поддерживают протокол проверенной электронной почты (в настоящее время все они), Mozilla предоставляет оболочку, которая реализует протокол в клиентском коде JavaScript.
  12. Для почтовых сервисов, не поддерживающих протокол проверенной электронной почты, этот протокол позволяет третьим сторонам выступать в качестве доверенных посредников, утверждая, что они подтвердили право собственности пользователя на учетную запись. Большое количество таких третьих лиц нежелательно; эта возможность предназначена только для того, чтобы разрешить путь обновления, и гораздо предпочтительнее, чтобы службы электронной почты сами предоставляли эти утверждения.
  13. Mozilla предлагает собственный сервис, чтобы действовать как доверенная третья сторона. Поставщики услуг (то есть Проверяющие стороны), реализующие протокол проверенной электронной почты, могут решить, доверять утверждениям Mozilla или нет. Служба Mozilla проверяет владение учетной записью пользователей с помощью обычных средств отправки электронного письма со ссылкой для подтверждения.
  14. Поставщики услуг могут, конечно, предложить этот протокол в качестве опции в дополнение к любому другому методу (ам) аутентификации, который они могут предложить.
  15. Большое преимущество пользовательского интерфейса, о котором идет речь, - это «селектор идентичности». Когда пользователь посещает сайт и выбирает аутентификацию, его браузер показывает им выбор адресов электронной почты («личный», «рабочий», «политический активизм» и т. Д.), Которые они могут использовать для идентификации себя на сайте.
  16. Еще одно важное преимущество пользовательского интерфейса, к которому стремятся эти усилия, - это помощь браузеру узнать больше о пользователе session (в первую очередь, под которым они вошли в систему), поэтому он может отображать это в браузере Chrome.
  17. Из-за распределенного характера этой системы она позволяет избежать привязки к крупным сайтам, таким как Facebook, Twitter, Google и т. Д. Любой человек может владеть своим собственным доменом и, следовательно, действовать как собственный поставщик удостоверений.

Это не совсем «аутентификация на основе форм для веб-сайтов». Но это попытка перейти от нынешней нормы аутентификации на основе форм к чему-то более безопасному: аутентификации, поддерживаемой браузером.

person Community    schedule 08.08.2011
comment
Ссылка BrowserID не работает - person Spoody; 28.01.2018
comment
Похоже, что проект законсервирован .... см. en.wikipedia.org/wiki/Mozilla_Persona - person Jeff Olson; 19.03.2018

Я просто подумал, что поделюсь этим решением, которое, как мне показалось, работает нормально.

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

Вкратце: вам просто нужно вставить это в свой <form> и проверить, чтобы он был пустым при проверке:

<input type="text" name="email" style="display:none" />

Хитрость заключается в том, чтобы заставить бота думать, что он должен вставлять данные в обязательное поле, поэтому я назвал входное электронное письмо. Если у вас уже есть поле под названием «Электронная почта», которое вы используете, попробуйте назвать фиктивное поле чем-нибудь еще, например, компанией, телефоном или адресом электронной почты. Просто выберите то, что, как вы знаете, вам не нужно, и то, что люди обычно считают логичным заполнить в веб-форме. Теперь скройте поле input с помощью CSS или JavaScript / jQuery - что вам больше подходит - просто не устанавливайте для ввода type значение hidden, иначе бот не попадется на это.

Наша форма теперь выглядит так:

label[for="telephone"], input[type="tel"] {
  visibility: visible; /* to fool others */
  color:white;
  width: 0;
  height: 0;
  position: absolute;
  top: -50px;
  left: -120px;
}
<h1>Log In</h1>
<p>Can you see a field called 'telephone number'?</p>
<form action="/" method="post">
<label>username: <input type="text" name="username" /></label>
<label>password: <input type="password" name="password" /></label>
<!-- ta da. a label for it to seem even more realistic. aria-hidden="true" so screen readers will not be fooled.-->
<label for="telephone" aria-hidden="true">telephone number</label>
<input type="tel" name="telephone" id="telephone" title="enter your telephone number" />
<br />
<input type="submit" value="log in" />
</form>

Когда вы проверяете форму (на стороне клиента или на стороне сервера), проверьте, заполнено ли ваше фиктивное поле, чтобы определить, было ли оно отправлено человеком или ботом.

Ваша обработка:

$fakefield = $_POST['telephone_number'];
if ($fakefield) {
  // log in
  // password_verify(...);
  // ...
} else {
  echo 'no bots allowed';
}

Пример:

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

В случае с ботом: бот увидит поле типа text и имя email (или как там вы его назвали) и логически попытается заполнить его соответствующими данными. Неважно, стилизовали ли вы форму ввода с помощью какого-нибудь причудливого CSS, веб-разработчики делают это постоянно. Каким бы ни было значение в фиктивном поле, нам все равно, если оно больше 0 символов.

Я использовал этот метод в гостевой книге в сочетании с CAPTCHA, и я не видел ни одного спам пост с. Раньше я использовал решение только с CAPTCHA, но в итоге оно приводило к примерно пяти спам-сообщениям каждый час. Добавление фиктивного поля в форму остановило (по крайней мере, до сих пор) от появления всего спама.

Я считаю, что это также можно использовать с формой входа / аутентификации.

Предупреждение. Конечно, этот метод не является 100% надежным. Ботов можно запрограммировать так, чтобы они игнорировали поля ввода, применив к ним стиль display:none. Вы также должны подумать о людях, которые используют ту или иную форму автозаполнения (например, в большинстве браузеров есть встроенные!), Чтобы автоматически заполнять все поля формы для них. С таким же успехом они могли бы взять фиктивное поле.

Вы также можете немного изменить это, оставив фиктивное поле видимым, но за пределами экрана, но это полностью зависит от вас.

Примечание. Автозаполнение через браузер не заполняет его! Пользователь не может войти

Будь креативным!

person Community    schedule 22.05.2012
comment
Это полезный трюк с защитой от спама, но я бы предложил использовать имя поля, отличное от «электронной почты», иначе вы можете обнаружить, что браузер автоматически заполняет его, непреднамеренно блокируя подлинных пользователей вашего сайта. - person Nico Burns; 23.05.2012
comment
Я уже отмечал это в разделе «Предупреждение», но да, это правда. - person Pieter888; 23.05.2012
comment
Ой, я однажды придумал это самостоятельно, и, как вы упомянули, как только я применил его к своим контактным формам на нескольких веб-сайтах, он полностью заблокировал спам более года. Мне это нравится, но я боялся того дня, когда увижу упоминание об этом на популярном веб-сайте. ;) - person Dustin Graham; 05.07.2012
comment
вы можете отключить автозаполнение для отдельных полей формы. вам следует остерегаться людей, использующих юзерагенты, которые не распознают таблицы стилей. - person bluesmoon; 07.08.2012
comment
У меня также есть несколько таких, использующих visibility:hidden, а также position:absolute;top:-9000px, вы также можете использовать text-indent, а также z-index с некоторыми из этих элементов и помещать их в сжатые имена файлов CSS с неудобными именами - поскольку боты могут обнаруживать 1display: none`, и теперь они проверяют для ряда комбинаций - я действительно использую эти методы, и они старые уловки торговли. +1 - person TheBlackBenzKid; 12.09.2012
comment
Подумал, что я хотел бы упомянуть здесь потенциальную проблему доступности. Вы должны включить сообщение (которое также можно скрыть) о том, что поле следует оставить пустым. - person Michael Mior; 08.11.2012
comment
Что происходит, когда пользователь с нарушением зрения использует программу чтения с экрана для навигации по форме? - person soycharliente; 24.11.2012
comment
У этого метода есть название: honeypot en.wikipedia.org/wiki/Honeypot_ (вычисления) < / а> - person pixeline; 25.11.2012
comment
Нет необходимости во встроенном стиле. Просто добавьте класс в поле (возможно, используйте странное слово, которое никогда ничего не может значить для бота) и скройте его через файл CSS сайта. Как: <input type="text" name="email" class="cucaracha"> и в вашем CSS: .cucaracha { display:none; }. - person Ricardo Zea; 04.12.2012
comment
Будьте осторожны с удобством использования, поскольку пользователи, которые хотят использовать автоматическое заполнение полей плагинами или настройками браузера, могут заполнять эти поля автоматически. Тогда вы причиняете вред своим пользователям, не допуская хакеров. - person Erik Philips; 02.01.2013
comment
Вместо z-индексации ввода, как насчет того, чтобы оставить его как совершенно нормальный <input type="text" name="email" />, а затем z-индексировать что-то поверх него? - person rybo111; 05.08.2013
comment
К вашему сведению, это называется техникой приманки. Очень полезно против ботов, по-видимому, не столько против спамовых ферм, где настоящие люди взаимодействуют с вашими формами. - person pixeline; 09.03.2014
comment
@NicoBurns, это хороший аргумент, но я думаю, что очистка поля с помощью js может помочь. - person dav; 25.08.2014
comment
Я не знаю, используется ли это там, но для тех, кто обеспокоен тем, что этот метод не будет работать сейчас, когда он опубликован, просто добавьте второе поле, которое необходимо заполнить (большинство вероятно, с помощью JavaScript, например, путем копирования существующего поля при отправке, если поле пусто). Затем вы проверяете одно поле, которое должно быть пустым, и одно заполненное вашим ключом JavaScript. Без человеческого изучения кода это практически невозможно для бота. - person Sablefoste; 31.07.2017
comment
Потребуется лишь краткий анализ того, как ваш сайт выполняет вход, чтобы иметь возможность дублировать попытки аутентичного входа. - person Phil; 16.11.2017
comment
Боты обычно просто скручивают формы. Возможным вариантом может быть скрытие поля с помощью javascript. Таким же образом можно очистить любые данные автозаполнения в браузере. - person ThomasHaz; 20.02.2018

Я не думаю, что приведенный выше ответ «неправильный», но есть большие области аутентификации, которые не затрагиваются (или, скорее, акцент делается на «как реализовать сеансы cookie», а не на «какие варианты доступны и в чем заключаются сделки. -выкл ».

Предлагаемые мной правки / ответы:

  • Проблема больше в настройке учетной записи, чем в проверке пароля.
  • Использование двухфакторной аутентификации намного безопаснее, чем более умные средства шифрования паролей.
  • НЕ пытайтесь реализовать свою собственную форму входа в систему или хранилище паролей в базе данных, за исключением случаев, когда сохраняемые данные не имеют значения при создании учетной записи и создаются самостоятельно (то есть в стиле Web 2.0, таком как Facebook, Flickr и т. д.)

    1. Digest Authentication is a standards-based approach supported in all major browsers and servers, that will not send a password even over a secure channel.

Это позволяет избежать необходимости иметь «сеансы» или файлы cookie, поскольку сам браузер каждый раз повторно шифрует обмен данными. Это самый «легкий» подход к разработке.

Однако я не рекомендую этого делать, за исключением публичных недорогих услуг. Это проблема с некоторыми другими ответами выше - не пытайтесь повторно реализовать механизмы аутентификации на стороне сервера - эта проблема решена и поддерживается большинством основных браузеров. Не используйте куки. Не храните ничего в собственной созданной вручную базе данных. Просто спросите для каждого запроса, аутентифицирован ли запрос. Все остальное должно поддерживаться конфигурацией и сторонним доверенным программным обеспечением.

So ...

Во-первых, мы путаем первоначальное создание учетной записи (с паролем) с последующей повторной проверкой пароля. Если я работаю на Flickr и создаю ваш сайт впервые, у нового пользователя будет доступ к нулевому значению (пустое веб-пространство). Меня действительно не волнует, лжет ли человек, создавший учетную запись, о своем имени. Если я создаю учетную запись в интранете / экстранете больницы, ценность заключается во всех медицинских записях, и поэтому я действительно забочусь о личности (*) создателя учетной записи.

Это очень-очень сложная часть. Единственное достойное решение - это сеть доверия. Например, вы поступаете в больницу в качестве врача. Вы создаете веб-страницу, размещенную где-то с вашей фотографией, номером вашего паспорта и открытым ключом, и хешируете их все с помощью закрытого ключа. Затем вы посещаете больницу, и системный администратор просматривает ваш паспорт, проверяет, соответствует ли фотография вам, а затем хеширует хэш веб-страницы / фотографии с помощью закрытого ключа больницы. Отныне мы можем безопасно обмениваться ключами и токенами. Как и любой, кто доверяет больнице (кстати, есть секретный соус). Системный администратор также может предоставить вам ключ RSA или другую двухфакторную аутентификацию.

Но это много хлопот, и это не очень похоже на Web 2.0. Однако это единственный безопасный способ создания новых учетных записей, которые имеют доступ к ценной информации, которая не была создана самостоятельно.

  1. Kerberos и SPNEGO - механизмы единого входа с доверенным третьим лицом - в основном пользователь проверяет данные от доверенного третьего лица. (Обратите внимание: это ни в коем случае нельзя доверять OAuth)

  2. SRP - своего рода умная аутентификация по паролю без доверенной третьей стороны. Но здесь мы подходим к тому, что «безопаснее использовать двухфакторную аутентификацию, даже если это дороже».

  3. SSL на стороне клиента - предоставьте клиентам сертификат открытого ключа (поддерживается во всех основных браузерах, но вызывает вопросы над безопасностью клиентского компьютера).

В конце концов, это компромисс - какова цена нарушения безопасности по сравнению со стоимостью реализации более безопасных подходов. Однажды мы можем увидеть широкое распространение надлежащей PKI, и поэтому больше не будет собственных форм свернутой аутентификации. и базы данных. Когда-нибудь...

person Community    schedule 08.08.2011
comment
Трудно сказать, о каком ответе вы говорите в «Я не думаю, что приведенный выше ответ неверен» - person Davorak; 08.11.2012

При хешировании не используйте быстрые алгоритмы хеширования, такие как MD5 (существует множество аппаратных реализаций). Используйте что-то вроде SHA-512. Для паролей лучше использовать более медленные хеш-коды.

Чем быстрее вы создадите хэши, тем быстрее будет работать любая программа проверки методом перебора. Таким образом, более медленные хеши замедляют перебор. Медленный алгоритм хеширования сделает непрактичным перебор более длинных паролей (8 цифр +)

person Community    schedule 08.08.2011
comment
SHA-512 также работает быстро, поэтому вам потребуются тысячи итераций. - person Seun Osewa; 06.12.2011
comment
Больше похоже на что-то вроде bcrypt, который предназначен для медленного хеширования. - person Fabian Nicollier; 30.07.2014
comment
Как упоминалось в другом ответе, OWASP рекомендует использовать Argon2 в качестве первого выбора для новых приложений. Если это недоступно, вместо него следует использовать PBKDF2 или scrypt. И, наконец, если ничего из вышеперечисленного не доступно, используйте bcrypt. Ни MD5, ни какие-либо функции хеширования SHA никогда не должны использоваться для хеширования паролей. Это плохой совет. - person Mike; 12.09.2018

Мое любимое правило в отношении систем аутентификации: используйте пароли, а не пароли. Легко запомнить, трудно взломать.

Такие как:

var inputs = document.querySelectorAll('input:not([value=""])');
for (var $i = 0; $i < inputs.length; $i++) {
  inputs[$i].setAttribute('onkeydown', 'function space(e){if("Space"==e.code){e.preventDefault();document.getElementById("pass'+($i+1)+'").focus();}if("Backspace"==e.code){e.preventDefault();document.getElementById("pass'+($i - 1)+'").focus();}} space(event);');
}
<h1>Sign Up for An Account</h1>
<label for="username">Type username: <input type="text" id="username" /></label><br />
<label for="passphrase">Type passphrase:</label>
<input type="text" id="pass1" placeholder="The" />
<input type="text" id="pass2" placeholder="quick" />
<input type="text" id="pass3" placeholder="brown" />
<input type="text" id="pass4" placeholder="fox" />
<input type="text" id="pass5" placeholder="jumped" />
<input type="text" id="pass6" placeholder="over" />
<input type="text" id="pass7" placeholder="the" />
<input type="text" id="pass8" placeholder="lazy" />
<input type="text" id="pass9" placeholder="dog" />

Дополнительная информация: Ужас кодирования: пароли против парольных фраз < / а>

person Community    schedule 24.11.2012
comment
даже лучше - трудно вспомнить, трудно угадать: менеджеры паролей ... ссылка на статью 2005 года, где это, вероятно, означало таблицу Excel :) - person felickz; 29.01.2021

Я хотел бы добавить одно предложение, которое я использовал, основанное на глубокой защите. Вам не нужно иметь ту же систему авторизации и авторизации для администраторов, что и у обычных пользователей. У вас может быть отдельная форма входа на отдельный URL-адрес, выполняющий отдельный код для запросов, которые будут предоставлять высокие привилегии. Это может сделать выбор, который будет полной болью для обычных пользователей. Один из них, который я использовал, - это фактически зашифровать URL-адрес входа для доступа администратора и отправить администратору новый URL-адрес по электронной почте. Сразу же останавливает любую атаку методом грубой силы, так как ваш новый URL-адрес может быть сколь угодно сложным (очень длинная случайная строка), но единственное неудобство вашего администратора - это переход по ссылке в его электронном письме. Злоумышленник больше не знает, куда делать POST.

person Community    schedule 18.07.2015
comment
Простая ссылка в электронном письме на самом деле небезопасна, поскольку электронная почта небезопасна. - person David Spector; 24.06.2018
comment
Это так же безопасно, как и любая другая система сброса пароля на основе токенов, хотя и не двухфакторная. А это почти все. - person Iain Duncan; 24.06.2018

Я не знаю, лучше ли было ответить на это как ответ или как комментарий. Я выбрал первый вариант.

Что касается позиции ЧАСТЬ IV: Функциональность забытого пароля в первом ответе, я хотел бы отметить атаки по времени.

В формах Запомнить свой пароль злоумышленник потенциально может проверить полный список электронных писем и определить, какие из них зарегистрированы в системе (см. Ссылку ниже).

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

https://crypto.stanford.edu/~dabo/papers/webtiming.pdf

person Community    schedule 16.08.2015

Хочу добавить один очень важный комментарий: -

  • «В корпоративной внутренней сети» большая часть, если не все вышеперечисленное, может не применяться!

Многие корпорации развертывают веб-сайты «только для внутреннего использования», которые, по сути, являются «корпоративными приложениями», которые были реализованы через URL-адреса. Эти URL-адреса могут (предположительно ...) разрешаться только во "внутренней сети компании". (Какая сеть волшебным образом включает в себя всех подключенных к VPN "воинов дороги".)

Когда пользователь надлежащим образом подключен к вышеупомянутой сети, его личность («аутентификация») [уже ...] «окончательно известна», как и их разрешение («авторизация») для выполнения определенных действий ... например ... "доступа к этому веб-сайту".

Эта услуга «аутентификация + авторизация» может быть предоставлена ​​несколькими различными технологиями, такими как LDAP (Microsoft OpenDirectory) или Kerberos.

С вашей точки зрения вы просто знаете следующее: что любой, кто законно заходит на ваш веб-сайт, должен сопровождаться [переменной среды, волшебным образом содержащей .. .] «жетон». (т.е. Отсутствие такого токена должно быть непосредственным основанием для 404 Not Found.)

Значение токена не имеет для вас никакого смысла, но, если возникнет необходимость, «существуют соответствующие средства», с помощью которых ваш веб-сайт может «[авторитетно] спросить кого-то, кто знает (LDAP ... и т. Д.)» по любому и каждому (!) вопросу, который может у вас возникнуть. Другими словами, вы не пользуетесь какой-либо «доморощенной логикой». Вместо этого вы спрашиваете Власть и безоговорочно доверяете ее вердикту.

Ага ... это довольно мысленный переход от "безумного Интернета".

person Community    schedule 29.04.2015
comment
Вы хорошо разбирались в пунктуации в детстве? :) Я прочитал это три раза и до сих пор не понимаю, в какой момент вы пытаетесь понять. Но если вы говорите, что иногда вам не нужна аутентификация на основе форм, вы правы. Но учитывая, что мы обсуждаем, когда это действительно нужно, я не понимаю, почему это так важно отметить? - person Hugo Delsing; 29.04.2015
comment
Я хочу сказать, что мир вне корпорации полностью отличается от мира внутри. Если вы создаете приложение, доступное для широкой сети и для общего пользования публично, то у вас нет выбора, кроме как использовать собственные методы аутентификации и авторизации. Но внутри корпорации, где единственный способ попасть туда - это быть там или использовать VPN, тогда очень вероятно, что приложение не будет иметь - не должно - своих собственных методов для выполнения эти вещи. Приложение должно использовать эти методы вместо этого для обеспечения согласованного централизованного управления. - person Mike Robinson; 30.04.2015
comment
Даже внутрикорпоративные сети требуют минимального уровня безопасности в здании. Продажи имеют конфиденциальные данные о прибылях и убытках, а инженерные разработки являются конфиденциальной интеллектуальной собственностью. Многие компании ограничивают данные по подразделениям или подразделениям. - person Sablefoste; 31.07.2017

Используйте OpenID Connect или Доступ, управляемый пользователем.

Ведь нет ничего эффективнее, чем вообще этого не делать.

person Community    schedule 10.08.2016