2014-12-15 2 views
2

내 웹 사이트에 로그인하기 전에 누군가의 비밀번호와 사용자 이름을 확인하려고합니다. 암호는 모두 password_hash($password1, PASSWORD_BCRYPT);에 저장됩니다. 내가 잘못하고있는 것에 대해서는 확실하지 않습니다. 현재 내가 입력 한 내용에 상관없이 항상 잘못된 것으로 표시됩니다. 기존 비밀번호에 password_verify 사용

<?php 
require 'privstuff/dbinfo.php'; 

$username = $_POST["username"]; 
$password1 = $_POST["password1"]; 

$mysqli = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_DATABASE); 

if(mysqli_connect_errno()) { 
    echo "Connection Failed. Please send an email to [email protected] regarding this problem."; 
    exit(); 
} 

if ($stmt = $mysqli->prepare("SELECT `username`, `password` FROM `accounts` WHERE username = ? AND password = ?")) { 


    $result = mysqli_query($mysqli,"SELECT `password` FROM `accounts` WHERE username = $username"); 

    $stmt->bind_param("ss", $username, password_verify($password1, $result); 
    $stmt->execute(); 
    $stmt->store_result(); 
    if ($stmt->num_rows) { 
     echo("Success"); 
    } 
    else { 
     echo("Incorrect"); 
    } 

} 
$mysqli->close(); 

?> 

이이 문제를 해결 다르게해야 register.php

<?php 
require 'privstuff/dbinfo.php'; 

$firstname = $_POST["firstname"]; 
$password1 = $_POST["password1"]; 
$email = $_POST["email"]; 
$ip = $_SERVER['REMOTE_ADDR']; 
$username = $_POST["username"]; 

$mysqli = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_DATABASE); 


if(mysqli_connect_errno()) { 
    echo "Connection Failed. Please send an email to [email protected] regarding this problem."; 
    exit(); 
} 

     if ($stmt = $mysqli->prepare("INSERT INTO `accounts`(`firstname`, `username`, `password`, `email`, `ip`) VALUES (?,?,?,?,?)")) { 

      $db_pw = password_hash($password1, PASSWORD_BCRYPT); 

      $stmt->bind_param("sssss", $firstname, $username, $db_pw, $email, $ip); 
      $stmt->execute(); 
      if ($stmt->affected_rows > 0) { 

       echo "Account successfuly created"; 
      } 
      $stmt->close(); 
    } 
    $stmt->close(); 

$mysqli->close(); 

?> 
+0

'console.log ("Success");'는 자바 스크립트입니다 ... PHP 코드에서 무엇을하고 있습니까? ;) 또한 암호가 해시 된 버전에 저장되어 있다면'$ _POST' 변수를 사용하여 데이터베이스에서 암호를'SELECT '할 수 없습니다. –

+0

데이터베이스의'password' 열에 저장된 내용과 그곳에 어떻게 도달 했습니까? – duskwuff

+0

Lmao woops. 나는 그걸 진짜 빨리 던졌다. 무시해! – DanMossa

답변

2

문제가 해결되었습니다. password_verify을 잘못 사용하고 있습니다.

<?php 
require 'privstuff/dbinfo.php'; 


$username = $_POST["username"]; 
$password1 = $_POST["password1"]; 

$mysqli = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_DATABASE); 

// Check connection 
if(mysqli_connect_errno()) { 
    echo "Connection Failed: " . mysqli_connect_errno(); 
    exit(); 
} 

/* create a prepared statement */ 
if ($stmt = $mysqli->prepare("SELECT `password` FROM `accounts` WHERE username = ?")) { 

    /* Bind parameters: s - string, b - blob, i - int, etc */ 
    $stmt -> bind_param("s", $username); 

    /* Execute it */ 
    $stmt -> execute(); 

    /* Bind results */ 
    $stmt -> bind_result($result); 

    /* Fetch the value */ 
    $stmt -> fetch(); 

    /* Close statement */ 
    $stmt -> close(); 
} 


if(password_verify($password1, $result)) 
{ 
    session_start(); 
    $_SESSION['loggedin'] = true; 
    $_SESSION['username'] = $username; 

    echo '<script type="text/javascript"> window.open("textbomber.php","_self");</script>'; 
}else{ 
    echo '<script type="text/javascript"> alert("Incorrect Username/Password"); window.open("login.html","_self");</script>'; 
} 

$mysqli->close(); 
?> 
0

이다. 오직 하나의 쿼리를 만들고 주어진 사용자 이름으로 password-hash를 얻으십시오. 그런 다음 검사가 아닌 두 번째 쿼리 내부 코드에서 수행해야합니다 :

// Check if the hash of the entered login password, matches the stored hash. 
// The salt and the cost factor will be extracted from $existingHashFromDb. 
$isPasswordCorrect = password_verify($password, $existingHashFromDb); 

이 기능은 암호가 저장된 암호 해시를 일치 여부에 따라 true 또는 false를 반환합니다. 각 암호에 임의의 소금을 추가했기 때문에 SQL 쿼리에서 직접 암호 해시를 비교할 수 없습니다.

관련 문제