备注:
- 我还是php的新手
- 如果我不修改密码,这个登录表单似乎可以很好地工作
- 我试过md5、sha256,现在我把它留在了sha1。这些都不起作用
- 我首先使用
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{
}
?>
我真的不太确定该怎么办。我确信我的代码可能更高效,但正如我在笔记中提到的,当我不散列密码时,它确实有效。感谢您的阅读。
如果您的密码包含任何'
或其他可转义字符,则此操作将不起作用。
$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']);
如果它在你不散列密码时有效,听起来你的密码是以明文形式存储在数据库中的——我会在那里检查。
可能发生的另一件事是,应该在sha1的另一端使用mysql_real_eescape字符串,这样它就不会干扰确切的输入。
所以应该是:mysql_real_escape_string(sha1($_POST['password']));
这可能会改变一些事情。
注意:虽然sha1目前没有任何已知的安全问题,所以它应该在没有mysql转义的情况下直接放入数据库是安全的,但有人曾经告诉我,要始终确保进入数据库的所有内容都应该进行强制转换或转义,以防在sha1或md5等中发现安全漏洞。
您在数据库中的密码似乎没有哈希,您需要更改密码和注册表单,以便所有密码都使用相同的哈希方法。
您可以使用MySQLs SHA1()
函数更改数据库中的所有密码。
转义的密码与输入的密码不是同一个散列。has将不包含任何特殊字符。
abc'sha1!=转义abc'''sha1