【问题标题】:PHP MD5 Create User FormPHP MD5 创建用户表单
【发布时间】:2011-01-26 10:38:52
【问题描述】:

我在这里使用了一个教程:http://www.phpeasystep.com/phptu/26.html 为我的网站创建登录表单。我已将数据库中的 uPassword 字段设置为 md5,并且数据库中的所有密码都使用 md5 加密。

登录效果很好,但是我对创建注册表有点困惑。

表单要求用户输入他们想要的密码。对于如何获取用户输入的密码,将其转换为 md5,然后将 md5 密码输入到用户表的 uPassword 字段中,我有点困惑。

下面是我的 processresgistration.php 文件的代码:

/* Database connection info*/
mysql_select_db("dbname", $con);

$encryptedpassword = md5($_POST['uPassword']);

md5($uPassword);

$sql="INSERT INTO users (uName, uPassword, uSurname, uFirstName)
VALUES
('$_POST[uName]','$encryptedpassword','$_POST[uSurname]','$_POST[uFirstName]'";

if (!mysql_query($sql,$con))
  {
  die('Error: ' . mysql_error());
  }
echo "Account created.  You can now login";

mysql_close($con)
?>

上面的代码应该是:

  • 创建一个名为 encryptedpassword 的变量
  • 使用 uPassword 作为加密密码
  • 将加密密码转换为 MD5
  • 在用户表中输入MD5密码作为uPassword

我确定我没有在某处使用正确的变量,或者我的语法出现了一个简单的错误;非常感谢任何 cmets/帮助!

谢谢, 克里斯·M

【问题讨论】:

  • 您收到任何输出吗?第一行有错误,在第一行后面加个/...
  • 哇,两个弱点(md5 无盐密码哈希!)和三个远程可利用SQL Injection中的错误大约九行代码。那一定是某种记录。我希望。 :)
  • 错误在查询右括号中缺少检查我的答案
  • 我强烈建议您不要编写您的登录系统。这可能会非常不安全(我发现了 md5、CSRF、SQL 注入(使用 PDO 来防止这种情况),仅举几例)。你应该使用 openid、facebook connect 或类似的东西。我真的很喜欢 lightopenid 库的简单性 => gitorious.org/lightopenid

标签: php md5 user-registration


【解决方案1】:

您的代码需要一些验证和转义,更像这样:

<?php

/* Database connection info */
mysql_select_db("dbname", $con);

if ($_REQUEST['METHOD'] == 'POST') {
    $uName = filter_input(INPUT_POST, 'uName');
    $uPassword = filter_input(INPUT_POST, 'uPassword');
    $uSurname = filter_input(INPUT_POST, 'uSurname');
    $uFirstName = filter_input(INPUT_POST, 'uFirstName');

    // do some validation here ...

    // if everything OK, then crypte the password
    $hashedPassword = md5($uPassword);

    // and store it

    $sql = sprintf(
        'INSERT INTO users (uName, hashedPassword, uSurname, uFirstName)
         VALUES (%s, %s, %s, %s);',
            mysql_real_escape_string($uName, $con),
            mysql_real_escape_string($hashedPassword, $con),
            mysql_real_escape_string($uSurname, $con),
            mysql_real_escape_string($uFirstName, $con)
    );

    if (!mysql_query($sql,$con)) {
        die('Error: ' . mysql_error());
    }

    mysql_close($con);
    echo "Account created.  You can now login";
}

?>

现在登录

<?php

if ($_REQUEST['METHOD'] == 'POST') {
    $uName = filter_input(INPUT_POST, 'uName');
    $uPassword = filter_input(INPUT_POST, 'uPassword');
    $hashedPassword = md5($uPassword);

    $sql = sprintf(
        'SELECT * FROM users WHERE uName = "%s" AND hashedPassword = "%s" LIMIT 1',
            mysql_real_escape_string($uName, $con),
            mysql_real_escape_string($hashedPassword, $con),
        );

    // etc etc ...
}
?>

【讨论】:

  • 我建议在这段代码中添加密码加盐,只使用其他用户的属性。当然,trigger_error 而不是 die
【解决方案2】:
/* Database connection info*

您没有正确关闭您的评论。在行尾添加/

哦,MD5 是不安全的。请改用 SHA1。或者更好的是,使用盐渍 SHA1。

您还需要开始使用mysql_real_escape_string()Little Bobby Tables 转义您放入数据库中的所有用户输入,这样您的数据库会很有趣。

【讨论】:

  • MD5 没什么不好,“转义所有用户输入”是无稽之谈。而且bobby对PHP的mysql库的乐趣非常有限。
  • 转义用户输入是无稽之谈。不应该转义“所有”“输入”,而是转义 string literalsquery。目的地很重要,而不是来源。
  • 这显然是我的意思。 ;x
【解决方案3】:

/* 数据库连接信息*/

 mysql_select_db("dbname", $con);

$encryptedpassword = md5($_POST['uPassword']);

$sql="INSERT INTO users (uName, uPassword, uSurname, uFirstName)
VALUES
('$_POST[uName]','$encryptedpassword','$_POST[uSurname]','$_POST[uFirstName]')";

if (!mysql_query($sql,$con))
  {
  die('Error: ' . mysql_error());
  }
echo "Account created.  You can now login";

mysql_close($con)
?>

括号的关闭是查询中的问题

('$_POST[uName]','$encryptedpassword','$_POST[uSurname]','$_POST[uFirstName]'";

这需要关闭' ) '

【讨论】:

  • md5($uPassword); - 这行没用
  • 我只是试着让他在他的代码中显示缺少的括号 okey 删除了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
  • 2015-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-24
  • 1970-01-01
相关资源
最近更新 更多