2016-06-09 130 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的影响,所以您的“安全”系统完全没有用处,而且完全无用且可以绕过。

相关问题