注意:
echo sha1("password");
找出我的密码的哈希值,然后我复制了该哈希并用phpMyAdmin手动粘贴。我不确定这是不是问题是什么。无论如何这里是代码:
<?php
session_start();
require("config.php");
if(isset($_POST['submit'])) {
$username = mysql_real_escape_string($_POST['username']);
$password = sha1(mysql_real_escape_string($_POST['password']));
$loginsql = "SELECT * FROM login WHERE username = '" . $username .
"' AND password = '" . $password . "'";
$loginresult = mysql_query($loginsql);
$loginnumrows = mysql_num_rows($loginresult);
if($loginnumrows == 1) {
$loginrow = mysql_fetch_assoc($loginresult);
session_register("USERNAME");
session_register("USERID");
$_SESSION['USERNAME'] = $loginrow['username'];
$_SESSION['USERID'] = $loginrow['id'];
header("Location: " . $config_basedir . "controlpanel.php");
}
else{
echo "<p>Incorrect Login, please try again!</p>";
}
}
else{
}
?>
我真的不太确定该怎么做。我确信我的代码可以更高效,但正如我在笔记中提到的,当我不对密码进行散列时,它确实有效。谢谢你的阅读。
答案 0 :(得分:4)
如果您的密码包含任何'
或其他可转义字符,则无效。
$password = sha1(mysql_real_escape_string($_POST['password']));
你应该首先哈希,然后逃避:
$password = mysql_real_escape_string(sha1($_POST['password']));
由于SHA1只包含[a-f0-9]
,您也可以跳过escpaing
$password = sha1($_POST['password']);
答案 1 :(得分:1)
如果你没有散列密码就行了,听起来你的密码就像明文一样存储在数据库中 - 这就是我要检查的地方。
可能发生的另一件事是mysql_real_escape字符串应该在sha1的另一侧使用,因此它不会干扰确切的输入。
所以它应该是:mysql_real_escape_string(sha1($_POST['password']));
这可能会改变一些事情。
注意:虽然sha1目前没有任何已知的安全问题,所以 可以安全地直接放入数据库而不需要mysql转义,有人曾告诉我要始终确保一切顺利如果在sha1或md5等内容中发现安全漏洞,则应投射或转发到数据库中。
答案 2 :(得分:1)
似乎您的数据库中的密码没有经过哈希处理,您需要更改它和您的注册表单,以便所有人都使用相同的哈希方法。
您可以使用MySQL SHA1()
功能更改数据库中的所有密码。
答案 3 :(得分:0)
转义的密码与输入的密码不同。该版本不包含任何特殊字符。
abc'sha1!=转义abc \'sha1