使用md5加密的PHP和Mysql查询问题

时间:2011-02-15 17:58:16

标签: php mysql md5

我正在使用普通的php / mysql插入查询并使用md5来加密密码

这是INSERT查询:

$sql = mysql_query("INSERT INTO user (username, password, role, approved) values ('".$username."', '".md5($password)."', 'user', '0')");

这是我用于登录检查的SELECT查询:

$sql = "SELECT id, username, password, role, approved FROM user WHERE username = '".$username."' AND password = '".md5($password)."'";

$result = mysql_query($sql);

但是当我检查插入的密码和登录密码时,即使我给出相同的值,它也会返回2个不同的值。

有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

这里有许多典型的警告......提及它们并不会有什么坏处。

首先,用于密码哈希的vanilla md5肯定不是在数据库中保护用户密码的最佳方法。 stackoverflow上有很多关于文档更好的方法的问题,虽然存在意见分歧,但它们比普通的md5,无盐哈希都更安全。

Secure hash and salt for PHP passwords

Why not use AES for password encryption in PHP?

此外,您没有对sql输入进行清理,使您的数据库对SQL注入攻击开放。一个好心的用户可以操纵您的用户插入以删除表或修改您的数据结构。您需要使用mysql_real_escape_string()来转义这些值,或者采用完全不同的数据库访问系统,例如具有参数化sql的PDO。

How can I prevent SQL injection in PHP?

话虽这么说,您的查询应该检查是否存在具有正确用户名和密码的用户行,通常首先执行COUNT查询并确保用户在数据库中存在有效登录信用。< / p>

您应确保数据库列的长度和数据类型正确,以存储密码的哈希值。截断任何一个都可能会破坏数据。

我希望这有帮助 - SQL注入可能特别令人讨厌!

答案 1 :(得分:1)

假设$username$password实际上是相同的......您是否已检查以确保表users password列字符长度足够大持有整个MD5哈希?

有计算和存储MD5哈希的示例吗?