2016-07-14 11 views
0

基本的にはどのような私はregister.phpで作成されたハッシュと一致するようにlogin.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)。そして、パスワードをどのように保存しているかを示す必要があります(私はあなたがハッシュを意味することを願っています。**生のクリアテキストパスワードを保存しないでください)、そしてあなたがcryping/hashing/comparisonを行う方法。 –

+2

データベースからのハッシュをプルします 'SELECT pword FROM users WHERE email =?'次に 'password_verify($ userSubmittedPassword、$ hashFromDatabase)'と比較してください@MarcBは、文字列補間ではなくクエリにプリペアドステートメントを使用します – Steve

+0

ハッシュはプレーンテキストのパスワードではなく、データベースに格納されていますか? – pmahomme

答えて

2

あなたは、あなたが与えられたユーザー名のDBから結果を取得し、パスワードを比較する必要があり、この

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

ようpassword_verify機能を使用する必要があります。

実際に

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()はもう一度、mysqli_fetch_field()が正確に1つのパラメータを期待しています.2与えられました..問題は今では唯一であると考えています –

+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