我有注册表和登录表单。我在注册表中使用了 md5 加密,它工作正常。但是当我尝试使用(123)等真实密码登录时,它不会登录我。另一方面,当我在密码字段中复制粘贴该md5加密时,它会登录我。请帮帮我!谢谢!
这是我的编码:
<?php
if (isset($_POST['submit'])) {
$user_name = $_POST['username'];
$user_email = $_POST['email'];
$user_pass = $_POST['password'];
$query = "SELECT * FROM users where Email = '" . $_POST["email"] . "'";
$result = $obj->run_query($query);
if ($count = mysqli_num_rows($result) == 0) {
$query = "INSERT INTO users (Name,Email,Pass) VALUES ('$user_name','$user_email', md5('$user_pass'))";
$result = $obj->run_query($query);
echo "<script>alert('You have successfully Registered!')</script>";
echo "<script>window.open('welcome.php','_self')</script>";
} else {
echo "<script>alert('This user email $user_email is already exist!')</script>";
}
}
// login script
if (isset($_POST['login'])) {
$name = $_POST['name'];
$email = $_POST['email'];
$password = $_POST['pass'];
$query = "SELECT * FROM users WHERE Email = '$email' AND Pass = '$password'";
$result = $obj->run_query($query);
if ($count = mysqli_num_rows($result) > 0) {
$_SESSION['email'] = $email;
$_SESSION['name'] = $name;
echo "<script>window.open('welcome.php','_self')</script>";
}
else
{
echo "<script>alert('Your email or password is incorrect!')</script>";
}
}
?>
如前所述:您正在比较表中 POST 数组$password = $_POST['pass'];
中的纯文本和 MD5。
这应该读作$password = md5($_POST['pass']);
我还说过,你不应该忍受这个,"永远"。如果它是一个实时站点,我建议您将其搁置,直到您使用"本世纪"的安全哈希函数。
MD5 已有 30+ 岁,现在不再被认为可以安全地用于散列/存储密码。
请咨询以下内容:
- MD5 被认为是不安全的吗?
- https://en.wikipedia.org/wiki/MD5
密码
使用以下方法之一:
- CRYPT_BLOWFISH
-
crypt()
-
bcrypt()
-
scrypt()
- 在开墙上
- PBKDF2
- PBKDF2 on PHP.net
- PHP 5.5 的
password_hash()
函数。 - 兼容包(如果 PHP <5.5)https://github.com/ircmaxell/password_compat/
其他链接:
- PBKDF2 for PHP
关于列长的重要旁注:
如果您决定使用password_hash()
或加密,请务必注意,如果您当前密码列的长度小于 60,则需要将其更改为该长度(或更高)。手册建议长度为 255。
您需要更改列的长度并使用新的哈希重新开始才能使其生效。否则,MySQL 将以静默方式失败。
您当前的代码也可以进行SQL注入。 将mysqli
与预准备语句一起使用,或将 PDO 与预准备语句一起使用。