2016-07-14 4 views
0

В основном то, что мне нужно, чтобы добавить этот код в login.php, чтобы соответствовать хэш, созданный в register.php:PHP хеширование паролей и проблемы матч- до

login.php

if (isset($_POST['Login'])) { 
     $username = $_POST['email']; 
     $store_password = $_POST['pword']; 
     check($username, $store_password); 
    } 
    function check($username, $pword){ 
     $conn = mysqli_connect('localhost', 'root', 'root', 'Registrar'); 
     $check = "SELECT * FROM Users WHERE email='$username'"; 
     $check_q = mysqli_query($conn, $check) or die("<div class='loginmsg'>Error on checking Username<div>"); 
     if (mysqli_num_rows($check_q) == 1) { 
      login($username, $pword); 
     } 
     else{ 
      echo "<div id='loginmsg'>Wrong Email or Password</div>"; 
     } 
    } 


function login($username, $pword){ 
    $conn = mysqli_connect('localhost', 'root', 'root', 'Registrar'); 
     $login = "SELECT * FROM Users WHERE email='$username' and pword='$pword'"; 
     $login_q = mysqli_query($conn, $login) or die('Error on checking Username and Password'); 
     if (mysqli_num_rows($login_q) == 1){ 
    header('Location: account.php'); 
    echo"<div id='loginmsg'> Logged in as $username </div>"; 
      $_SESSION['username'] = $username; 
     } 
     else { 
      echo "<div id='loginmsg'>Wrong Password </div>"; 
     } 
    } 

в соответствовать хэш пароля в register.php

register.php:

$uname = $_POST['uname']; 
$email = $_POST['email']; 
$pword = $_POST['pword']; 
$store_password = password_hash('pword', PASSWORD_BCRYPT, array('cost' => 10)); 

Любая помощь будет оценена.

+3

Вы уязвимы для [SQL-инъекций] (http://bobby-tables.com). И вам нужно показать, как вы храните пароль (надеюсь, вы имеете в виду «хэш», вы ** НИКОГДА не храните необработанный пароль открытого текста), и как вы делаете плач/хэширование/сравнение. –

+2

вытащить хеш из базы данных 'ВЫБРАТЬ pword из пользователей, где электронная почта =?' Затем сравните с 'password_verify ($ userSubmittedPassword, $ hashFromDatabase)' И как @MarcB ускользает к, использовать подготовленные заявления запроса, а не строка интерполяции – Steve

+0

хэш хранится в базе данных, а не в текстовом пароле, правильно? – pmahomme

ответ

2

Вы должны использовать функцию password_verify как этот

if (password_verify($given_password, $stored_password)) { 
    echo 'Password is valid!'; 
} else { 
    echo 'Invalid password.'; 
} 

Таким образом, вы должны получить результаты из БД для данного пользователя и сравнить пароль.

На самом деле

function login($username, $pword){ 
    $conn = mysqli_connect('localhost', 'root', 'root', 'Registrar'); 
     $login = "SELECT email, pword FROM Users WHERE email='$username'"; 
     $login_q = mysqli_query($conn, $login) or die('Error on checking Username and Password'); 
     if (mysqli_num_rows($login_q) == 1){ 
    if(password_verify($pword, mysqli_fetch_field($login_q,1))){ 
     header('Location: account.php'); 
     echo"<div id='loginmsg'> Logged in as $username </div>"; 
      $_SESSION['username'] = $username; 
     } 
    else { 
    echo "<div id='loginmsg'>Wrong Password </div>"; 
     } 
    } 
    else { 
    echo "<div id='loginmsg'>Unknown Username </div>"; 
} 
    } 
+0

Спасибо за ваш ответ, только проблема в том, где именно это будет работать? в контексте моей функции входа? –

+0

раз спасибо, mysqli_fetch_field() ожидает, что именно 1 параметр, 2 given..seems быть единственным вопросом в настоящее время –

+0

К сожалению, может быть, мой ответ будет неполным, у меня нет моих заметок сейчас, но смысл этого. –

1

Вы должны отделить задачи, вы будете хотеть иметь, может быть, 2-4 или около функции (или методы с помощью класса). Вот простой пример рабочего процесса. Я собираюсь использовать PDO, потому что я знаю это лучше:

// This is just simple but you can make this as elaborate as you want, but 
// if you always use the same function to connect, you will will find troubleshooting 
// that much easier. 
function connection() 
    { 
     return new PDO('mysql:host=localhost;dbname=Registrar','root','root'); 
    } 
// You want to make a simple validation function where that's all it does, 
// you don't want to put a bunch of html in here because you can reuse this function 
// elsewhere in other scripts if need be. 
function validate($email,$password,$con) 
    { 
     // Just look up by email only 
     $sql = "SELECT * FROM `Users` WHERE `email`= ?"; 
     $query = $con->prepare($sql); 
     $query->execute(array($email)); 
     $result = $query->fetch(PDO::FETCH_ASSOC); 
     // If you don't get a row, just return false (didn't validate) 
     if(empty($result['email'])) 
      return false; 
     // $result['password'] should have been stored as a hash using password_hash() 
     return password_verify($password,$result['password']); 
    } 
// Do a quick updater to make it easier on yourself. 
// You don't use this in this script but it gives you an idea about what to 
// do when you are saving passwords via password_hash() 
function updatePassword($email,$password,$con) 
    { 
     $hash = password_hash($password, PASSWORD_DEFAULT); 
     $sql = 'UPDATE `Users` set `password` = ? where `email` = ?'; 
     $query = $con->prepare($sql); 
     $query->execute(array($hash,$email)); 
    } 

session_start(); 
$con = connection(); 
// Check there is a post and that post is valid email address 
// At this point you can add more messaging for errors... 
if(!empty($_POST['email']) && filter_var($_POST['email'],FILTER_VALIDATE_EMAIL)) { 
    // Run our validation function 
    $valid = validate($_POST['email'],$_POST['password'],$con); 
    if($valid) { 
     $_SESSION['username'] = $_POST['email']; 
     header('Location: account.php'); 
     exit; 
    } 
    else { 
     die("<div id='loginmsg'>Wrong Password</div>"); 
    } 
} 
+0

Спасибо за ответ, но этот вид меня смущает: P –

+0

Ну (на мой взгляд), чем более понятным для человека, тем лучше ваш код. Функции позволяют это сделать. Они также обеспечивают согласованность, потому что вы можете повторно использовать функции. Функция входа в систему должна быть бизнес-частью, частью, которая проверяет имя пользователя и пароль и отчеты для представления, что показывать пользователю. Вы должны разбить свой код на более мелкие, более удобные для человека части. – Rasclatt

+0

Я немного оповещал вас, посмотрите, немного ли это понятно. – Rasclatt