У меня есть сайт, где я программирую систему регистрации / входа в систему с помощью bcrypt. Я успешно вставил регистрационные данные с хешированным паролем в базу данных. Моя проблема заключается в том, как аутентифицировать пользователя, используя этот хешированный пароль. Ниже приведены коды, которые я использовал:
Действие регистрации:
<? ob_start();//Start buffer output ?> <html> <head> <title>MySite: Registration Action</title> </head> <font face="arial"> <?php session_start(); if(isset($_POST["captcha"])&&$_POST["captcha"]!=""&&$_SESSION["code"]==$_POST["captcha"]) { //echo "Correct Code Entered"; //Do req stuff $host="host"; // Host name $username="username"; // Mysql username $password="password"; // Mysql password $db_name="db"; // Database name $tbl_name="tbl"; // Table name // Connect to server and select database. mysql_connect("$host", "$username", "$password")or die("cannot connect"); mysql_select_db("$db_name")or die("cannot select DB"); // Get values from form $myusername=mysql_real_escape_string($_POST['myusername']); $mypassword=mysql_real_escape_string($_POST['mypassword']); $myemail=mysql_real_escape_string($_POST['myemail']); $mysecrquest=mysql_real_escape_string($_POST['mysecrquest']); $mysecransw=mysql_real_escape_string($_POST['mysecransw']); $mypassword_rep=mysql_real_escape_string($_POST['mypassword_rep']); $myemail_rep=mysql_real_escape_string($_POST['myemail_rep']); $mysecransw_rep=mysql_real_escape_string($_POST['mysecransw_rep']); $salt = '$2a$18$' . substr(md5(uniqid(rand(), true)), 0, 22); $encpass = crypt($mypassword, $salt); //validate input if (( !empty($myusername) && !empty($mypassword) && !empty($myemail) && !empty($mysecrquest) && !empty($mysecransw) ) && (($mypassword_rep==$mypassword)&&($myemail_rep==$myemail)&&($mysecransw_rep==$mysecransw))) { // Insert data into mysql $sql="INSERT INTO $tbl_name(username, salt, password, email, secrquest, secransw)VALUES('$myusername', '$salt', '$encpass', '$myemail', '$mysecrquest', '$mysecransw')"; $result=mysql_query($sql); // if successfully insert data into database, displays message "Successful". if($result){ echo "<center><font color='green'>Congratulations! Your registration was Successful</font></center>"; echo "<BR>"; echo "<center><a href='somepage.php'>Somepage</a></center>"; } } else { echo "<center><font color='red'>You have one or more invalid entries: Your Registration was not successful</font></center>"; echo "<br>"; echo "<center><a href='regpage.php'>Back</a></center>"; } } else { echo "<center><font color='red'>Wrong Captcha: Your Registration was not successful</font></center>"; echo "<br>"; echo "<center><a href='regpage.php'>Back</a></center>"; } ?> <?php // close connection //mysql_close(); ?> </font> </html> <? ob_flush();//Flush buffer output ?>
Вход Действие:
<? ob_start();//Start buffer output ?> <html> <head> <title>MySite: Login Action</title> </head> <font face="arial"> <?php session_start(); if(isset($_POST["captcha"])&&$_POST["captcha"]!=""&&$_SESSION["code"]==$_POST["captcha"]) { // echo "<font color='green'>Correct Code Entered</font>"; //Do req stuff $host="host"; // Host name $username="username"; // Mysql username $password="password"; // Mysql password $db_name="db"; // Database name $tbl_name="tblx"; // Table name $tbl_name2="tbl"; // Table name 2 // Connect to server and select database. mysql_connect("$host", "$username", "$password")or die("cannot connect"); mysql_select_db("$db_name")or die("cannot select DB"); // Get values from form $myusername=mysql_real_escape_string($_POST['myusername']); $mypassword=mysql_real_escape_string($_POST['mypassword']); // Validate the login $sql2="SELECT * FROM $tbl_name2 WHERE username='$myusername'"; $result2=mysql_query($sql2); $row=mysql_fetch_assoc($result2); //$count=mysql_num_rows($result2); // If result matched $myusername and $mypassword, table row must be 1 row //if($count==1) //$salt = '$2a$18$' . substr(md5(uniqid(rand(), true)), 0, 22); $encpass = crypt($mypassword, $salt); if ($encpass == $row['password']) { session_start(); $_SESSION['myusername'] = $myusername; header ("Location: memberspage.php"); } else { echo "<center><font color='red'>Invalid Login Details. Not Logged In.</font></center>"; echo "<br>"; echo "<center><font color='red'>Please go back and try again.</font></center>"; echo "<br>"; echo "<center><a href='loginpage.php'>Back</a></center>"; } } else { echo "<center><font color='red'>Wrong Captcha. Not Logged In.</font></center>"; echo "<br>"; echo "<center><font color='red'>Please go back and try again.</font></center>"; echo "<br>"; echo "<center><a href='loginpage.php'>Back</a></center>"; } ?> <?php // close connection //mysql_close(); ?> </font> </html> <? ob_flush();//Flush buffer output ?>
на<? ob_start();//Start buffer output ?> <html> <head> <title>MySite: Login Action</title> </head> <font face="arial"> <?php session_start(); if(isset($_POST["captcha"])&&$_POST["captcha"]!=""&&$_SESSION["code"]==$_POST["captcha"]) { // echo "<font color='green'>Correct Code Entered</font>"; //Do req stuff $host="host"; // Host name $username="username"; // Mysql username $password="password"; // Mysql password $db_name="db"; // Database name $tbl_name="tblx"; // Table name $tbl_name2="tbl"; // Table name 2 // Connect to server and select database. mysql_connect("$host", "$username", "$password")or die("cannot connect"); mysql_select_db("$db_name")or die("cannot select DB"); // Get values from form $myusername=mysql_real_escape_string($_POST['myusername']); $mypassword=mysql_real_escape_string($_POST['mypassword']); // Validate the login $sql2="SELECT * FROM $tbl_name2 WHERE username='$myusername'"; $result2=mysql_query($sql2); $row=mysql_fetch_assoc($result2); //$count=mysql_num_rows($result2); // If result matched $myusername and $mypassword, table row must be 1 row //if($count==1) //$salt = '$2a$18$' . substr(md5(uniqid(rand(), true)), 0, 22); $encpass = crypt($mypassword, $salt); if ($encpass == $row['password']) { session_start(); $_SESSION['myusername'] = $myusername; header ("Location: memberspage.php"); } else { echo "<center><font color='red'>Invalid Login Details. Not Logged In.</font></center>"; echo "<br>"; echo "<center><font color='red'>Please go back and try again.</font></center>"; echo "<br>"; echo "<center><a href='loginpage.php'>Back</a></center>"; } } else { echo "<center><font color='red'>Wrong Captcha. Not Logged In.</font></center>"; echo "<br>"; echo "<center><font color='red'>Please go back and try again.</font></center>"; echo "<br>"; echo "<center><a href='loginpage.php'>Back</a></center>"; } ?> <?php // close connection //mysql_close(); ?> </font> </html> <? ob_flush();//Flush buffer output ?>
на<? ob_start();//Start buffer output ?> <html> <head> <title>MySite: Login Action</title> </head> <font face="arial"> <?php session_start(); if(isset($_POST["captcha"])&&$_POST["captcha"]!=""&&$_SESSION["code"]==$_POST["captcha"]) { // echo "<font color='green'>Correct Code Entered</font>"; //Do req stuff $host="host"; // Host name $username="username"; // Mysql username $password="password"; // Mysql password $db_name="db"; // Database name $tbl_name="tblx"; // Table name $tbl_name2="tbl"; // Table name 2 // Connect to server and select database. mysql_connect("$host", "$username", "$password")or die("cannot connect"); mysql_select_db("$db_name")or die("cannot select DB"); // Get values from form $myusername=mysql_real_escape_string($_POST['myusername']); $mypassword=mysql_real_escape_string($_POST['mypassword']); // Validate the login $sql2="SELECT * FROM $tbl_name2 WHERE username='$myusername'"; $result2=mysql_query($sql2); $row=mysql_fetch_assoc($result2); //$count=mysql_num_rows($result2); // If result matched $myusername and $mypassword, table row must be 1 row //if($count==1) //$salt = '$2a$18$' . substr(md5(uniqid(rand(), true)), 0, 22); $encpass = crypt($mypassword, $salt); if ($encpass == $row['password']) { session_start(); $_SESSION['myusername'] = $myusername; header ("Location: memberspage.php"); } else { echo "<center><font color='red'>Invalid Login Details. Not Logged In.</font></center>"; echo "<br>"; echo "<center><font color='red'>Please go back and try again.</font></center>"; echo "<br>"; echo "<center><a href='loginpage.php'>Back</a></center>"; } } else { echo "<center><font color='red'>Wrong Captcha. Not Logged In.</font></center>"; echo "<br>"; echo "<center><font color='red'>Please go back and try again.</font></center>"; echo "<br>"; echo "<center><a href='loginpage.php'>Back</a></center>"; } ?> <?php // close connection //mysql_close(); ?> </font> </html> <? ob_flush();//Flush buffer output ?>
на<? ob_start();//Start buffer output ?> <html> <head> <title>MySite: Login Action</title> </head> <font face="arial"> <?php session_start(); if(isset($_POST["captcha"])&&$_POST["captcha"]!=""&&$_SESSION["code"]==$_POST["captcha"]) { // echo "<font color='green'>Correct Code Entered</font>"; //Do req stuff $host="host"; // Host name $username="username"; // Mysql username $password="password"; // Mysql password $db_name="db"; // Database name $tbl_name="tblx"; // Table name $tbl_name2="tbl"; // Table name 2 // Connect to server and select database. mysql_connect("$host", "$username", "$password")or die("cannot connect"); mysql_select_db("$db_name")or die("cannot select DB"); // Get values from form $myusername=mysql_real_escape_string($_POST['myusername']); $mypassword=mysql_real_escape_string($_POST['mypassword']); // Validate the login $sql2="SELECT * FROM $tbl_name2 WHERE username='$myusername'"; $result2=mysql_query($sql2); $row=mysql_fetch_assoc($result2); //$count=mysql_num_rows($result2); // If result matched $myusername and $mypassword, table row must be 1 row //if($count==1) //$salt = '$2a$18$' . substr(md5(uniqid(rand(), true)), 0, 22); $encpass = crypt($mypassword, $salt); if ($encpass == $row['password']) { session_start(); $_SESSION['myusername'] = $myusername; header ("Location: memberspage.php"); } else { echo "<center><font color='red'>Invalid Login Details. Not Logged In.</font></center>"; echo "<br>"; echo "<center><font color='red'>Please go back and try again.</font></center>"; echo "<br>"; echo "<center><a href='loginpage.php'>Back</a></center>"; } } else { echo "<center><font color='red'>Wrong Captcha. Not Logged In.</font></center>"; echo "<br>"; echo "<center><font color='red'>Please go back and try again.</font></center>"; echo "<br>"; echo "<center><a href='loginpage.php'>Back</a></center>"; } ?> <?php // close connection //mysql_close(); ?> </font> </html> <? ob_flush();//Flush buffer output ?>
Любая помощь приветствуется. Благодарю.
Я предлагаю использовать встроенные функции password_xxx()
PHP. Они явно разработаны, чтобы упростить работу с хэшированием паролей с использованием bcrypt. Вам не нужно думать ни о чем другом, кроме вызова функции password_verify()
чтобы проверить попытку входа в систему и password_hash()
при создании учетной записи. Легко.
Это самый простой способ работы с паролями в PHP.
Обратите внимание, что эти функции доступны только в последней версии PHP (v5.5). Однако есть библиотека обратной совместимости, которую вы можете загрузить, что заставляет их работать одинаково во всех поддерживаемых в настоящее время версиях PHP (т. Е. V5.3 и 5.4).
Надеюсь, это поможет.
При всем этом уважении: ваш код полон ошибок, устаревших вещей и, следовательно, очень небезопасных. Я бы порекомендовал использовать профессиональный, проверенный и чистый сценарий входа в систему, а не дальше с вашим кодом.
$salt = '$2a$18$' . substr(md5(uniqid(rand(), true)), 0, 22);
полностью устарел и больше не уверен. $2a
-algorithmns являются «слабыми» алгоритмами, даже если они соленые.
mysql_
устарел и никогда не должен использоваться.
<font face="arial">
устарел с 1999 года, остальная часть вашего кода также может быть с этого времени.
Sooo, в результате: посмотрите на официальную библиотеку совместимости паролей PHP здесь: https://github.com/ircmaxell/password_compat и создайте свою систему входа в систему с помощью сексуальных простых функций. Или используйте установленную систему входа, как здесь: https://github.com/panique/php-login
bcrypt использует соль для каждой строки, что означает, что вам нужно проверить что там, а не генерировать новую соль и сравнивать.
для получения дополнительной информации Как вы используете bcrypt для хеширования паролей в PHP?