【问题标题】:md5 password retrievingmd5密码找回
【发布时间】:2012-01-03 10:40:25
【问题描述】:

我制作了注册表和登录表单。

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

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

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

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

有没有排序问题?

我 hv 使用 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();}

                        }
                }
        }
    }

【问题讨论】:

  • 你到底为什么在密码上使用trim()
  • 能否请您发布用于检索和存储密码的代码?
  • 您确定零来自数据库并且没有被代码中的其他内容回显吗?
  • 没有任何代码示例,我们只能猜测出了什么问题,而不是为您的问题提供实际的解决方案。你能把你的一些代码和问题一起发布吗?
  • trim() 结果实际上被丢弃了,所以这不是问题所在。 login() 中的第二个 SELECT 语句正在搜索名为 md5($_POST['password']) 的用户,这对我来说似乎是错误的。此外,MD5 从不返回 9 或 10 位字符串。简而言之 - 不可能看到这里发生了什么......

标签: php mysql encryption md5


【解决方案1】:

正如我所见,您遇到的问题是您在登录代码的开头有类似:echo $password; 和几行之后您有 echo $check_pass_2; 这将导致一个字符串之后看起来像 0 的浏览器在那里。这是因为$check_pass_2 只计算了从 mysql 查询返回的行数,这是 0,因为没有用户名与密码相同。所以你真正的问题是mysql-query,它检查是否有一个用户与某人输入的密码具有相同的用户名,这很奇怪。尝试将 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 语句是多余的,因为你只是在做一个赋值,你可以删除 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();
            }
        }
    }
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 先生,我做到了,但由于 MD5 数字末尾的扩展零而没有得到正确的匹配,例如,如果 md5 转换为 123456789,我最后得到 1234567890 一个零
    • 你如何检查你得到“1234567890”。删除 trim() 方法后您是否也检查过。
    • @Krishnan 是的,我已经尝试删除修剪。我通过注册存储了用户名和 md5 密码。 den 我查看了 php myadmin 用户表中的 md5 代码,我在其中存储了该密码。 den 我在登录表单中再次使用 md5 加密方法来匹配密码。但是当我开始收到密码不匹配的错误时。我在浏览器中回显了 md5 转换后的密码(我在登录表单中使用了该密码)。我得到完全相同的 md5 加密代码,除了代码末尾的附加零。
    猜你喜欢
    • 1970-01-01
    • 2010-11-09
    • 2011-05-07
    • 1970-01-01
    • 2011-04-30
    • 2021-07-03
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多