1

我使用 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注入的影响

@Pekka

 $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'];
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 回答