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 を返します。2 番目のクエリでは 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);
}

NB 私は 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代わりにストレート変数を使用します)。

2 番目の例では、それらを設定しません。

次のように動作しますか (変数を連結して文字列にする必要はないことに注意してください)。

   $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 に答える