Я хочу переписать свои сценарии входа для сайтов клиентов, чтобы сделать их более безопасными. Я хочу знать, какие лучшие практики я могу применить в этом. Защищенные паролем панели управления имеются в изобилии, но очень немногие, по-видимому, применяют лучшие практики с точки зрения написания кода, скорости и безопасности.
Я буду использовать PHP и базу данных MYSQL.
Раньше я использовал md5, но я вижу, что sha256 или sha512 будут лучше (вместе с безопасным хешем и солью).
Некоторые сценарии входа регистрируют IP-адрес в течение сеанса или даже пользовательский агент, но я хочу избежать этого, поскольку он не совместим с прокси-серверами.
Я также немного отстаю от лучших практик использования сессий в PHP 5 (последний раз, когда я читал, был PHP 4), так что некоторые лучшие практики с этим были бы полезны.
Спасибо.
источник
Ответы:
Лучшая мысль - не изобретать велосипед. Но, как я понимаю, в мире PHP может быть трудно найти высококачественный компонент, который уже это делает (даже я уверен, что фреймворки реализуют такие вещи, и их реализации уже протестированы, надежны, проверены на код и т. Д.). )
Если по каким-то причинам вы не можете использовать фреймворк, вот несколько советов:
Предложения по безопасности
Используйте PBKDF2 или Bcrypt, если можете . Это сделано для этого.
Обоснование: оба алгоритма могут сделать процесс хеширования сколь угодно медленным, а это именно то, что вам нужно при хешировании паролей (более быстрые альтернативы означают более простую грубую силу). В идеале вам следует настроить параметры таким образом, чтобы процесс становился все медленнее и медленнее со временем на одном и том же оборудовании, в то время как выпускается новое, более быстрое оборудование.
Если вы не можете, по крайней мере , не используйте MD5 / SHA1. Никогда. Забудь об этом . Используйте вместо этого SHA512, например. Используйте соль тоже.
Обоснование: MD5 и SHA1 слишком быстрые. Если злоумышленник имеет доступ к вашей базе данных, содержащей хэши, и имеет (даже не особенно) мощную машину, взлом паролей происходит быстро и легко. Если нет никаких солей, вероятность того, что злоумышленник найдет действительный пароль, возрастет (что может нанести дополнительный вред, если пароль был повторно использован где-то еще).
В PHP 5.5.0 и более поздних версиях используйте
password_hash
иpassword_verify
.Обоснование: вызвать функцию, предоставляемую платформой, легко, поэтому риск ошибиться уменьшается. С этими двумя функциями вам не нужно думать о различных параметрах, таких как хеш. Первая функция возвращает одну строку, которая затем может быть сохранена в базе данных. Вторая функция использует эту строку для проверки пароля.
Защитите себя от грубой силы . Если пользователь отправляет неверный пароль, когда он уже отправил другой неверный пароль 0,01 секунды назад, это хорошая причина заблокировать его. В то время как человеческие существа могут вводить быстро, они , вероятно , не может быть , что быстро.
Еще одна защита - установить ограничение на количество отказов в час. Если пользователь отправил 3600 неправильных паролей в час, 1 пароль в секунду, трудно поверить, что это законный пользователь.
Обоснование: если ваши пароли хешируются небезопасным способом, грубая сила может быть очень эффективной. Если пароли хранятся безопасно, грубая сила все еще тратит ресурсы вашего сервера и пропускную способность сети, что приводит к снижению производительности для законных пользователей. Обнаружение грубой силы нелегко развить и получить правильно, но для любой, кроме крошечной системы, оно того стоит.
Не просите пользователей менять свои пароли каждые четыре недели. Это очень раздражает и снижает безопасность, так как поощряет безопасность после ее завершения.
Обоснование: идея о том, что принудительное изменение паролей каждые n недель защищает систему от перебора, ошибочна. Атаки грубой силой обычно успешны в течение нескольких секунд, минут, часов или дней, что делает ежемесячные изменения пароля несущественными. С другой стороны, пользователи плохо запоминают пароли. Кроме того, если им необходимо изменить их, они либо попытаются использовать очень простые пароли, либо просто запомнят свои пароли на пост-своей.
Аудит все, каждый раз. Храните входы в систему, но никогда не сохраняйте пароли в журнале аудита. Убедитесь, что журнал аудита не может быть изменен (т.е. вы можете добавлять данные в конце, но не изменять существующие данные). Убедитесь, что журналы аудита подлежат регулярному резервному копированию. В идеале журналы должны храниться на выделенном сервере с очень ограниченным доступом: если взломан другой сервер, злоумышленник не сможет стереть журналы, чтобы скрыть свое присутствие (и путь, выбранный во время атаки).
Не запоминайте учетные данные пользователя в файлах cookie, если только пользователь не просит сделать это (флажок «Запомнить меня» должен быть по умолчанию снят, чтобы избежать человеческих ошибок).
Простота использования предложений
<span/>
. Браузеры не могут заполнить поле пароля в этом случае (по крайней мере, Firefox не может этого сделать), поэтому он вынужден выйти из системы, а затем войти в систему с помощью обычной формы, заполненной браузером.источник
bcrypt
это делают люди с высокой квалификацией. Это также проверено, проверено и т. Д. Так что нет смысла реализовывать то же самое самостоятельно. Это похоже на создание собственного алгоритма криптографии для вашего сайта. * «Почему бы не md5 / sha1?»: См., Например, en.wikipedia.org/wiki/MD5#Securitybcrypt
если возможно. В противном случае используйте другой вид повторного хэша.mysql_real_escape_string
. Никогда не используйте конкатенацию строк для создания вашего запроса. Используйте подготовленные, параметризованные запросы. Большинство, если не все, драйверы БД для PHP поддерживают это. Если вы не знаете , как это сделать, потратить некоторое время на обучение , какprepare
,bind
и сexecute
использованием любых DB вы используете. Это единственный верный способ защитить себя от SQL-инъекций. PDO поддерживает это.источник
mysql_real_escape_string
это ложная безопасность - это не гарантия. Параметризованные запросы есть.Используйте соленый односторонний хеш (предпочтительно SHA512, используя http://au2.php.net/manual/en/function.hash.php ) ... таким образом, если кто-то взломает вашу базу данных, даже если он знает соль они не могут извлечь пароли (без радужной таблицы, которая была бы слишком длинной для SHA512).
Используйте HTTPS.
Не посылайте подтверждения имени пользователя / пароля по электронной почте обратно пользователю при регистрации.
Если вы разрешаете куки для «Запомнить меня» - добавьте дополнительный логин для доступа к функциям администрирования и редактирования профиля.
Если пользователь неверно вводит пароль, не говорите, что он неверно вводил пароль (скажем, он всегда вводил «неправильное имя пользователя или пароль») - таким образом, меньше подсказок о том, какие действительные имена пользователей.
Попробуйте ввести псевдоним вместо входа в систему - таким образом, меньше пользователей будут отображать свое имя пользователя в списках пользователей.
источник
источник
Вот один совет: убедитесь, что ваши файлы cookie не доступны с помощью JS, чтобы предотвратить кражу, см. Статью « Защита файлов cookie»: статья HttpOnly Джеффа Этвуда
источник