簡體   English   中英

表單中的SQL注入

[英]Sql injection from form

我使用Acunetix Web Vulnerability Scanner 8測試了我的網站,並說我的注冊頁面中有2個sql注入

URL編碼的POST輸入電子郵件設置為1 ## xa7 ## URL編碼的POST輸入用戶名設置為1 ## xa7 ##

發現錯誤消息:提供的參數不是有效的MySQL結果

這兩個的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 '='

這是當我單擊使用HTTP編輯器啟動攻擊時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'];

據我所知,您應該在此處轉義所有字段:

$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()保持安全。

無論如何,您也可以使用Prepared語句,而不必理會這一切!! http://php.net/manual/zh/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';
}

目前無法對其進行測試,但這應該是圍繞這條線的……

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM