0

我正在编写登录面板以访问管理面板。数据(用户名和密码)存储在 MySQL 数据库(类型:InnoDB)中。在表格中查看密码以纯格式存储,并且在字段密码中我有:{plain}password。

改编我已经拥有的代码,我遇到了一些问题,因为那个 {plain} 事情让我有点困惑。

我的旧代码是:

// Construct SQL statement for query & execute 
$sql = "SELECT * FROM table WHERE user = '" . $username . "' AND password = '" . md5($password) . "'"; 
$result = $mysqli->query($sql) or die(mysql_error());

因此,如果我将数据库字段中的“{plain}password”替换为 MD5 密码,则代码效果很好,但如果我将代码修改为以下代码:

// Construct SQL statement for query & execute 
$sql = "SELECT * FROM table WHERE user = '" . $username . "' AND password = '" . $password . "'"; 
$result = $mysqli->query($sql) or die(mysql_error());

我无法登录,因为密码错误!

知道如何解决这个问题吗?

4

2 回答 2

1

我不确定是什么{plain}意思,我猜它表明密码是纯文本的——而且这个字符串实际上是存在的。因此,您的第二个 SQL 应该包括它:

$sql = "SELECT * FROM table WHERE user = '" . mysql_real_escape_string($username) . "' AND password = '{plain}" . mysql_real_escape_string($password) . "'"; 

请注意,我并不是在开始讨论以纯文本形式存储管理员密码,而是纯粹回答技术问题。但是我必须说存储纯文本密码是一个非常糟糕的主意。

另请注意,我添加mysql_real_escape_string以清理您的输入。

于 2012-07-19T14:35:51.360 回答
1

如果真实密码前有前缀“{plain}”,则必须调整查询以包含该前缀。

$sql = "SELECT * FROM table WHERE user = '" . $username . "' AND password = '{plain}" . $password . "'"; 
$result = $mysqli->query($sql) or die($mysqli->error());

另请注意,您应该更改命令以使用mysql_error()函数(所以使用)。die()mysqli$mysqli->error

PS:你应该看看现在如何存储密码。以纯文本形式存储它们无论如何都不安全。

编辑

在这里也提到了@BrianRasmussen 的评论:在查询中直接使用(使用字符串 concat)之前,请确保$username并已经过清理!$password否则,您的代码对各种 SQL 注入开放。

于 2012-07-19T14:36:44.200 回答