2012-07-19 55 views
0

我正在编写一个登录面板来访问管理面板。 数据(用户名和密码)存储在MySQL数据库(类型:InnoDB)中。 查看表中密码存储为普通和在我有的字段密码: {纯}密码。数据库中的{plain}密码和登录错误

修改我已有的代码,我遇到了一些问题,因为{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()); 

所以,如果我取代从外地“{普通}密码”中与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()); 

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

任何想法如何解决这个问题?

+0

您是否尝试将“{plain}”连接到密码? – Nico 2012-07-19 14:34:39

+2

请参阅http://xkcd.com/327/ – 2012-07-19 14:36:30

+1

另请参阅:http://bobby-tables.com/ – NullUserException 2012-07-19 14:39:09

回答

1

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

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

还要注意的是,你应该在die()命令使用mysqli功能以及(因此使用$mysqli->error)改变mysql_error()

PS:你应该看看如何存储密码时下。以纯文本存储它们不是以任何方式安全的。

编辑

这里提起由@BrianRasmussen注释以及: 确保$username$password在查询中直接使用(使用字符串连接)之前已经sanitzed!否则,您的代码将打开各种SQL注入。

+0

都没有直接从用户输入构建查询 – 2012-07-19 14:38:45

+0

@BrianRasmussen你在哪里看到建设查询直接来自用户输入?'$ username'和'$ password'可能(也应该有)之前已经过清理。 – Sirko 2012-07-19 14:40:44

+0

也许,但是有什么机会... – 2012-07-19 14:42:40

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来清理您的输入。

+0

谢谢你的回答,不幸的是,我只是在问这个{plain}事是特别的还是特殊的。同时也要感谢您提供有关如何在数据库中存储密码的建议,但不幸的是,我正在处理其他人的代码,并且我无法修改任何内容。 我知道这是一个坏的东西,在数据库中存储普通密码,但我是一个初级编码器,无法修改什么高级: – Mark 2012-07-19 14:57:50