2015-04-07 151 views
2

編輯:在config.php中創建和維護會話。以及通過連接到MySQL。Php 5.5更改密碼

我想學習如何使用PHP 5.5的Password_hash和password_verify作爲更多的學習經驗,然後其他任何東西,我沒有這樣做太久,這是我第一次不得不在這裏問一個問題(通常有人已經問我的問題)

所以這是我的問題。

我能得到password_hash和password_verify做工精細,當我註冊並登錄,但由於某些原因,當我使用腳本,更改密碼,我不能再登錄

Relavent代碼片段:。

註冊:

<?php 
include('config.php'); 

$password = mysql_real_escape_string($_POST['password']); 
$username = mysql_real_escape_string($_POST['username']); 

$hashed_password = password_hash($password, PASSWORD_DEFAULT); 

$sql = 'INSERT INTO Staff (username, password) ' . 
"VALUES ('$username', '$hashed_password')"; 

mysql_query($sql) or die(mysql_error()); 

?> 

RegisterHTML:

<div id="login-content"> 
<form action="register.php" method="post"> 
<fieldset id="inputs"> 
<div class="label"></div><input type="text" name="username"/><br /> 
<div class="label"></div><input type="password" name="password"/><br /> 
</fieldset> 
<input class="button" type="submit" value="Register" /> 
</form> 
</div> 

ChangePwd:

<?php 
include('config.php'); 

$password = mysql_real_escape_string($_POST['newPassword']); 
$password2 = mysql_real_escape_string($_POST['confirmPassword']); 
$username = ($_SESSION['username']); 


if ($password <> $password2) { 
echo "Your passwords do not match."; 
} 
else if ($password === $password2){ 

$hashed_password = password_hash($password, PASSWORD_DEFAULT); 


$sql = "UPDATE Staff SET password='$hashed_password' WHERE username='$username'"; 

mysql_query($sql) or die(mysql_error()); 
} 
else { mysqli_error($con); } 

mysqli_close($con); 
?> 

ChangePwdHTML:

<?php 
include('config.php'); 
?> 
<div id="login-content"> 
<form action="changePassword.php" method="post"> 
<fieldset id="inputs"> 
<div class="label"></div><input type="password" name="passwordNew"/><br /> 
<div class="label"></div><input type="password" name="passwordConfirm"/><br /> 
</fieldset> 
<input class="button" type="submit" value="Change Password" /> 
</form> 
</div> 

連接:

<?php 
include('config.php'); 
     $username = mysql_real_escape_string(stripslashes($_POST['username'])); 
     $password = stripslashes($_POST['password']); 

    $sql = ('SELECT password,id,rank FROM Staff WHERE username="'.$username.'"'); 
    $req = mysql_query($sql) or die(mysql_error()); 
    $dn = mysql_fetch_assoc($req); 
    $hash = $dn['password']; 

    if(password_verify($password, $hash)) 
    { 
     $_SESSION['username'] = $_POST['username']; 
     $_SESSION['userid'] = $dn['id']; 
     $_SESSION['rank'] = $dn['rank']; 
     $username = mysql_real_escape_string(stripslashes($_POST['username'])); 
     $password = stripslashes($_POST['password']); 
?> 

我相信我的代碼是相當混亂,而且有一些是...月...日的同類。 ..在這一點上,frank-code從我發現的各種示例和教程構建而成。

+1

我在那裏看到一些mysqli,你不能把它與mysql結合起來。但是你應該把所有的東西切換到mysqli或者PDO,並且使用預先準備好的語句。 – jeroen

+0

PHP 5.5不支持'mysql_'函數。另外,目前還不清楚你是否已經開始會議。 –

+0

@ Fred-ii- Nah,它只會讓你警告;-) – jeroen

回答

1

很難看出確切的問題是什麼,但是一個潛在的問題是,當您註冊/更改密碼時以及在您檢查時以不同的方式處理密碼:設置時使用mysql_real_escape_string,但設置時使用strip_slashes你比較一下。

當您嘗試登錄時,會導致包含引號或斜槓的密碼不匹配。

你不應該接觸用戶的密碼,因爲在所有密碼可以包含斜線,報價等

相反,你應該切換到PDO或mysqli的,並使用準備好的語句,不改變用戶的輸入,除了例如,當您驗證新的用戶名時。


name="passwordConfirm"$_POST['confirmPassword']這是問題之一,與同爲另外一個也name="passwordNew"$_POST['newPassword']你倒的話。

已經使用錯誤報告http://php.net/manual/en/function.error-reporting.php會對兩者發信號通知「未定義索引....」。

+0

我已經更新它們都是一樣的。 如果我不逃避某些特殊字符,我是否打開自己的安全風險? –

+0

@FrankEdgar因爲一無所有?如果你打算散列它,那麼在你做這件事之前沒有必要爲數據庫做準備:-) – jeroen

+0

@FrankEdgar這就是爲什麼你應該使用準備好的語句。但是,如果你不得不逃避你的數據,那麼在你將它插入到數據庫之前就已經做好了,而不是在你對它進行哈希處理之前。 – jeroen