簡體   English   中英

關於login.php中的while循環

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM