-2

これは、SESSIONSを使用した最初のログインシステムです。SQLインジェクションに安全かどうか疑問に思っていますか?

<?php
$username = $_POST['username'];
$password = $_POST['password'];

if(isset($username, $password)) {
    if(get_magic_quotes_gpc()) {
        $ousername = stripslashes($username);
        $uusername = mysql_real_escape_string(stripslashes($username));
        $opassword = stripslashes($_POST['password']);
    } else {
        $uusername = mysql_real_escape_string($username);
        $opassword = $password;
    }   
    $req = mysql_query('select password,id from users where username="'.$uusername.'"');
    $dn = mysql_fetch_array($req);

    if($dn['password']==$opassword and mysql_num_rows($req)>0)
    {
        $form = false;
        $_SESSION['username'] = $_POST['username'];
        $_SESSION['userid'] = $dn['id'];        

    echo 'Logged in m8';
    } else {
        $form = true;
        $message = 'The username or password is incorrect.';
    }
} else {
    $form = true;
}
if($form)
{ 
if(isset($message)) {
    echo '<div class="message">'.$message.'</div>';
}           
?>

以前にハイスコアスクリプトでSQLインジェクションを取得していたので、単純なセッションのログインスクリプトにSQLインジェクションがあるかどうか疑問に思っていましたが、40%あります。通常、SQLインジェクションの原因は何ですか。ありがとう!

4

2 に答える 2

1

コードは大丈夫ですが、保護の考え方が間違っています
mysql_real_escape_stringはインジェクションから保護しません。文字列をフォーマットします。 文字列が適切にフォーマットされている限り、安全です。

この問題は、同じ関数を使用して非文字列(たとえば、数値)をフォーマットしようとしたときに始まります。
それは完全に役に立たなくなり、SQLは脆弱になります。

したがって、現在のコードを維持することはできますが、将来的には、別のクエリパーツを使用する必要があるとすぐに、別の形式にする必要があります。完全なルールのセットは次のとおりです。PHPでは、データベースに文字列を送信するときに、htmlspecialchars()を使用して不正な文字を処理する必要がありますか、それとも正規表現を使用する必要がありますか?

そしてもちろん、パスワードをエスケープしないでください!私が次のようなパスワードを持っている場合、wef5623'sdfそれは私を決して入れません!

ちなみに、$ _ POST ['username']、$ username、$ uusername、$ousernameなどの単一の値に非常に多くの変数を使用している理由がわかりません。

于 2013-02-22T05:10:25.080 に答える
-3

私なら、変えるね $opassword = $password;

 $opassword = mysql_real_escape_string($password);

SQLインジェクションはパスワードフィールドを介して行うこともできます。

于 2013-02-22T03:34:18.650 に答える