2014-10-23 12 views
6

Kayıt kodum bir kullanıcının şifresini kabul ediyor ve daha sonra şifreyi şifrelemek için PHP'nin password_hash işlevini kullanıyor, ardından bir veritabanına yerleştiriyor. Yeni oluşturulan kullanıcıyı kullanarak giriş yapmaya gittiğimde, şifrelerin aynı olup olmadığını kontrol eden hatayı alıyorum. Benim durumumda değiller. Giriş komut dosyasında password_verify işlevine çağrı yaptığımda ne yapıyorum?PHP password_hash(), password_verify()

string(1) "1" string(16) "$2y$10$0aysCso3b" 

Yani açıkça, şifreler eşleşti edilmiyor:

KAYIT

if($_SERVER["REQUEST_METHOD"] == "POST"){ 
    function secure($data){ 
     $data = trim($data); 
     $data = stripslashes($data); 
     $data = htmlspecialchars($data); 
     return($data); 
    } 

    $p_num = secure($_POST["p_number"]); 
    $first_name = secure($_POST["first_name"]); 
    $last_name = secure($_POST["last_name"]); 
    $email = secure($_POST["email"]); 
    $password = secure($_POST["pw"]); 
    $verify_password = secure($_POST["pw_verify"]); 
    $program = secure($_POST["program"]); 
    $role = secure($_POST["role"]); 
    $logged_in = 0; 
    $registered = 0; 
    $image = "../images/profile_placeholder.png"; 

    if($password != $verify_password){ 
     echo "Nope. Passwords"; 
    } 
    else{ 
     $registered = 1; 
     $password = password_hash($password, PASSWORD_DEFAULT); 
     $insert = "INSERT INTO `$user_table`(`user_id`, `first_name`, `last_name`, `password`, `image`, `email`, `program`, `role`, `logged_in`, `registered`) VALUES('" .$p_num ."', '" .$first_name ."', '" .$last_name ."', '" .$password ."', '" .$image ."', '" .$email ."', '" .$program ."', '" .$role ."', '" .$logged_in ."', '" .$registered ."')"; 
     $query = mysqli_query($connect, $insert); 
     echo "Success!"; 
    } 
} 

GİRİŞ Burada

if($_SERVER["REQUEST_METHOD"] == "POST"){ 
    $p_num = $_POST["username"]; 
    $pwd = $_POST["password"]; 

    $query = "SELECT * FROM `$user_table` WHERE `user_id` = '$p_num'"; 
    $result = mysqli_query($connect, $query); 
    while($row = mysqli_fetch_assoc($result)){ 
     $user_id = "{$row['user_id']}"; 
     $first_name = "{$row['first_name']}"; 
     $last_name = "{$row['last_name']}"; 
     $user_name = $first_name ." " .$last_name; 
     $password = "{$row['password']}"; 
     $image = "{$row['image']}"; 
     $email = "{$row['email']}"; 
     $program = "{$row['program']}"; 
     $role = "{$row['role']}"; 
     $status = "{$row['logged_in']}"; 
     $registered = "{$row['registered']}"; 
     if(($user_id == $p_num) && (password_verify($pwd, $password))){ 
      $_SESSION["id"] = $user_id; 
      $_SESSION["user"] = $user_name; 
      $_SESSION["program"] = $program; 
      $_SESSION["pass"] = $password; 
      $_SESSION["image"] = $image; 
      $_SESSION["email"] = $email; 
      $_SESSION["role"] = $role; 
      $_SESSION["status"] = $status; 
      $_SESSION["registered"] = $registered; 
      $loggedin = "UPDATE `$user_table` SET `logged_in` = 1 WHERE `user_id` = '$user_id'"; 
     } 
    var_dump($pwd); 
    var_dump($password); 
} 

ben var_dump ne zaman ne alıyorum almak ona. Yani, kayıt komut dosyasında, parola karma ve veritabanına gönderilir. Daha sonra, kullanıcı giriş yapmaya gittiğinde, oturum açma komut dosyası, kullanıcının giriş yapmak için girdiği şifreye bakar ve ardından parola_verify'yi kullanarak veritabanındaki karma şifresini kontrol eder. Yine de, karma şifre, şifrelenmemiş şifreyi bir eşleşme olarak kabul etmiyor. Anlamadığım şey neden?

+0

Giriş komut dosyanızdaki '$ pwd' ve' $ password' nereden geliyor? –

+0

Whoops, her şeyi kopyaladığımı düşündüm. Bu soruya eklenmiştir. –

+0

Sidenote: Başlıklarınızdan sonra 'exit 'eklemelisiniz. I.e .: 'başlık (" Yer: ../pages/denied_login.php "); exit; ' –

cevap

10

password_hash ve password_verify için kullanıyorum. Yazılı olarak deneyin, daha sonra başarılı bir şekilde kodunuzun geri kalanına eklemeye başlayabilirsiniz.

Tabloyu ve sütun adlarını/harflerini uygun olacak şekilde değiştirin.

N.B .: Bu, temel bir ekleme yöntemidir. Bunun yerine prepared statements kullanmanızı öneririm.

Sidenote: Parola sütununun karma VARCHAR(255)'u barındırmak için yeterince uzun olması gerekir. "Dipnotlar" dan bakın.

INSERT dosyası

<?php 
$DB_HOST = 'xxx'; 
$DB_USER = 'xxx'; 
$DB_PASS = 'xxx'; 
$DB_NAME = 'xxx'; 

$conn = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME); 
if($conn->connect_errno > 0) { 
die('Connection failed [' . $conn->connect_error . ']'); 
} 

