Как создать безопасную систему входа в систему, используя куки и сессии? - PullRequest
4 голосов
/ 23 апреля 2011

У меня есть таблица mysql с идентификатором пользователя, именами пользователей и паролями, и если указанный пароль совпадает с данным именем пользователя, я создаю 3 файла cookie:

  • * 1004 Идентификатор_пользователя *
  • имя пользователя
  • userpassword (md5) - я создаю его, потому что перепроверяю пароль и имя пользователя из файлов cookie, когда пользователь сохраняет важные настройки (не прося пользователя заполнить формы).

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

И, пожалуйста, объясните код, потому что я новичок в PHP. О, и я хочу запоминать пользователей на долгое время, я не люблю сайты, на которых мне нужно каждый раз входить в систему. Пожалуйста, помогите мне и объясните мне, почему метод более безопасен, чем другие?

Спасибо!

Спасибо за ваши ответы! Мне нужно ответить на мой вопрос: мой веб-сайт не требует более высокой безопасности, чем простой форум, поэтому кто-нибудь может предоставить код, который имеет только базовый уровень безопасности?

Ответы [ 3 ]

3 голосов
/ 23 апреля 2011

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

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

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

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

Таким образом, вы можете написать:

$_SESSION['username'] = 'bob';

И затемна другой странице:

echo 'Hello, ' . $_SESSION['username'];

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

Однако это не означает, что сеансы по своей природе полностью безопасны.Сеансы работают путем сохранения «ключа сеанса» в файле cookie, поэтому мой ключ может быть «946433D47A824675DCB87AA372F31A7D9B255530F87A79264E416C253E9AB00E».Каждый раз, когда я захожу на страницу, PHP извлекает все данные $_SESSION, связанные с этим ключом, и делает их доступными для вас.

Но если кто-то обнаружит этот ключ (снова, скажем, просматривая файлы cookie моего браузера)или просто «подслушав» запрос, который я делаю на сервер через открытую сеть Wi-Fi), они могут отправить тот же ключ, и PHP с радостью предоставит им доступ к моему сеансу.

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

0 голосов
/ 23 апреля 2011

использование функции md5() в php небезопасно до тех пор, пока вы не используете ssl-соединение, потому что эта функция php шифруется только после того, как значения формы возвращаются на сервер. Таким образом, пароль, который вы думали о зашифрованном, передается в текстовом формате по сети. Его можно перехватить во время передачи, поскольку элементы формы передаются в текстовом формате. Чтобы избавиться от этой лазейки безопасности, вы можете зашифровать пароль на уровне клиента. такие как использование JavaScript. Такие коды JavaScript легко доступны в Интернете, например http://phpjs.org/functions/md5:469

Чтобы сделать его более безопасным, вы можете применить md5 на уровне клиента несколько раз, например, 2 раза.

0 голосов
/ 23 апреля 2011
<?php
session_start();

$pwd=sha1($_POST['pwd']);
$login=$_post['username'];

 $stmt = mysqli_prepare($con, "SELECT UID from LOGIN where userName=? and password=?");
 mysqli_stmt_bind_param($stmt, "ss", $login,$pwd);
 mysqli_stmt_execute($stmt);
 mysqli_stmt_bind_result($stmt, $uid);
 mysqli_stmt_fetch($stmt);
 mysqli_stmt_close($stmt);
 if (!is_null($uid))
 $_SESSION['uid']=$uid;
?>

используйте SHA1, потому что он лучше, чем md5 и быстрее!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...