0

ユーザー名とパスワードが正しくない場合でもログインするという事実を除いて、完全に機能するログインスクリプトを作成しました。

コードは次のとおりです。

<?php
//SQL ENTRY
$username_db = "root";
$password_db = "";
$host = "127.0.0.1";
$db = "teach_login";

//Requested
$usern = $_POST['username'];
$pw = $_POST['password'];

//Make it safe
$usern = htmlspecialchars($usern);
$pw = htmlspecialchars($pw);
$pwmd5 = md5($pw);

//SQL SETTINGS  
$db_handle = mysql_connect($host, $username_db, $password_db);
$db_open = mysql_select_db($db, $db_handle);
echo $db_open."<br />";
if ($db_open){
    $SQL = "SELECT `username` FROM userpassword WHERE (username = '$usern' && password = '$pwmd5') ";
    $result = mysql_query($SQL);
    echo $result."<br />";;
    if ($result >= 1){
        $SQL_name = "SELECT * FROM `userpassword` WHERE (username = '$usern') ";
        $result_new = mysql_query($SQL_name);
        while($row = mysql_fetch_assoc($result_new)){
            $name = $row['full_name'];
            echo $name;
            echo "<br />";
            echo $row['password']."<br>";
            $SQL = "UPDATE `userpassword` SET `logged_in`=[1] WHERE `username` = '$usern' ";
            $result = mysql_query($SQL);
            if ($result > 0){
                mysql_close($db_handle);
            }else{
                echo "Data Not written";
            }
        }
        /*echo $result_new."<br />";            
        echo $result_name_array."<br />";
        $name = $result_name_array[1];
        echo $name."<br />";
        session_start();
        $_SESSION['login_name'] = $name;
        $_SESSION['login'] = 1;
        mysql_close($db_handle);
        //header ("location: teach_home.php");
        */
    }else{

        echo "Cannot Login";
        //header ("location: teach_login.php");
        mysql_close($db_handle);
    }

}else {
    echo ('DATABASE NOT FOUND');
    mysql_close($db_handle);
}
?>

出力は、SQL ENTRY である次のとおりです。

1<br>
Resource id #4<br>
Salik Sadruddin<br>
14918756cc99b9e6ce69f4c943680efc<br>
Data Not written<br>
4

2 に答える 2

1

これは欠陥がある場所です:

$result = mysql_query($SQL);
if ($result >= 1){
    // …
}

の戻り値はmysql_query、選択された行の数ではありませんが、次のとおりです。

SELECT、SHOW、DESCRIBE、EXPLAIN、および結果セットを返すその他のステートメントのmysql_query()場合、成功した場合はリソースを返し、エラーの場合は FALSE を返します。

あなたの場合、クエリはおそらく成功しますが、レコードは選択されませんがmysql_query、式を満たすリソースが返されます$result >= 1

これを修正するには、次を使用mysql_num_rowsして、選択された行の数を取得します。

if ($result && mysql_num_rows($result) === 1){
    // …
}

標準の MySQL 拡張機能の代わりに、MySQLiまたはPDO_MYSQLを使用することも検討してください。現在のコードは脆弱であるため、SQL インジェクションについても読む必要があります。

于 2012-06-10T11:24:33.240 に答える
0

更新の場合、UPDATE ステートメントが成功すると $result は 0 を返します。挿入の場合は 1 を返します。

$SQL = "UPDATE `userpassword` SET `logged_in`=[1] WHERE `username` = '$usern' ";
        $result = mysql_query($SQL);
        if ($result == 0){
            echo "Data Updated";
            mysql_close($db_handle);
        }else{
            echo "Data Not written";
        }
于 2012-06-10T11:24:10.437 に答える