1

Acunetix Web Vulnerability Scanner 8 でサイトをテストすると、登録ページに 2 つの SQL インジェクションがあるとのことです

URL エンコードされた POST 入力メールは 1##xa7## に設定されました URL エンコードされた POST 入力ユーザー名は 1##xa7## に設定されました

エラー メッセージが見つかりました: 指定された引数は有効な MySQL 結果ではありません

これら2つのPHPコード

 $username = mysql_real_escape_string(trim($_POST['username']));
 $email = mysql_real_escape_string(trim($_POST['email']));

        if ($username==!preg_match('/^[a-zA-Z0-9._]+$/', $username)){
         $error_stat = 1; 
              $message_error .= 'Error:invalid username.';
        }
         elseif (!filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL)) {
            $error_stat = 11; 
              $message_error .= 'Error:invalid email.';

          }

これがSQLインジェクションに対してどのように脆弱になる可能性があるか

@ペッカ

 $checkusername = mysql_query("SELECT Username FROM users WHERE Username = '$username'");
    $checkemail = mysql_query("SELECT EmailAddress FROM users WHERE EmailAddress = '$email'");

    $username_exist = mysql_num_rows($checkusername);
    $email_exist = mysql_num_rows($checkemail);

エラーを表示するためにそれらのいずれかが存在する場合:

<?php if ($error_stat > 0){ echo $message_error; }?>

エラーがない場合

$registerquery = mysql_query("INSERT INTO users (Username, password, EmailAddress,Activation,registered) VALUES('".$username."', '".$password."', '".$email."','".$activation."','".$date."')");

編集 //

だからみんな私は PDO で別のページを作成し、新しいエラーは次のとおりです。

SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (cp1251_general_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='

これは、[Launch the attack with HTTP Editor] をクリックしたときに Acunetix が表示するものです。プログラムで使用されるユーザー名は次のとおりです。1%c0%00xa7%c0a2

PDO

プログラムでは、ユーザー名は = 1%c0%00xa7%c0a2 で、エラーは 32 行目にあります

 line 30 $getMail = $dbh->prepare("SELECT EmailAddress FROM users WHERE username = :username");
    line 31 $getMail->bindParam(':username', $username);
    line 32 $getMail->execute();
    line 33 $rowMail = $getMail->fetch();
    line 34 $email = $rowMail['emailaddress'];
4

1 に答える 1

-1

私が言えることから、ここのすべてのフィールドをエスケープする必要があります:

$registerquery = mysql_query("INSERT INTO users (Username, password, EmailAddress,Activation,registered) VALUES('".$username."', '".$password."', '".$email."','".$activation."','".$date."')");

あなたが持っている:

$username = mysql_real_escape_string(trim($_POST['username']));
 $email = mysql_real_escape_string(trim($_POST['email']));

$password、$activation、および $date についても同じにする必要があります...そうするかどうかはわかりません

とにかく私は通常これを使用します:

function getPost($s) {
        if (array_key_exists($s, $_POST))
            return mysql_real_escape_string(htmlspecialchars($_POST[$s]));
        else return false;
    }


    function getGet($s) {
        if (array_key_exists($s, $_GET))
            return mysql_real_escape_string(htmlspecialchars($_GET[$s]));
        else return false;
    }

しかし、それは XSS から保護するためでもあります... mysql_real_escape_string() で安全であるべきだと思います。

とにかく、プリペアドステートメントを使用して、これをすべて忘れることもできます!! http://php.net/manual/en/pdo.prepared-statements.php

編集 有効なユーザー名がありませんよね?では、これはどうですか:

try{
$getMail = $dbh->prepare("SELECT EmailAddress FROM users WHERE username = :username");
$getMail->bindParam(':username', $username);
$getMail->execute();
$rowMail = $getMail->fetch();
$email = $rowMail['emailaddress'];
}
catch( PDOException $Exception ) {
echo 'Authentication Failed';
}

今はテストできませんが、この行の周りにあるはずです...

于 2012-02-25T15:34:35.253 に答える