好的,所以我在index.php中有这个
<form action="login.php" method="post">
<font >Username</font><br />
<input type="text" class="form-control" name="name" value="" style="width: 140px" />
<br />
<font >Password</font><br />
<input type="password" class="form-control" name="passwd" value="" style="width:140px"/>
<br /><br />
<input type="submit" value="Login" class="btn btn-primary"" style="width: 140px"/> </form>
我遇到的问题是,当用户登录时,他们可以使用任何密码并继续使用usercp.php,所以它只检查用户名,我错过了哪个部分或者我做错了?对任何回复都表示赞赏。
其他信息:我的数据库已将密码保存在md5
中然后这是我的login.php
*的 UPDAATE
我将代码更改为;
<?php
require("common.php");
$submitted_name = '';
if(!empty($_POST))
{
$query = "
SELECT
name,
passwd
FROM users
WHERE
name = :name
";
$query_params = array(
':name' => $_POST['name']
);
try
{
$stmt = $db->prepare($query);
$result = $stmt->execute($query_params);
}
catch(PDOException $ex)
{
die("Failed to run query: " . $ex->getMessage());
}
$login_ok = false;
$row = $stmt->fetch();
if($row)
{
$check_passwd = md5( $_POST['passwd']);
if($check_passwd === md5($row['passwd']))
{
$login_ok = true;
}
} if($login_ok)
{
unset($row['passwd']);
$_SESSION['user'] = $row;
header("Location: usercp.php");
die("Redirecting to: usercp.php");
}
else
{
print("Login Failed.");
$submitted_name = htmlentities($_POST['name'], ENT_QUOTES, 'UTF-8');
}
}
?>
通过更改
if($check_passwd = md5($row['passwd']))
到这个
if($check_passwd === md5($row['passwd']))
我无法使用正确或错误的密码登录,我也尝试使用x2 =
所有帮助都非常感谢,谢谢!
答案 0 :(得分:1)
问题是一个简单的语法错误:
if($check_passwd = md5($row['passwd']))
应该是
if($check_passwd === md5($row['passwd']))
但是,正如我在上面的评论中提到的,md5不适合散列密码。
修改强>
这只是在黑暗中拍摄,但我相信这是你需要做的才能让它与md5一起工作:
if($row)
{
$check_passwd = md5( $_POST['passwd']);
for($round = 0; $round < 65536; $round++)
{
// I took out $row['passwd'] from the following line because it makes no sense
$check_passwd = md5( $check_passwd); // <-- This is probably what you want
}
if($check_passwd === md5($row['passwd']))
{
$login_ok = true;
}
}
如果您反而注意我的警告并使用password_hash(),这就是您可以做的事情(注意,如果你有PHP&lt; 5.5,那么前一个链接中的github兼容函数是向前兼容的) :
首先,将新字段添加到数据库store the bcrypt hash并调整程序中的所有逻辑以使用它而不是md5:
if($row) {
$login_ok = password_verify($_POST['passwd'], $row['bcrypt_passwd'])
}
然后,只需向所有用户发送电子邮件,告知您已更新了脚本,并且要求所有人重置密码并提供密码重置链接的链接(您确实有一个,对吧?)。
要计算密码的哈希值,您需要做的就是:
$hash = password_hash($_POST['passwd']);
此哈希是您存储在数据库中的内容。
答案 1 :(得分:1)
你说你的数据库有哈希密码,但那你为什么要再次使用MD5?
if($check_passwd === md5($row['passwd'])) //This is wrong
{
$login_ok = true;
}
if($check_passwd === $row['passwd']) //This should do the trick
{
$login_ok = true;
}
答案 2 :(得分:0)
SELECT name,passwd,FROM users WHERE name =:name
不要在passwd param之后使用','。
答案 3 :(得分:0)
试试这个
if($row)
{
$check_passwd = md5( $_POST['passwd']);
/*for($round = 0; $round < 65536; $round++)
{
$check_passwd = md5( $check_passwd . $row['passwd']);
}*/
if($check_passwd == $row['passwd'])
{
$login_ok = true;
}
}
我真的没有看到for循环的含义(如果你运行一次或10次或65536,则更改),它只会使页面加载速度变慢。此$check_passwd = md5( $_POST['passwd'] . $row['passwd']);
以上的内容永远不会等于md5($row['passwd'])
。请将您的密码保存为数据库表中的哈希值,因为它根本不是保存密码的标准程序。