[英]Regarding the while loop in the login.php
在使用此堆棧文章解決password_verify問題后,我有一個問題: 如何在PHP中使用password_verify函數
說我有這個登錄表格:
<?php
session_start();
if ($_SERVER['REQUEST_METHOD'] == 'GET') { ?>
<form id="signin_frm" name="signinFrm" action="<?php echo htmlentities($_SERVER['SCRIPT_NAME']) ?>" method="post">
<label class="label-first" for="email">Email</label>
<input id="email" type="email" name="login_email" placeholder="Someone@example.com" required>
<label for="pswd">Password</label>
<input id="pswd" type="password" name="login_password" placeholder="Password" required>
<fieldset>
<input class="btn" type="submit" value="Sign-Up">
</fieldset>
</form>
<?php } else {
$email = $_POST['login_email'];
$password = $_POST['login_password'];
$find_pswd = "SELECT password FROM UserLogin WHERE email = '$email';";
$query = mysqli_query($link, $find_pswd);
while ($row = mysqli_fetch_array($query)) {
$user_pass = $row['password'];
$verify_pass = password_verify($password, $user_pass);
}
if ($verify_pass === false) {
echo "Invalid Password";
}
mysqli_free_result($query);
}
?>
如果通過mysql查詢,我已經從表中檢索了一個奇異值,為什么必須使用While循環才能使密碼驗證有效(verify_password()返回true)? 有沒有更簡單的方法可以做到這一點?
在實施while循環之前,我有以下幾點:
<?php } else {
$email = $_POST['login_email'];
$password = $_POST['login_password'];
$find_pswd = "SELECT password FROM UserLogin WHERE email = '$email';";
$query = mysqli_query($link, $find_pswd);
$pswd_fetch = mysqli_fetch_array($query);
if (password_verify($password, $pswd_fetch) === false) {
echo "Invalid Password";
}
mysqli_free_result($query);
}
?>
謝謝! 除了這個問題之外,請隨時提出其他建議以改進此代碼。 我希望保持登錄相當簡單,因為我僅向用戶提供編輯不太敏感的信息的方法。
注意:數據庫中的密碼是哈希(BCrypt)。 感謝那些提到哈希的人!
如果您未加密密碼,則只需查詢表中的用戶名和密碼,它應返回1的計數。請參見下面的代碼,這是我開始對密碼進行哈希處理之前所使用的代碼。
<?php
$host="127.0.0.1"; // Host name
$username="root"; // Mysql username
$password="password"; // Mysql password
$db_name="db_name"; // Database name
$tbl_name="tbl_name"; // Table name
// Connect to server and select database.
$con=mysqli_connect("$host","$username","$password","$db_name");
// Check connection
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
// username and password sent from form
$myusername=$_POST['myusername'];
$mypassword=$_POST['mypassword'];
// To protect MySQL injection (more detail about MySQL injection)
$myusername = stripslashes($myusername);
$mypassword = stripslashes($mypassword);
$myusername = mysqli_real_escape_string($con, $myusername);
$mypassword = mysqli_real_escape_string($con, $mypassword);
$result = mysqli_query($con,"SELECT * FROM $tbl_name
WHERE username='$myusername' and password='$mypassword'");
// Mysql_num_row is counting table row
$count=mysqli_num_rows($result);
// If result matched $myusername and $mypassword, table row must be 1 row
if($count==1)
{
session_start();
// Register $myusername, $mypassword and redirect to file "stud.php"
$_SESSION['myusername'] = $myusername;
$_SESSION['mypassword'] = $mypassword;
header("location:stud.php");
exit();
}
else
{
header("location:main_login_error.php");
exit();
}
mysqli_close($con);
?>
就像Marc B所說的那樣,您不需要進行While循環。
如果有人想對您的網站/數據庫做些努力,那么在查詢數據庫之前也要避免用戶輸入數據,以免注入,這也是一個好主意。
$email = mysqli_real_escape_string($_POST['login_email']);
您也可以這樣做:
if ($_SERVER['REQUEST_METHOD'] == 'GET')
你可以有:
if(!isset($_POST)){
//Show form
}
else {
//Query DB With POST details
}
謝謝您到目前為止所收到的意見。 這只是為了確認和澄清,因為我只是依靠其他職位為我提供幫助。 由於有兩條注釋確認在檢索一個值的情況下不需要While循環,因此我回過頭來替換了它:
while ($row = mysqli_fetch_array($query)) {
$user_pass = $row['password'];
$verify_pass = password_verify($password, $user_pass);
}
有了這個:
$row = mysqli_fetch_array($query);
$user_pass = $row['password'];
$verify_pass = password_verify($password, $user_pass);
一切正常。 在優化此文件時,我將考慮所有與一般代碼有關的所有其他建議(例如避免注入的代碼),因為我仍然需要為$ _SESSION方法等添加代碼。 如果該帖子仍然允許,我將在必要時接受任何其他建議。
再次感謝!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.