2015-04-07 3 views
2

EDIT: Внутри 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> 

Connect:

<?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']); 
?> 

Я уверен, что мой код довольно грязный, и некоторые из них датирована ... его рода. .. franken-code на данный момент, построенный из различных примеров и учебных пособий, которые я нашел.

+1

Я также вижу некоторые mysqli, вы не можете объединить это с mysql. Но вы действительно должны переключать все на mysqli или PDO и использовать подготовленные инструкции. – jeroen

+0

PHP 5.5 не поддерживает функции 'mysql_'. Кроме того, неясно, начали ли вы сеанс или нет. –

+0

@ Fred-ii- Нет, это будет просто ошибка с предупреждениями ;-) – 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

Я обновил их, чтобы все было одинаково. Если я не избегу некоторых специальных символов arent, я открываю себе угрозу безопасности? –

+0

@FrankEdgar Как ни в чем? Если вы собираетесь хешировать, нет смысла готовить его для базы данных, прежде чем вы это сделаете :-) – jeroen

+0

@FrankEdgar Вот почему вы должны использовать подготовленные заявления. Но если вам нужно избегать ваших данных, вы делаете это прямо перед тем, как вставляете их в базу данных, а не перед тем, как вы их сделаете. – jeroen

Смежные вопросы