PHP / MySQL безопасный вход и сеансы - PullRequest
5 голосов
/ 20 августа 2010

У меня есть сервис входа в систему на моем текущем веб-сайте, и мне было интересно, есть ли какой-то конкретный метод, который вы можете назвать MOST Secure?

Позвольте мне объяснить мою систему немного лучше:

В настоящее время у меня есть база данных PHP MySQL с таблицей пользователей. Имя пользователя и пароль хранятся как VARCHAR (не самый лучший для паролей, которые я знаю).

На стороне формы регистрации я регулирую выбор паролей и имен пользователей, разрешая только ввод -Z 0-9 и ограничивая количество символов. Что касается формы входа в систему, я прекращаю атаки с помощью mysql_real_escape_string и использую POST для iFrame вместо AJAX.

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

Учитывая то, что я описал, что бы вы посоветовали в плане дополнительной безопасности и почему? Какие методы вы выбрали для предотвращения взлома и атак? Видите ли вы какие-то явные дыры в безопасности в том, что я описал? Возможно, самое главное, что я мог сделать, чтобы исправить это, учитывая, что я не был в игре по веб-разработке долго и не имел большого опыта?

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

Ответы [ 4 ]

5 голосов
/ 20 августа 2010

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

$password = md5($yoursalt . $_POST['password']);

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

3 голосов
/ 20 августа 2010

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

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

Вы также можете заблокировать учетную запись на определенный период после 3 неправильных попыток и даже пойти так далеко, чтобы заблокировать IP-адрес после 10 попыток.Хотя позже подпадает под категорию «смоляные ямы».Хакерам просто немного сложнее.

1 голос
/ 20 августа 2010

Что касается вашего SQL, не используйте строковые функции, такие как mysql_real_escape_string, которые все еще могут позволить инъекционные атаки при некоторых обстоятельствах. Используйте параметризованные запросы, таким образом гарантируя, что база данных обрабатывает всю предоставленную пользователем строку как данные при ВСЕХ обстоятельствах, а не, возможно, как фрагменты кода SQL.

Библиотеки MySQLi и PDO в PHP поддерживают параметризованные запросы.

1 голос
/ 20 августа 2010

Я всегда использую соль пользователя при генерации паролей, поэтому в моей таблице «пользователи» есть два поля «encrypted_salt» и «password»

сверху и снизу это то, что я sha1 (encrypted_salt + 'password');

При генерации encrypted_salt я бы использовал sha1 (unqid (true)); который генерирует почти 100% уникальную соль, поскольку использует время для миллисекунд с дополнительной собственной энтропией (солью). Вероятность получения дубликата практически равна 0.

Итак:

$salt = sha1(unqid(true));
$password = sha1($_POST['password']);

сохранить в БД как:

$pw = sha1($salt.$password); or sha1($password.$salt);

Это не имеет значения.

Прелесть SHA1 в том, что он всегда генерирует строку из 40 символов. Чем больше вы можете посолить строку, тем лучше, особенно если вы можете создать уникальную соль для каждого пароля.

...