3
<?php

include("connect.php");
session_start();
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    // Username and password sent from form in HTML
    $myusername = $_POST['username'];
    $mypassword = $_POST['password'];

    $sql    = "SELECT id FROM users WHERE username='$myusername' and password='$mypassword'";
    $result = mysql_query($sql);
    $row    = mysql_fetch_array($result);
    $active = $row['active'];
    $count  = mysql_num_rows($result);

    // If result matched $myusername and $mypassword, table row must be 1 row
    if ($count == 1) {
        session_register("myusername");
        $_SESSION['login_user'] = $myusername;

        header("location: welcome.php");
    } else {
        $error = "Your username or password is invalid";
    }
}

?>

这是我当前的登录代码。在我的注册页面上,我有它,因此当它注入数据库时​​,它会注入已经在 MD5 中加密的密码。但是,我似乎无法转换:

$mypassword=$_POST['password'];

进入MD5确认,看看密码是否存在于数据库中。使用此代码,不得加密密码。我应该改变什么来使它检查加密的数据库?

4

6 回答 6

5

简单地包装$_POST['password']md5()这样:

$mypassword = md5 ($_POST['password']);

不用说,您还有许多其他问题,例如为数据库提供未转义的用户名,以及没有盐的散列密码,更不用说md5()首先使用了;为此使用内置的crypt()、pbkdf2、bcrypt 或 scrypt 函数,或任何其他密钥派生函数,最好是使用最新哈希方法和大量计数(迭代次数)的函数。PHP 5.5 还引入了简化的密码哈希 API,您可以在此处查看。有关更多与 PHP 散列相关的技巧,请参见此处

总的来说,作为一名开发人员,如果不彻底阅读这篇引人入胜的文章,你就不能活下去。如果您不介意,请跳到底部的 tl;dr(并且可以杀死小猫)。

于 2013-08-06T05:39:31.783 回答
1

PHP 建议您不要使用 MD5 对密码进行哈希处理:http ://www.php.net/manual/en/faq.passwords.php#faq.passwords.fasthash

但是,要直接回答您的问题,您可以使用 md5() 对字符串进行 md5。例子:

$mypassword = md5($_POST['password']);

您可以稍后使用相同的内容进行比较:

"SELECT... WHERE password = '".md5(mysqli_real_escape_string($someValue))."'"
于 2013-08-06T05:39:32.847 回答
0

首先像这样将变量包装到 md5 函数中

$myPassword = md5($_POST['password']);

你怎么只使用 $myusername 它必须我一些关联数组,因为你正在访问一个表 ex(你还必须选择 *不仅仅是来自 db 的 id):- *

$_SESSION['login_user'] = $row['username'];

然后改变这个

if ($_SERVER["REQUEST_METHOD"] == "POST")

对此:-

if (isset($_POST["submit"]))
于 2013-08-06T06:14:04.903 回答
0

传统上你可以这样说:

$myPassword = md5(mysqli_real_escape_string($_POST['password']));

但由于MD5 散列已被证实存在漏洞,您可以在此处使用其他散列算法。理想情况下,您可以像这样使用 SHA-512:

$myPassword = hash('sha512',mysqli_real_escape_string($_POST['password']));

请注意,mysqli_real_escape_string在进行此类查询以防止sql 注入时也很重要,然后您可以在登录时简单地比较散列密码。

于 2013-08-06T05:47:29.513 回答
0

据我了解这个问题。如果您将密码 md5 加密存储在 db 中,您只需要像这样比较$myPassword = md5($_POST['password'])

于 2013-08-06T05:38:37.907 回答
0

感谢大家的帮助!好的,所以我真的很愚蠢...在数据库中设置加密密码的限制。另外,感谢有关如何散列我的密码和内容的建议。

于 2013-08-06T17:25:59.883 回答