2016-07-17 4 views
1

PHP와 MySQL로 인증 양식을 만들려고하는데 작동하지 않습니다. 이유가 궁금합니다.인증이 작동하지 않습니다.

나를 도울 수있는 사람이 있습니까? 선례 파일에서 암호 해시를했지만 연결되지 않았습니다. 이것은 독립적입니다.

감사합니다.

<?php 

session_start(); 

function connect_db($host, $port, $db, $username, $password) 
{ 
    $pdo = new PDO("mysql:host=$host; port=$port; dbname=$db", $username, $password); 
    return $pdo; 
} 

if (isset($_POST["email"]) && isset($_POST["password"]) && !empty($_POST["email"]) && !empty($_POST["password"])) 
{ 
    $error_pass= ""; 
    $email = $_POST["email"]; 
    $password = $_POST["password"]; 

    try 
    { 
     $pdo = connect_db("localhost", 3306, "*******", "******", "*******"); 
     $sql = $pdo-> prepare("SELECT * FROM users WHERE email = :email AND password = :password"); 
     $sql->bindParam(':email', $email); 
     $sql->bindParam(':password', $password); 
     $sql->execute(); 
     $req = $sql->fetch(); 
     echo $req["password"] . "SALUT \n"; 
     var_dump($req["password"]); 
     if (password_verify($password, $req['password']) == 0) { 
      session_unset(); 
      $error_pass = "Incorrect email/password"; 
     } 

     else { 
      $_SESSION["name"] = $req["name"]; 
      header("Location: index.php", true, 302); 
     } 
    } 
    catch (PDOException $e) 
    { 
     echo $e->getMessage(); 
    } 

    if ($error_pass) { 
     echo $error_pass; 
    } 
} 

else { 
    echo "Some fields are missing"; 
} 
?> 
<!DOCTYPE html> 
<html> 
<body> 
    <form method="post" action ="login.php"> 
     <input type="text" name="email"> 
     <input type="text" name="password"> 
     <input type="submit" name="submit" value ="submit"> 
    </form> 
</body> 

</html> 
+0

bindParam 함께 할 필요가 : 그래서'$ SQL-> bindParam ('이메일', $ 이메일),' – Mihai

+0

그것은 실수하지만 내 문제 –

+0

안전 팁 해결되지 않는 예 미안 : 당신 인터넷에 사용자 이름 + 비밀번호를 게시하지 않도록 노력해야합니다. 또한 프로덕션 환경에서 사용할 계획이라면 암호를 더 강하게 만드십시오. – mpen

답변

2

검색어에서 암호를 제거하십시오. 전자 메일로만 사용자를 찾아 암호가 올바른지 확인해야합니다.

$sql = $pdo-> prepare("SELECT * FROM users WHERE email = :email"); 
$sql->bindParam(':email', $email); 
$sql->execute(); 
$req = $sql->fetch(); 

// @todo :: check did you got any users 

if (password_verify($_POST["password"], $req['password'])) { 
    // password is valid 
} 
+1

그래. 데이타베이스의 패스워드는 해쉬이므로 unhashed 버전은 결코 해시 된 버전과 같지 않으므로'$ sql-> fetch();'는 0 행을 반환합니다. –

관련 문제