繁体   English   中英

数据库中的{plain}密码和登录错误

[英]{plain}password in Database and login error

我正在编写登录面板以访问管理面板。 数据(用户名和密码)存储在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密码替换数据库中字段的“{plain}密码”,则代码效果很好,但如果我将代码修改为以下代码:

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

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

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

我不确定{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来清理您的输入。

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

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

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

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

编辑

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM