PHP crypt返回true,即使在密码后面有后缀

PHP crypt返回true,即使在密码后面有后缀,php,hash,passwords,crypt,Php,Hash,Passwords,Crypt,所以我的登录脚本有一个小漏洞 假设我们有一个密码为“s3cret”的用户“David”。如果David使用s3cret登录,则他已登录,并且一切正常。如果他使用“oijopij”登录,系统将不会像预期的那样给他访问权限。但是,如果他尝试使用“s3cretHelloimasuffix”登录,他也会登录。这是我使用crypt创建哈希的部分: $salt = //Some random salt string $hash = crypt( $user->pass, $salt ); 然后将该散

所以我的登录脚本有一个小漏洞

假设我们有一个密码为“s3cret”的用户“David”。如果David使用s3cret登录,则他已登录,并且一切正常。如果他使用“oijopij”登录,系统将不会像预期的那样给他访问权限。但是,如果他尝试使用“s3cretHelloimasuffix”登录,他也会登录。这是我使用crypt创建哈希的部分:

$salt = //Some random salt string
$hash = crypt( $user->pass, $salt );
然后将该散列插入到数据库中

if ( crypt( $this->data->pass, $user->pass ) == $user->pass )
     return true;

return false;
这就是根据哈希值检查密码的部分,密码和哈希值都是正确的。但即使密码后面有后缀,它仍然返回true


编辑:我忘记了实际问题:如何解决此问题?因为它可能被视为一个安全漏洞,即使在实践中它不是

crypt
在您使用时,密码限制为8个字符:

php > echo crypt('1234567', 'abc');
ablk9HoaAwzxk
php > echo crypt('12345678', 'abc');
ab1iBa.N.U2C6   
php > echo crypt('123456789', 'abc');
ab1iBa.N.U2C6
php > echo crypt('1234567890', 'abc');
ab1iBa.N.U2C6
请注意,…8,…89,…890版本如何具有相同的哈希值


crypt
已过时,不应再用于密码系统
password\u hash()
现在是推荐的方法,它支持多种散列方法,包括用于密码散列的
bcrypt

crypt
当您使用它时,它被限制为8个字符的密码:

php > echo crypt('1234567', 'abc');
ablk9HoaAwzxk
php > echo crypt('12345678', 'abc');
ab1iBa.N.U2C6   
php > echo crypt('123456789', 'abc');
ab1iBa.N.U2C6
php > echo crypt('1234567890', 'abc');
ab1iBa.N.U2C6
请注意,…8,…89,…890版本如何具有相同的哈希值

crypt
已过时,不应再用于密码系统
password\u hash()
现在是推荐的方法,它支持多种哈希方法,包括
bcrypt
,应该用于密码哈希。

谢谢:)我会研究一下。回答得很好,我希望我能给你更多的分数。谢谢:)我会调查一下的。回答得很好,我希望我能给你更多的分数。