$password = "rasmuslerdorf"; 
$first_name = "john"; 
$password = password_hash($password, PASSWORD_DEFAULT); 

$sql = "INSERT INTO users (`name`, `password`) VALUES ('" .$first_name ."', '" .$password ."')"; 

    $query = mysqli_query($conn, $sql); 
    if($query) 

{ 
    echo "Success!"; 
} 

else{ 
    // echo "Error"; 
    die('There was an error running the query [' . $conn->error . ']'); 
} 

GİRİŞ dosyası

<?php 
// session_start(); 

$DB_HOST = 'xxx'; 
$DB_USER = 'xxx'; 
$DB_PASS = 'xxx'; 
$DB_NAME = 'xxx'; 

$conn = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME); 
if($conn->connect_errno > 0) { 
    die('Connection failed [' . $conn->connect_error . ']'); 
} 

$pwd = "rasmuslerdorf"; 
$first_name = "john"; 

//$sql = "SELECT * FROM users WHERE id = 1"; 

     $sql = "SELECT * FROM users WHERE name='$first_name'"; 
     $result = $conn->query($sql); 
     if ($result->num_rows === 1) { 
      $row = $result->fetch_array(MYSQLI_ASSOC); 
      if (password_verify($pwd, $row['password'])) { 

       //Password matches, so create the session 
       // $_SESSION['user'] = $row['user_id']; 
       // header("Location: http://www.example.com/logged_in.php"); 

echo "Match"; 

      }else{ 
       echo "The username or password do not match"; 
      } 

} 

mysqli_close($conn); 

Dipnotlar:

şifre sütun karma tutabilecek kadar uzun olmalıdır.

"PHP 5.5 itibariyle bcrypt algoritması (varsayılan kullanın: Uzun 72 karma karakter uzunluğunda üretir, henüz elle 255.

Referans anlaşılacağı budur Bu sabitin PHP'ye yeni ve daha güçlü algoritmalar eklendikçe zaman içinde değişecek şekilde tasarlandığını unutmayın.Bu nedenle bu tanımlayıcıyı kullanmanın sonucunun uzunluğu zamanla değişebilir. bir veriyle sonuçlanmak 60 karakterin ötesine geçebilen temel sütun (255 karakter iyi bir seçim olacaktır)."

+2

Veritabanı alanı uzunluğunu kontrol etmemi haklıydın. 255'te değildi, bu onu kırıyordu. Bunu anlamaya yardım ettiğin için çok teşekkür ederim. Ben de hazırladığı ifadeleri araştırıyorum, çok yakın zamana kadar onları hiç duymadığım SQL enjeksiyonunu engellemek için çok kullanıyorum, şimdiye kadar gördüklerimden oldukça düz ileriye doğru. Yardım için tekrar teşekkürler. –

+1

@Robert Çok hoş geldiniz Robert, çözüldüğünü bildiğim için mutluyum. * Alkış * :) –

+1

Hazırladığınız ifadeleri neden kullanmıyorsunuz? Kodunuzun yalnızca bir projeye kopyalanacağı ve '$ _POST ['user']', vb. Ile değiştirilen değişkenler olduğu için her zaman bir risk vardır. –

1

Arkadaş biz Giriş için benzersiz Adı ​​kullandığınız gibi Yani biz Adı ​​kullanarak veritabanından Şifre/Verileri Al zorunda Sadece

Örnek:. Benim Yarayıp

<?php 
    $connect = mysqli_connect($localhost, $username, $pwd, $database) or die("Opps some thing went wrong"); 

    if (isset($_POST['submit'])) { 
     extract($_POST); 

    // Get Old Password from Database which is having unique userName 
    $sqlQuery = mysqli_query($connect, "select * from loginTable where User='$username'"); 
    $res = mysqli_fetch_array($sqlQuery); 
    $current_password = $res['userPassword']; 

    if (password_verify($enteredPassword, $current_password)) { 
     /* If Password is valid!! */ 
     $_SESSION['id'] = $res['id']; 
     header("location: home.php"); 
    } 
    else { 
     /* If Invalid password Entered */ 
     $alt = "Login Failed! Wrong user ID or Password"; 
     header("location: index.php?m=$alt"); 
    } 
    } 
?> 

... Veritabanından parola alıyorum ve girilen parola ile karşılaştırıyorum Parola PHP API'yi kullanma ie password_verify ($ girdisiPassword, $ current_password)