0

我正在尝试对用户通行证进行验证。更新代码:

$username="------";
$password="------";
$database="------";
$host = "------";


mysql_connect($host,$username,$password);
mysql_select_db($database) or die( "Unable to select database");

$username = $_POST['username'];
$password = $_POST['password'];

echo 'username: ' . $username . '<br>';  //myname
echo 'password: ' . $password . '<br>';  //mypass

function checkpass()
{
    //$result = mysql_query("SELECT * FROM REG_USERS where USERNAME='$_POST[username]' and PASSWORD='$_POST[password]' ") or die(mysql_error());  
    $result = mysql_query("SELECT * FROM REG_USERS where USERNAME='" . $username . "' and PASSWORD='" . $password . "'") or die(mysql_error());  
    return  mysql_num_rows($result);
}

checkpass();
echo 'checkpass:'. checkpass();

在第一个查询中,checkpass 返回 1。在第二个查询中,它返回 0。为什么?

4

3 回答 3

2

好的,现在我们有了整个代码,这很明显。

$username并且$password不是全球性的。该函数不知道它们设置为什么。

$username = $_POST['username'];
$password = $_POST['password'];

echo 'username: ' . $username . '<br>';  //myname
echo 'password: ' . $password . '<br>';  //mypass

function checkpass()
{
    $username = mysql_real_escape_string($_POST['username']);
    $password = mysql_real_escape_string($_POST['password']);

    //$result = mysql_query("SELECT * FROM REG_USERS where USERNAME='$_POST[username]' and PASSWORD='$_POST[password]' ") or die(mysql_error());  
    $result = mysql_query("SELECT * FROM REG_USERS where USERNAME='" . $username . "' and PASSWORD='" . $password . "'") or die(mysql_error());  
    return  mysql_num_rows($result);
}

注意我知道mysqli。OP 没有询问它,我也没有对此着迷,但我已经添加了 mysql_real_escape_string 以作为很好的衡量标准。

于 2013-01-09T19:48:06.030 回答
0

让我们抛开 mysql 接口的问题(以后不好用)以及您真的不想将任何类型的用户影响变量直接放入您的 sql 字符串 [SQL 注入!!!!] 的事实,您在您的描述中说以下内容:

$result = mysql_query("SELECT * FROM REG_USERS where
USERNAME='" . $username . "' and PASSWORD='" . $password . "'") or die(mysql_error());

不起作用。

为什么会呢?$username$password设置为空。在您的第一个示例中,您首先将它们设置为某个值,但随后您不使用它们(而是使用直接$_POST变量)。

在您的第二个示例中,您没有设置它们。

那么以下工作是否有效(请注意,您无需连接变量即可将它们放入此处的字符串中)?

   $username = $_POST['username'];  
   $password = $_POST['password'];  

   $result = mysql_query("SELECT * FROM REG_USERS where  
   USERNAME='$username' and PASSWORD='$password'") or die(mysql_error()); 

同样,确保您从未在实际代码中实际执行此操作(只是将变量直接放入 SQL 字符串中)。请改用准备好的语句。

于 2013-01-09T19:29:23.953 回答
-1

这是使用的解决方案mysqli_

$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$city = "Amersfoort";

/* create a prepared statement */
if ($stmt = mysqli_prepare($link, "SELECT USERNAME FROM REG_USERS WHERE USERNAME = ? AND PASSWORD = ?")) {

    /* bind parameters for markers */
    mysqli_stmt_bind_param($stmt, "ss", $_POST[username], $_POST[password]);

    /* execute query */
    mysqli_stmt_execute($stmt);

    /* bind result variables */
    mysqli_stmt_bind_result($stmt, $USERNAME);

    /* fetch value */
    mysqli_stmt_fetch($stmt);

    echo "The username is $USERNAME";

    /* close statement */
    mysqli_stmt_close($stmt);
}

/* close connection */
mysqli_close($link);
于 2013-01-09T19:16:22.557 回答