在crypt密码之后,验证功能不佳

时间:2017-03-30 04:59:18

标签: php

现在我使用此代码在数据库中加密我的密码,它在登录或验证时起作用。
但它只对前7个字符有效。
假设我的密码是miow12345,但我可以输入miow123或miow12312q ...登录

$pas = crypt($_POST["pas"], "MiO1!");  

validation.php

    if(isset($_POST['username']))
{
$username = $_POST['username'];
}
if (isset($_POST['password'])) 
{
$password=crypt($_POST["password"], "MiO1!");
}


$q = 'SELECT * FROM users WHERE username=:username AND password=:password';

$query = $dbh->prepare($q);

$query->execute(array(':username' => $username, ':password' => $password));


if($query->rowCount() == 0)
{
header('Location: login.php?err=1');
}

另一种方法(同样的问题)

if( crypt($_POST["pas"], "TmP2!") != $row["password"])

2 个答案:

答案 0 :(得分:0)

PHP的crypt函数仅使用前八个字符,即设计(http://php.net/manual/en/function.crypt.php)。

在数据库中存储密码时,应使用password_hash,并使用password_verify将其与用户输入的密码进行比较:

if (password_verify($_POST["pas"], $row["password"]))

(此代码现在无法为您工作,因为您的数据库中有crypt个哈希密码,您必须使用password_hash重新哈希它们

答案 1 :(得分:-1)

问题是你的代码错误$password=crypt($_POST["password"], "MiO1!");它将返回一组不同的字符串。正确使用的是has_equals函数。这是php文档提供的示例。

if (hash_equals($hashed_password, crypt($user_input, $hashed_password))) {
//your query here;}