2016-10-14 26 views
0

我似乎无法得到password_verify工作W /在我的PHP PDO代码。我的传球领域存储为varchar(255)。我一直在阅读类似的问题,但从我可以告诉我已经设置正确。我仍然要失去一些东西。 我的注册页面如下..什么是使用password_verify与PDO的正确方法?

$user = $_POST['username'] 
$pass = $_POST['pass']; 
$passH = password_hash($pass, PASSWORD_DEFAULT); 
$query = $con->prepare("INSERT INTO emps (user, pass) VALUES (?, ?)"); 
$query->execute([$user, $passH]); 

加密的密码现已成功保存在我的数据库。

我的登录页面如下..登录页面的

if(isset($_POST['login'])) { 
    $username = $_POST['username']; 
    $pass = trim($_POST['pass']; 
    $passH = password_hash($pass, PASSWORD_DEFAULT); 
    $sel_user = $con->prepare("SELECT id, username, pass, gid FROM emps WHERE gid!=4 AND username=?"); 
    $sel_user->execute([$username]); 
    $check_user=$sel_user->fetch(); 
    if(count($check_user)>0 && password_verify($passH, $check_user['pass'])) { 
    $_SESSION['username']=$check_user['username']; 
    header("Location: xadmin.php"); 
    exit; 
    } 
    else { 
    echo "<script>alert('Not Found')</script>"; 

身体..

<form action="login.php" method="post"> 
    <table width="100%" border="0"> 
     <tbody> 
      <tr> 
       <td bgcolor="#3B3B3B" height ="35" class="BodyTxtB" align="center">Administrator Login</td></tr> 
      <tr height="20"><td></td></tr> 
      <tr> 
       <td class="BodyTxtB" align="center">Username</td> 
      </tr> 
      <tr> 
       <td class="BodyTxtB" align="center"><input type="text" class="BodyTxtBC" name="username" required="required"/></td> 
      </tr> 
      <tr height="20"><td></td></tr> 
      <tr> 
       <td class="BodyTxtB" align="center">Password</td> 
      </tr> 
      <tr> 
       <td class="BodyTxtB" align="center"><input type="password" class="BodyTxtBC" name="pass" required="required"/></td> 
      </tr> 
      <tr height="20"><td></td></tr> 
      <tr height="35"><td align="center"><input type="image" src="images/btn_login.jpg" name="login" value="Login"/> 
      <input type="hidden" name="login" value="Login" /></td></tr> 
      <tr height="20"><td></td></tr> 
     </tbody> 
    </table> 
    </form> 

任何人都可以发现任何错误?

+1

https://phpdelusions.net/pdo/password_hash –

+2

为什么要在验证密码之前先散列密码? –

+2

您正在使用password_hash。您需要提供明文密码和散列密码(来自数据库)。另外你为什么要修剪密码? –

回答

1

password_verify()的参数是:(1)你想要的非散列密码检查和(2)哈希密码使用的是作为参考。比较之前你是散列的第一个参数:

$pass = trim($_POST['pass']; 
$passH = password_hash($pass, PASSWORD_DEFAULT); 
// ... 
if(count($check_user)>0 && password_verify($passH, $check_user['pass'])) { 

你应该做password_verify($pass /** the unhashed one */, $check_user['pass'])

另外,修剪密码是一个坏主意。如果密码实际上包含空格(你应该使用允许它执行)怎么办?

+0

谢谢,我确实尝试过,但它仍然无法正常工作。现在,当我点击提交时,登录表单消失,但我没有重定向到该页面,也没有显示我的警报错误消息 – craisondigital

+0

@craisondigital检查错误日志和浏览器控制台。可能的原因是您已将语法错误或重定向错误引入登录页面逻辑。 –

+0

谢谢@Ed Cottrell现在正在工作。 – craisondigital

2

RTM? http://php.net/password_verify

boolean password_verify (string $password , string $hash) 

您通过在PLAINTEXT密码$password。你不要自己哈哈。这只会产生一个带有不同盐分的新的散列,使得比较既无意义也不可能。

password_verify将从$hash中提取适当的盐,使用它散列$password本身,然后比较哈希字符串。

例如password_verify基本上是这样的:

function password_verify($pw, $hash) { 
    $salt = get_salt_from($hash); 
    $temp = password_hash($pw, $salt); 

    return ($temp == $hash); 
} 
+0

PHP是如何简化所有事情的,很重要的是,两个函数可以完成所有事情,这真的很有趣,但人们仍然设法使事情过于复杂。 $ temp === $ hash用于额外的度量。 –

+0

好吧,'get_salt_from()'可能会有点棘手,但否则,是的。 password_verify基本上只是一个方便。 –

+0

谢谢@MarcB向我解释这个 – craisondigital

相关问题