相似PHP語言的 mysql_real_escape_string() 的函數,在用來防範SQL注入的時候,可能會遇到int型注入成功的狀況。php
mysql_real_escape_string() 函數轉義 SQL 語句中使用的字符串中的特殊字符。
下列字符受影響:mysql
\x00 \n \r \ ' " \x1a
若是成功,則該函數返回被轉義的字符串。若是失敗,則返回 false。sql
過濾String型參數的代碼案例:函數
<?php $con = mysql_connect("localhost", "hello", "321"); if (!$con){ die('Could not connect: ' . mysql_error()); } // 得到用戶名和密碼的代碼 $user = $_POST("user"); $pwd = $_POST("pwd"); // 轉義用戶名和密碼,以便在 SQL 中使用 $user = mysql_real_escape_string($user); $pwd = mysql_real_escape_string($pwd); $sql = "SELECT * FROM users WHERE user='" . $user . "' AND password='" . $pwd . "'" //... mysql_close($con); ?>
這樣其實只能過濾string型參數,可是若是是int型參數就不行了,下面解釋緣由。code
<?php $con = mysql_connect("localhost", "hello", "321"); if (!$con){ die('Could not connect: ' . mysql_error()); } // 得到用戶名和密碼的代碼 > 過濾String型參數; $mobile = $_POST("mobile"); $v = $_POST("v"); // 轉義用戶名和密碼,以便在 SQL 中使用 $mobile = mysql_real_escape_string($mobile); $v = mysql_real_escape_string($v); $condStr .= "SELECT * FROM users WHERE uers=lisi AND mobile = $mobile LIKE "."$v"; mysql_close($con); ?>
這種sql語句使用是mobile=138888888888 int型參數,看如上的拼接規則,這樣根本就不須要'
、"
閉合符號 ,只須要傳入 1 union select 1=1 ; --
就能注入 。字符串
若是mobile參數沒有強轉成%d,那麼就會出現int型sql注入。string