2016-06-09 121 views
1

所以即時登錄遊戲系統,使用JSON字符串來回讀文件,但是當我哈希密碼並嘗試登錄它不起作用,但是當密碼是無恙它工作正常,我認爲問題在於密碼驗證部分。password_verify有幾個問題希望有人可以幫助我

我只是不確定該將它,如果有人可以指導我在這將是驚人的正確方向...

所以,問題是,當我發送密碼$例如TEST5它只讀取作爲測試5和不是這$ 2y $ 10 $ viov5WbMukXsCAfIJUTUZetGrhKE9rXW.mAH5F7m1iYGfxyQzQwD。

這是原來的代碼

<?php 

include("dbconnect.php"); 


/////// First Function To Get User Data For Login 



if($_GET["stuff"]=="login"){ 

$mysqli = new mysqli($DB_host, $DB_user, $DB_pass, $DB_name); 

    if (mysqli_connect_errno()) { 
     printf("Connect failed: %s\n", mysqli_connect_error()); 
     exit(); 
    } 


/////// Need to Grab Username And Password 

$username = $_GET["user"]; 
$password = $_GET["password"]; 


$query = "SELECT username, password, regkey, banned FROM users WHERE username='$username' and password='$password'"; 

if ($stmt = $mysqli->prepare($query)) { 
    $stmt->execute(); 
    $stmt->bind_result($username, $password, $regkey, $banned); 
    while ($stmt->fetch()) { 
    echo "{"; 
    echo '"result": "success",'; 
     echo '"regkey": "' . $regkey . '",'; 
     echo '"banned": "' . $banned . '"'; 
     echo "}"; 
    } 

    $stmt->close(); 
} 

$mysqli->close(); 

} 

然後我嘗試這

<?php 

include("dbconnect.php"); 


/////// First Function To Get User Data For Login 



if($_GET["stuff"]=="login"){ 

$mysqli = new mysqli($DB_host, $DB_user, $DB_pass, $DB_name); 

    if (mysqli_connect_errno()) { 
     printf("Connect failed: %s\n", mysqli_connect_error()); 
     exit(); 
    } 


/////// Need to Grab Username And Password 

$username = $_GET["user"]; 
$password = $_GET["password"]; 

$GetPassword = "SELECT password FROM users WHERE username='$username'"; 

$data = mysqli_query($GetPassword); 

if(password_verify($password, $data['password'])) { 

      $query = "SELECT username, password, regkey, banned FROM users WHERE username='$username' and password='$password'"; 
      if ($stmt = $mysqli->prepare($query)) { 
      $stmt->execute(); 
      $stmt->bind_result($username, $password, $regkey, $banned); 
      while ($stmt->fetch()) { 
      echo "{"; 
      echo '"result": "success",'; 
       echo '"regkey": "' . $regkey . '",'; 
       echo '"banned": "' . $banned . '"'; 
       echo "}"; 
      } 

      $stmt->close(); 


     } 
} else { 
    // password is in-correct 
} 


$mysqli->close(); 

} 
+0

我沒有看到功能在你的代碼的任何地方。 –

+0

我確實有它,但它沒有工作,所以我把它拿出來 –

+0

我現在增加了我對這個問題的嘗試 –

回答

1

有你的代碼的幾個問題,如:

  • 這種說法$data = mysqli_query($GetPassword)是錯誤的。 mysqli_query()預計第一個參數是你的連接處理程序,所以它應該是,

    $data = mysqli_query($mysqli, $GetPassword); 
    
  • 看這個說法,if(password_verify($password, $data['password'])) { ... mysqli_query(),成功,返回結果集,所以你不能使用$data['password']密碼。首先從結果集讀取該行,然後得到密碼,這樣,

    $row = mysqli_fetch_assoc($data); 
    if(password_verify($password, $row['password'])) { ... 
    
  • 請看下面的查詢,

    $query = "SELECT username, password, regkey, banned FROM users WHERE username='$username' and password='$password'"; 
    

    這個查詢將不會返回因爲這個WHERE任何行條件,...password='$password'。因此,解決方案是使用兩個單獨的查詢,使用只有一個查詢來驗證密碼並檢索相關數據。解決方案在下面給出。您可能會感興趣SQL injection。總是準備,綁定執行您的查詢到prevent any kind of SQL injection

  • 如果您想要構建一個json字符串,而不是做echo "{"; echo '"result": "success",'; ...,請創建一個包含所有相關數據的數組,然後json_encode該數組。

所以解決會是這樣:

// your code 

$username = $_GET["user"]; 
$password = $_GET["password"]; 

// create a prepared statement 
$stmt = mysqli_prepare($mysqli, "SELECT username, password, regkey, banned FROM users WHERE username=?"); 

// bind parameters 
mysqli_stmt_bind_param($stmt, 's', $username); 

// execute query 
mysqli_stmt_execute($stmt); 

// store result 
mysqli_stmt_store_result($stmt); 

// check whether the SELECT query returned any row or not 
if(mysqli_stmt_num_rows($stmt)){ 
    // bind result variables 
    mysqli_stmt_bind_result($stmt, $username, $hashed_password, $regkey, $banned); 

    // fetch value 
    mysqli_stmt_fetch($stmt); 

    if(password_verify($password, $hashed_password)){ 
     echo json_encode(array('result' => 'success', 'regkey' => $regkey, 'banned' => $banned)); 
    }else{ 
     // incorrect password 
    } 
}else{ 
    // no results found 
} 

mysqli_stmt_close($stmt); 

// your code 
+0

OMG你是上帝謝謝 –

+0

@WayneFellows *不客氣! : - )*我已經更新**解決方案**部分。使用更新後的代碼,您可以檢查「SELECT」查詢是否返回任何行。 –

+0

你的答案和我的一樣長*大聲笑* - 幹得好;-) –

2
$data = mysqli_query($GetPassword); 
^^^---mysqli result handle/object 


if(password_verify($password, $data['password'])) { 
            ^^^^^^^^^^^^---no such element in mysqli 

你永遠不獲取你的數據結果,所以你比較的方法不存在輸入的密碼$data結果對象/句柄的元素。

你需要

$row = mysqli_fetch_assoc($data); 
password_verify(..., $row['password']); 

最有可能你正在使用的error_reporting和display_errors設置禁用運行,這意味着你永遠不會看到「未定義指數」警告,PHP將AVE被扔你運行此代碼每次。這些設置永遠不要在開發/調試系統上關閉。

並且請注意,您很容易受到sql injection attacks的影響,所以您的「安全」系統完全沒有用處,而且完全無用且可以繞過。

相關問題