2017-07-30 98 views
-1

它工作,如果我把它像user_id = 3或當我刪除where語句(WHERE user_id =「。$ user ['user_id']。」),但然後我所有的數據庫密碼更改。重置密碼確認無法正常工作?

我用get方法來獲得這樣的 USER_ID = 3 & reset_token = XXXXXXXXX

<?php 

if(isset($_GET['user_id']) && isset($_GET['reset_token'])) { 
$userid = $_GET['user_id']; 
$reset_token = $_GET['reset_token']; 

// Make sure user email with matching hash exist 
$req = $heidisql->prepare("SELECT * FROM users WHERE user_id='$userid' AND reset_token='$reset_token' "); 

$req->execute($userid, $reset_token); 

$user = $req->fetch(PDO::FETCH_ASSOC); 


    if ($user) { 

     if (!preg_match ('%\A(?=[-_a-zA-Z0-9]*?[A-Z])(?=[-_a-zA-Z0-9]*?[a-z])(?=[-_a-zA-Z0-9]*?[0-9])\S{8,30}\z%', $_POST['new_pass']) 
     || $_POST['new_pass'] !== $_POST['confirm_newpass']) { 

     echo 'Your new password did not match the new confirm password or is invalid!'; 
     exit(); 

     } 

    } 

    } else { 

     $newpassword = escape_data($_POST['new_pass']); 
     $newpass_hash = password_hash($newpassword, PASSWORD_BCRYPT); 

     $sql= "UPDATE users SET " 
       . "password_hashcode='$newpass_hash', " 
       . "reset_allocated_time=NULL, " 
       . "reset_token=NULL " 
       . "WHERE user_id=".$user['user_id']." "; //<- error here 

     // Make sure user email with matching hash exist 
     $result_newpass = $heidisql->prepare($sql); 

     $result_newpass->execute(); 

     echo "Your password has been reset!"; 

     exit(); 

    } 

已經嘗試USER_ID = '$用戶ID'/ $ _GET [ 'user_ID的']的用戶ID 那麼,應該如何我定義了變量user_id?

仍然不起作用 $ req = $ heidisql-> prepare(「SELECT * FROM users WHERE user_id =':user_id'AND reset_token =':reset_token'」);

$req->execute([':user_id'=>$userid, ':reset_token'=>$reset_token]); 

    $sql= "UPDATE users SET password_hashcode=':password_hashcode', reset_allocated_time=NULL, reset_token=NULL WHERE user_id=:user_id"; 
    $result_newpass = $heidisql->prepare($sql); $result_newpass->execute([':user_id'=>$userid,':password_hashcode'=>$newpass_hash, ':reset_token'=>NULL, ':reset_allocated_time'=>NULL]); 

- 我認爲,問題可能出在get方法的原因,似乎我無法正常訪問USER_ID/URL中reset_token?

...本地主機/例子/ reset_pass.php?USER_ID = XX & reset_token = XXXXXXXXX

  • 我在USER_ID越來越不確定的變量

  • 任何人都知道,如果這個問題(S )導致我的密碼驗證也不起作用?

+0

所以用戶ID存儲在$用戶ID,所以你需要在WHERE子句中使用該變量。更新後的代碼:'WHERE user_id =「。$ userid' –

+0

你的意思是像user_id =」。 $ userid。「因爲我很確定我已經嘗試過了,會再次重試 –

+0

您不需要關閉雙引號。你可以將最後一行替換爲'。「WHERE user_id =」。 $用戶標識;' –

回答

0

使用預準備語句時,實際上並沒有在語句中包含這些值。而是使用佔位符,並在稍後綁定值。

變化:

$req = $heidisql->prepare(
    "SELECT * FROM users WHERE user_id='$userid' 
    AND reset_token='$reset_token' " 
); 
$req->execute($userid, $reset_token); 

要:

$req = $heidisql->prepare(
    "SELECT * FROM users WHERE user_id=:id 
    AND reset_token=:token " 
); 
$req->execute([':id'=>$userid, ':token'=>$reset_token]); 

See the docs

再往下,你必須:

$newpassword = escape_data($_POST['new_pass']); 
$newpass_hash = password_hash($newpassword, PASSWORD_BCRYPT); 

這可能是一個壞主意,更改密碼( ESCA pe)​​在散列之前。只是哈希它;結果將是安全的使用。如果將來您的轉義函數發生變化,那麼更改它可能會導致用戶的真實密碼無法識別。

再往下,你應該改變:

$sql= "UPDATE users SET password_hashcode='$newpass_hash'," 
    . "reset_allocated_time=NULL, reset_token=NULL " 
    . "WHERE user_id=".$user['user_id']." "; //<- error here 

$result_newpass = $heidisql->prepare($sql); 

$result_newpass->execute(); 

要:

$sql= "UPDATE users SET password_hashcode=:newpass," 
    . "reset_allocated_time=NULL, reset_token=NULL " 
    . "WHERE user_id=:id"; //<- error here 

$result_newpass = $heidisql->prepare($sql); 

$result_newpass->execute([':newpass'=>$newpass_hash, ':id'=>$userid]); 
+0

即使我把這兩個SQL它仍然沒有工作 –

+0

@JohnLaimuin我做了一個編輯。在最後一個查詢中,使用'$ userid'而不是'$ user ['user_id']' – BeetleJuice

+0

我收到echo msg,但仍然收到錯誤未定義變量:userid $ result_newpass-> execute([':newpass' => $ newpass_hash,':user_id'=> $ userid]);我的id字段是名字user_id –

0

更新此$sql從這裏:

$sql = "UPDATE users SET 
     password_hashcode = '$newpass_hash', 
     reset_allocated_time = NULL, 
     reset_token = NULL 
     WHERE user_id = '$user['user_id']'";