next up previous contents
Next: PHP 避免 SQL 注入 Up: SQL Injection 注入 Previous: SQL 注入查詢   Contents

限制輸入字元

  1. 範例:查詢使用者帳號。增加查詢限制只能輸入 4 至 20 個字母、數字或下底線組合的字元。
    [root@kvm8 ~]# cd /var/www/html
    [root@kvm8 html]# vim injection.php 
    [root@kvm8 html]# cat injection.php 
    <?php
    $dbhost = 'localhost:3036';
    $dbuser = 'root';
    $dbpass = '123qwe';
    $conn = mysql_connect($dbhost, $dbuser, $dbpass);
    if(! $conn ) {
            die('Could not connect: ' . mysql_error());
    }
    
    if (preg_match("/^\w{4,20}$/", $_GET['user'], $matches)){
            $sql = "SELECT host,user FROM user WHERE user='{$matches[0]}'";
            mysql_select_db('mysql');
            $retval = mysql_query( $sql, $conn );
            while($row = mysql_fetch_array($retval, MYSQL_NUM))   {
             echo "HOST:  {$row[0]}  <br> ".
             "User:  {$row[1]} <br> ".
             "--------------------------------<br>";
            }
    } else {
            echo "user not accepted";
    }
    ?>
    
  2. 在 php 網址後加入 ?user=abc,回應 "user not accepted"。
    Image injection3
  3. 在 php 網址後加入 ?user='a' or 1,過濾字元後一樣回應 "user not accepted"。
    Image injection4
  4. 在 php 網址後加入 ?user=dywang,查詢結果列出 host 及 user。
    Image injection5
  5. 在 php 網址後加入 ?user=1234567890,字串符合要求,但資料庫中無此紀錄。
    Image injection6
  6. 在 php 網址後加入 ?user=12345678901234567890AA,字串超過 20 個字,回應 "user not accepted"。
    Image injection7



2017-10-27