next up previous contents
Next: 實機操作練習題 Up: SQL Injection 注入 Previous: addslashes 函式   Contents   DYWANG_HOME

限制輸入字元

  1. 除了使用 addslashes() 函式,跳脫可能迼成 sql injection 的字元外,還可以使用正規表示法,限制輸入的字串格式。例如:查詢使用者帳號的變數,限制只能輸入 4 至 20 個字母、數字或下底線組合的字元。
    [root@kvm8 ~]# cat /var/www/html/injection1.php
    <?php
    $dbhost = 'localhost:3306';
    $dbuser = 'root';
    $dbpass = '123qwe';
    $conn = mysqli_connect($dbhost, $dbuser, $dbpass) 
    	or die(mysqli_connect_error().PHP_EOL);
    mysqli_select_db( $conn, 'mysql' )
    	or die('Error: '.mysqli_error($conn).PHP_EOL);
    if (preg_match("/^\w{4,20}$/", $_GET['user'], $matches)){
    	$sql = "SELECT host,user FROM user WHERE user='{$matches[0]}'";
    	$retval = mysqli_query( $conn,$sql );
    	while($row = mysqli_fetch_array($retval, MYSQLI_NUM)) {
    		echo "HOST: {$row[0]}<br>User: {$row[1]}<br>".
    		"--------------------------------<br>";
    	}
    	mysqli_free_result($retval);
    	echo "Fetched data successfully\n";
    } else {
    	echo "user not accepted\n";
    }
    mysqli_close($conn); 
    ?>
    
  2. 在 php 網址後加入 ?user=abc,回應 "user not accepted"。
    [root@kvm8 ~]# curl -s http://kvm8.deyu.wang/injection1.php?"user=abc"
    user not accepted
    
  3. 在 php 網址後加入 ?user='a' or 1,因輸入可能 sql injection 的字元 ,mysqli_query 回應錯誤要求。
    [root@kvm8 ~]# curl -s http://kvm8.deyu.wang/injection1.php?"user='a' or 1"
    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <html><head>
    <title>400 Bad Request</title>
    </head><body>
    <h1>Bad Request</h1>
    <p>Your browser sent a request that this server could not understand.<br />
    </p>
    </body></html>
    
  4. 在 php 網址後加入 ?user=root,查詢結果列出 host 及 user。
    [root@kvm8 ~]# curl -s http://kvm8.deyu.wang/injection1.php?"user=root" | sed 's/<br> */\n/g'
    HOST: 127.0.0.1
    User: root
    --------------------------------
    HOST: ::1
    User: root
    --------------------------------
    HOST: kvm8.deyu.wang
    User: root
    --------------------------------
    HOST: localhost
    User: root
    --------------------------------
    Fetched data successfully
    
  5. 在 php 網址後加入 ?user=1234567890,字串符合要求,但資料庫中無此紀錄。
    [root@kvm8 ~]# curl -s http://kvm8.deyu.wang/injection1.php?"user=1234567890"
    Fetched data successfully
    
  6. 在 php 網址後加入 ?user=12345678901234567890AA,字串超過 20 個字,回應 "user not accepted"。
    [root@kvm8 ~]# curl -s http://kvm8.deyu.wang/injection1.php?"user=12345678901234567890AA"
    user not accepted
    



De-Yu Wang 2020-04-07