簡體   English   中英

語句始終返回false

[英]The statement always return false

我為登錄系統編寫了該語句,但該語句不起作用,提取功能正常運行,因為如果我嘗試回顯$ hash,它看起來還不錯,但是如果我嘗試此驗證語句,即使輸入也總是返回false在數據庫中是相同的,數據庫看起來很好,它具有varchar(255),這是我的代碼

<?php

if(isset($_POST['submit'])){
    include 'database.php';
    $uid = mysqli_real_escape_string($conn,$_POST['uid']);
    $pass = mysqli_real_escape_string($conn,$_POST['pass']);

    $query = "SELECT * FROM user WHERE username ='$uid'";
    $tbl = mysqli_query($conn, $query);
    if (mysqli_num_rows($tbl)>0){

        $row = mysqli_fetch_array($tbl, MYSQLI_ASSOC);
        $hash = $row['password'];
        if (password_verify($pass, $hash)){
            echo "success";
        } else {
            echo "log in error";
        }
    }
}

編輯

我刪除了mysqli_real_escape_string,但仍返回false,這里是新代碼,我從數據庫中選擇全部以驗證用戶名,因此,如果輸入中的用戶名或密碼位於數據庫內部,則用戶將被重定向到錯誤的密碼頁

<?php

if(isset($_POST['submit'])){
    include 'database.php';
$uid = $_POST['uid'];
$pass = $_POST['pass'];

$query = "SELECT * FROM user WHERE username ='$uid'";
$tbl = mysqli_query($conn, $query);
if (mysqli_num_rows($tbl)>0){

    $row = mysqli_fetch_array($tbl, MYSQLI_ASSOC);
    $hash = $row['password'];
     if (password_verify($pass, $hash)){
         echo "success";
     }
     else {
         echo "log in error";
     }

}
}

我有一個注冊頁面,這是我進行哈希處理的位置,然后將其存儲在數據庫中,這是我的代碼

$sql = "SELECT * FROM 'user' WHERE username ='$uid'";
    $result = mysqli_query($conn, $sql);
    $resultCheck = mysqli_num_rows($result);
}
  if ($resultCheck > 0) {
    header("Location:.../user.add.php?the inputs are already taken");
    exit();
  }
  else {
      $hashedpass = password_hash($pwd, PASSWORD_DEFAULT);
      //insert the new user to the user database
      $sql = "INSERT INTO user (userID, username, password)
      VALUES (NULL, '$uid', '$hashedpass');";
      $result = mysqli_query($conn, $sql);
      header("Location:../user.add.php?success sir");
    exit();
  }

您可能會在比較之前修改密碼:

$pass = mysqli_real_escape_string($conn,$_POST['pass']);

在某些情況下,這不會有所作為,但在某些情況下會有所不同。

如果我嘗試回顯$ hash,它看起來很好

對於人類來說,在網頁上輸出可能看起來很直觀,但這是否意味着兩個值是二進制等效的? 並非總是如此,代碼的結果似乎恰好表明了這一點。

由於您不在SQL查詢中使用此值,因此無需轉義它:

$pass = $_POST['pass'];

旁注:無論如何,您都不應依賴轉義輸入來在SQL查詢中使用。 相反,請不要在查詢中首先使用用戶可修改的值作為代碼。 請改用查詢參數 一個通常鏈接的堆棧溢出問題提供了一些出色的示例和解釋,可以幫助您入門。 從長遠來看,您的代碼將更安全,更穩定,更易於調試和維護。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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