md5密码检索

时间:2012-01-03 10:40:26

标签: php mysql encryption md5

我做了一个注册表和一个登录表。

我先使用trim()然后md5()将密码存储在数据库中。

我使用相同的方法在登录表单中检查数据库中的密码,但由于某些未知原因,我无法匹配登录表单中的md5密码。

我想要的只是从数据库中检索密码。

问题是当我将它存储在数据库中并在php myadmin中检查时,md5密码类似于123456789,当我在登录表单中回显它时它给了我1234567890。最后零为零创建问题,否则整个md5密码匹配。我的数据库排序规则是latin_1_swedish_ci

有任何整理问题吗?

我使用varchar值255然后文本等但没有解决方案。

格式或结构有问题吗?

请帮我正确检索md5密码,消除不必要的零。

function login()

    {
        if(isset($_POST['login']))
        {
            if(!$_POST['username'] || !$_POST['password'])
                {die (mysql_error());}

            else
            {
                $username = trim($_POST['username']);
                $username = addslashes($_POST['username']);

                $password = trim($_POST['password']);
                $password = md5($_POST['password']);
                echo $password;


                $check_username = mysql_query("SELECT * FROM users WHERE username = '".$username."'")or die(mysql_error());
                $check_username2 = mysql_num_rows($check_username);

                if ($check_username2 == 0)
                    {die ("Username and password doesnt exist");}
                else 
                    {
                        $check_pass = mysql_query("SELECT * FROM users WHERE username = '".$password."'")or die(mysql_error());
                        $check_pass2 = mysql_num_rows($check_pass); 
                        echo $check_pass2;
                    }


            }
        }
    }

function register()

    {
        if(isset($_POST['submit']))
        {
            if(!$_POST['first_name'] || !$_POST['last_name'] || !$_POST['username'] || !$_POST['password'])
                {header ("Location:user_registration.php");}

            else
                {
                    $firstname = trim($_POST['first_name']);
                    $firstname = addslashes($_POST['first_name']);
                    $lastname = trim($_POST['last_name']);
                    $lastname = addslashes($_POST['last_name']);
                    $username = trim($_POST['username']);
                    $username = addslashes($_POST['username']);
                    $password = trim($_POST['password']);
                    $password = md5($_POST['password']);

                    connect();

                    if($mysql_check_user = mysql_query("SELECT * FROM  `users` WHERE  `username` LIKE  '$username' "))
                        {
                            $check_row = mysql_num_rows($mysql_check_user);
                            if($check_row > 0)
                            die ("username Exist");
                            else 
                                {
                                    $store = mysql_query
                                            ("INSERT INTO `project_upload`.`users` 
                                            (`id`, `fname`, `lname`, `username`, `password`) 
                                     VALUES (NULL, '$firstname', '$lastname', '$username', '$password')");

                                }
                            if ($store)
                                {echo "You have regstered succesfully. please go to <a href = 'uploads_login.php'>login page</a>";                                          }   
                            else {echo mysql_error();}

                        }
                }
        }
    }

2 个答案:

答案 0 :(得分:4)

您遇到的问题是,您在登录代码的开头有一些类似于:echo $password;的内容,以及之后的几行代表echo $check_pass_2;在浏览器的字符串中看起来像0后来。这是因为$check_pass_2只计算了从mysql查询返回的行数,这是0,因为没有用户使用与密码相同的用户名。所以你真正的问题是mysql查询,它检查是否有用户使用与用户输入的密码相同的用户名,这很奇怪。尝试将login.php中的上一个查询更改为:

 $check_pass = mysql_query("SELECT * FROM users WHERE password = '".$password."'") 
 or die(mysql_error());

请注意,username = '".$password."'已更改为password = '".$password."'。 其次,你应该明白,如果你做了类似的事情:

$pass = trim($_POST['pass']);
$pass = md5($_POST['pass']);

然后$ pass变量只是md5'd而没有修剪效果,为此你应该这样做:

$pass = trim($_POST['pass']);
$pass = md5($pass);

但是你不应该修剪你的密码,因为这只是奇怪和不方便,它并没有真正添加任何东西。

执行此操作的行:

if($mysql_check_user 
   = mysql_query("SELECT * FROM  `users` WHERE  `username` LIKE  '$username' "))

if-statement是superfluos,因为你只是在做一个赋值,你可以删除if,只是让变量原样。即:

$mysql_check_user = mysql_query("SELECT * FROM `users` WHERE `username` LIKE '$username'");

此外,尝试在编码时保留某种样式,这样可以更容易地阅读代码。大多数代码编辑器默认都有此功能,也许您需要在每个换行符上按TAB才能正确缩进,这是一个巨大的帮助,尽管如此。它的外观示例:

function register()
{
    if(isset($_POST['submit']))
    {
        if(!$_POST['first_name'] || 
           !$_POST['last_name'] || 
           !$_POST['username'] || 
           !$_POST['password'])
            header ("Location:user_registration.php");
        else
        {
            $firstname = trim($_POST['first_name']);
            $firstname = addslashes($_POST['first_name']);
            $lastname = trim($_POST['last_name']);
            $lastname = addslashes($_POST['last_name']);
            $username = trim($_POST['username']);
            $username = addslashes($_POST['username']);
            $password = trim($_POST['password']);
            $password = md5($_POST['password']);

            connect();

            if($mysql_check_user = mysql_query("SELECT * FROM  `users` WHERE  `username` LIKE  '$username' "))
            {
                $check_row = mysql_num_rows($mysql_check_user);
                if($check_row > 0)
                    die ("username Exist");
                else 
                {
                    $store = mysql_query
                             ("INSERT INTO `project_upload`.`users` 
                             (`id`, `fname`, `lname`, `username`, `password`) 
                             VALUES (NULL, '$firstname', '$lastname', '$username', '$password')");
                }
                if ($store)
                    echo "You have regstered succesfully. please go to <a href = 'uploads_login.php'>login page</a>";                                          
                else 
                    echo mysql_error();
            }
        }
    }
}

答案 1 :(得分:2)

实际上没有解密MD5字符的选项。如果要进行比较,必须将输入转换为MD5字符串,然后可以轻松地与db中的存储值进行比较。