验证和存储密码的问题

时间:2012-11-21 22:59:01

标签: php mysqli

我最近在注册页面中为我的密码添加了加密。

注册页面提取:

$hashed_password = crypt('pass1'); 
mysqli_query($mysqli, "INSERT INTO Persons (Username, Password, Email, Gender) VALUES ('$euser', '$hashed_password', '$eemail', '$gender')");

这很好,据我所知,所有数据都在数据库中正确输入。

登录页面不会验证表单。

登录页面提取

if( $page_mode == 'Login' )
{
    $username = $_POST['username'];
    $password = $_POST['password'];
    if( trim($username) == '' || trim($password) == '' )
    {
        $error_string .= '<font color=red>You have left either the username or password field blank!</font>';
    }
    else
    {
        require "globe.php";
        $result = mysqli_query("SELECT PlayerID, Username, Password FROM Persons WHERE Username='" . mysqli_real_escape_string($username) . "'");
        $has_pass = crypt($password, $row['Password']); 
        if( !($row = mysqli_fetch_assoc($result)) || ($row['Password'] != $has_pass) )
        {
            $error_string .= '<font color=red>Please check your username or password. Your details weren\'t correct.</font> ';
        }
        else 
        {
        $error_string .= '<font color=red>login not ready </font> ';
        mysqli_close($mysqli);
        }
    }
}

似乎没有检查它。我不明白为什么?任何人都知道

如果用户名和密码字段为空,则唯一可行的是错误消息。

编辑:

假设密码是“测试”,我输入测试页面验证它(也是登录页面)只返回背景。

如果我输入任何其他内容,也会出现同样的问题。

编辑:

添加了所有支持。但仍然没有运气

4 个答案:

答案 0 :(得分:3)

$has_pass = crypt('$password');

您尝试在单引号内插入变量。只需使用

crypt($password);

答案 1 :(得分:1)

除了crypt()之外的其他答案指出的错误,而不是

$mysqli_query(...

mysqli_query(...

更不用说你有条件地关闭mysqli连接,而你应该总是关闭它。

修改

试试这个

if( $page_mode == 'Login' )
{
    $username = trim($_POST['username']);
    $password = trim($_POST['password']);

    if( ($username == '') || ($password == '') ) {
        $error_string .= '<font color=red>You have left either the username or password field blank!</font>';
    } else {
        require "globe.php";

        $query = sprintf("SELECT PlayerID, Username, Password FROM Persons WHERE Username='%s' LIMIT 1",
                                                mysqli_real_escape_string($mysqli, $username) );


        $result = mysqli_query( $query );

        if( ($result !== false) && (mysqli_num_rows($result) == 1) ) { 
          $row = mysqli_fetch_assoc($result);
          if( $row['Password'] != crypt($password, $row['Password']) ) {
              $error_string .= '<font color=red>Please check your username or password. Your details weren\'t correct.</font> ';
          } else {

              // OK

          }
        } else {
            $error_string .= '<font color=red>Please try again</font> ';
        }

        mysqli_close($mysqli);
    }
}

您仍然需要检查$result以确保查询成功,以及$row以确保该用户可以输入密码的salf,但我故意将其作为您的作业:)

答案 2 :(得分:1)

您必须向crypt提供原始盐。

$has_pass = crypt($password, $row['password']); 

编辑:您需要将数据库句柄传递给mysqli_query。类似的东西:

$result = mysqli_query($mysqli, "SELECT PlayerID, Username, Password FROM Persons WHERE Username='" . mysqli_real_escape_string($username) . "'");

答案 3 :(得分:0)

尝试添加mysqli handle作为mysqli_real_escape_string的第一个参数,并检查你得到一行 - mysqli_real_esacpe_string($ handle,$ string)