0

我更新了我的代码并使用了 mysqli 这次我没有收到任何错误但它现在不允许我登录。

<?php
$host = 'my host';
$user = 'me';
$PW = 'my password';
$dB = 'login';
$table = 'members';
$field = 'username';    
/* Create a new mysqli object with database connection parameters */
$mysqli = new mysqli($host, $user, $PW, $dB);
if(mysqli_connect_errno()) {
    echo "Connection Failed: " . mysqli_connect_errno();
    exit();
}    
//Grab User submitted information
$name = $_POST['username']; //login name
$pass = $_POST['password'];  //login password    
/* Create a prepared statement */
if($stmt = $mysqli -> prepare("SELECT f_name FROM $table WHERE $field=?
AND password=?")) {
    /* Bind parameters
    s - string, b - blob, i - int, etc */
    $stmt -> bind_param("ss", $name, $pass);
    /* Execute it */
    $stmt -> execute();        
    /* Bind results */

    $stmt -> bind_result($result);

    /* Fetch the value */

    $stmt -> fetch();

    if ($result == NULL) {
        echo "That combo of username and password is wrong!";
    }
    else{
        echo "Hello " . $result;
    }
    /* Close statement */
    $stmt -> close();
}
/* Close connection */
$mysqli -> close(); 
?>

我认为它现在可以工作,但即使我输入正确的 ID 和密码,它也会说我没有。我不知道它为什么会这样做。

4

3 回答 3

2

您的 SQL 查询无效:

"SELECT * FROM members WHERE username = $name"
// will result in 
"SELECT * FROM members WHERE username = "
// if name is empty or
"SELECT * FROM members WHERE username = SOMEVALUE"
// if name is "SOMEVALUE".

无论哪种方式,它都是无效的查询字符串,因为 SOMEVALUE 不被解释为字符串。你可以试试这个:

$result = mysql_query('SELECT * FROM members WHERE username = "'.mysql_real_escape_string($name).'"');

mysql_real_escape_string() 用于转义可能导致问题/不良行为的字符。查询中的字符串应该用引号括起来。

我建议查看 PDO(http://php.net/manual/en/book.pdo.php)并阅读有关 mysql 注入的信息。

于 2013-06-15T23:11:53.227 回答
1

首先,你真的应该使用mysqli。标准mysql_功能现在已被弃用,并且出于非常充分的原因。如果使用 mysqli 重写,您的代码将如下所示:

<?php
//Connect to database
$con = new mysqli('host', 'user', 'PW', 'dB');
if( $con->connect_errno > 0 ) {
    die( 'Unable to connect to dB!' );
}

//Grab User submitted information
$name = $_POST['username']; //login name
$pass = $_POST['password'];  //login password

// Make sure you do some validation of the $_POST data here

//Fetch user record from members table where username = inputed name
$statement = $con->prepare("SELECT password FROM members WHERE username = ?");
// Binds $name as a string ('s') parameter to the first ? found in the statement
$statement->bind_param('s', $name);
$statement->execute();

//check to see if that username exists in DB & if not; stop, inform user & ask if he       wants to register
if ( $statement->num_rows === 0 ) {
    die('User does not exist. <a href="register.php">Click Here to Register</a>');
}

// Bind variables to the result; you need a variable for every column that is selected
$statement->bindResult($dbPassword);
$statement->fetch();

//check password, if pw entered != pw from pulled record then stop & inform user
if ($pass != $dbPassword) {
    die('Incorrect password, please try again.');
}

$statement->close();
$con->close();

如果您毕竟没有使用 mysqli,请知道您编写的代码由于 2 个问题而无法正常工作:

  • 你拼写$name = $_POST["usersname"];usersname而不是username
  • 在行上$result = mysql_query("SELECT * FROM members WHERE username = $name");,您需要像这样转义字符串:username = " . mysql_real_escape_string( $name ) . "否则不会添加引号,并且字符串将被误解为令牌(此外,还有 SQL 注入问题)

除了这些点之外,在数据库中正确存储密码也很重要。您不能以纯文本形式存储密码,因为这是一个巨大的安全风险。您需要将密码存储为哈希,这是一种单向函数,无法(或至少更难)获取密码。我建议您查看 PHP 中的Crypt 函数。与 Blowfish 算法和合适的盐一起使用,它可以提供出色的安全性,但有关此的更多细节超出了本文的范围。您可以在该页面上的评论中找到更多信息。

编辑:更新代码不使用 get_result()

于 2013-06-15T23:34:36.020 回答
1

你的问题是

 $_POST["usersname"]

没有定义。

当您$name在查询中使用时使用 this mysql_real_escape_string($name)

如果这是你的代码,它对 sql 注入的灾难。您应该更改为 mysqli 或 PDO

于 2013-06-15T23:11:35.317 回答