$sql = "update phpben set `user_name` ='benwin',level=5-- ', level=1";
(6)惡意更新和刪除
//正常語句
$sql = "update phpben set `user_name` = ‘benwin' where id =1";
//注入后,惡意代碼是“1 or id>0”
$sql = "update phpben set `user_name` = ‘benwin' where id =1 or id>0";
//正常語句
$sql = "update phpben set `user_name` =’benwin’ where id=1";
//注入后
$sql = "update phpben set `user_name` ='benwin' where id>0#' where id=1";
$sql = "update phpben set `user_name` ='benwin' where id>0-- ' where id=1";
(7)union、join等
//正常語句
$sql ="select * from phpben1 where `user_name`=’benwin’ ";
//注入后
$sql ="select * from phpben1 where`user_name`=’benwin’ uninon select * from phpben2#’ ";
$sql ="select * from phpben1 where`user_name`=’benwin’ left join……#’ ";
(8)通配符號%、_
//正常語句
$sql ="select * from phpben where `user_name`=’benwin’ ";
//注入通配符號%匹配多個字符,而一個_匹配一個字符,如__則匹配兩個字符
$sql ="select * from phpben where `user_name` like ’%b’ ";
$sql ="select * from phpben where `user_name` like ’_b_’ ";
這樣只要有一個用戶名字是b開頭的都能正常運行,“ _b_”是匹配三個字符,且這三個字符中間一個字符時b。這也是為什么有關addslashes()函數介紹時提示注意沒有轉義%和_(其實這個是很多 phper不知問什么要過濾%和_下劃線,只是一味的跟著網上代碼走)
(9)還有很多猜測表信息的注入sql
//正常語句
$sql ="select * from phpben1 where`user_name`='benwin'";
//猜表名,運行正常則說明存在phpben2表
$sql ="select * from phpben1 where`user_name`='benwin' and (select count(*) from phpben2 )>0#' ";
//猜表字段,運行正常則說明phpben2表中有字段colum1
$sql ="select * from phpben1 where`user_name`='benwin' and (select count(colum1) from phpben2 )>0#'";
//猜字段值
$sql ="select * from phpben1 where`user_name`='benwin' and left(pwd,1)='p'#’'";
當然還有很多,筆者也沒研究到專業人士那種水平,這里提出這些都是比較常見的,也是phper應該知道并掌握的,而不是一味的在網上復制粘貼一些防注入代碼,知然而不解其然。
下面一些防注入方法回看可能更容易理解。
3.3防注入的一些方法
3.3.1 php可用于防注入的一些函數和注意事項。
(1)addslashes 和stripslashes。
Addslashes 給這些 “’”、“””、“\”,“NULL” 添加斜桿“\’”、“\””、“\\”,“\NULL”, stripslashes則相反,這里要注意的是php.ini是否開啟了magic_quotes_gpc=ON,開啟若使用addslashes會出現重復。所以使用的時候要先get_magic_quotes_gpc()檢查
一般代碼類似:
if(!get_magic_quotes_gpc())
{
$abc = addslashes($abc);
}
其實這個稍微學習php一下的人都知道了,只不過筆者想系統點介紹(前面都說不是專家級文章),所以也順便寫上了。addslashes
(2)mysql_escape_string()和mysql_ real _escape_string()
mysql_real_escape_string 必須在(PHP 4 >= 4.3.0, PHP 5)的情況下才能使用。否則只能用 mysql_escape_string
if (PHP_VERSION >= '4.3')
{
$string = mysql_real_escape_string($string);
}else
{
$string = mysql_escape_string($string );
}
mysql_escape_string()和mysql_ real _escape_string()卻別在于后者會判斷當前數據庫連接字符集,換句話說在沒有連接數據庫的前提下會出現類似錯誤:
Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'ODBC'@'localhost' (using password: NO) in E:\webphp\test.php on line 11
(3)字符代替函數和匹配函數
str_replace() 、perg_replace()這些函數之所以也在這里提是因為這些函數可以用于過濾或替代一些敏感、致命的字符。
3.3.2防注入字符優先級。
防注入則要先知道有哪些注入字符或關鍵字,常見的mysql注入字符有字符界定符號如“'”、“"”;邏輯關鍵字如“and”、“or”;mysql注悉字符如“#”,“-- ”,“/**/”;mysql通配符“%”,“_”;mysql關鍵字 “select|insert|update|delete|*|union|join|into|load_file|outfile”
(1)對于一些有規定格式的參數來說,防注入優先級最高的是空格” ”。
原文轉自:http://blogread.cn/it/article/6086