-1

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

注册页面提取:

$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

4 回答 4

3

$has_pass = crypt('$password');

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

crypt($password);

于 2012-11-21T23:00:58.563 回答
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确保该用户可以从中获取密码的输入,但我故意将其作为您的作业:)

于 2012-11-21T23:05:38.403 回答
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) . "'");
于 2012-11-21T23:09:44.950 回答
0

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

于 2012-11-22T00:22:22.033 回答