繁体   English   中英

无法获得我的网站的登录信息

[英]Can't get the login for my site to work

这次我更新了代码并使用了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和密码,它也没有显示。 我不知道为什么会这么做。

您的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注入的信息。

你的问题是

 $_POST["usersname"]

没有定义。

当您在查询中使用$name ,请使用此mysql_real_escape_string($name)

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

首先,您确实应该使用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,请知道您编写的代码由于两个问题而无法正常工作:

  • 您拼写了$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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM