簡單判斷是否有註入漏洞以及原理。防注入的程式碼其實來來去去都是那些組合,然後根據自己程式碼變通,重要是知道其中原理,為什麼過濾這些字符,字符有什麼危害。
sql语句如:select * from phpben where id = 1
相關mysql影片教學推薦:《mysql教學》
#1.mysql注入語句
(1)不用使用者名稱和密碼
//正常语句 $sql ="select * from phpben where user_name='admin' and pwd ='123'"; //在用户名框输入'or'='or'或 'or 1='1 然后sql如下 $sql ="select * from phpben where user_name=' 'or'='or'' and pwd ='' "; $sql ="select * from phpben where user_name=' 'or 1='1' and pwd ='' ";
(2)在不輸入密碼的情況下,利用某使用者。
//正常语句 $sql ="select * from phpben where user_name='$username' and pwd ='$pwd'"; //利用的用户名是benwin 则用户名框输入benwin'# 密码有无都可,则$sql变成 $sql ="select * from phpben where user_name=' benwin'#' and pwd ='$pwd'";
這是因為mysql中其中的一個注悉是“#”,上面語句中#已經把後面的內容給注悉掉,所以密碼可以不輸入或任意輸入。網路上有些人介紹說用“/*”來注悉,筆者想提的是只有開始注悉沒結束注悉“*/”時,mysql會報錯,也不是說“/**/」不能注悉,而是這裡很難加上「*/”來結束註悉,還有“– ”也是可以注悉mysql 但要注意“–”後至少有一個空格也就是“– ”,當然防注入代碼要把三種都考慮進來,值得一提的是很多防注入程式碼中沒把「– 」考慮進防注入範圍。
(3)猜解某使用者密碼
//正常语句 $sql ="select * from phpben.com where user_name='$username' and pwd ='$pwd'"; //在密码输入框中输入“benwin' and left(pwd,1)='p'#”,则$sql是 $sql ="select * from phpben.com where user_name=' benwin' and left(pwd,1)='p'#' and pwd ='$pwd'";
(4)插入資料時提權
//正常语句,等级为1 $sql = "insert into phpben.com (`user_name`,`pwd`,`level`) values(‘benwin','iampwd',1) "; //通过修改密码字符串把语句变成 $sql = "insert into phpben.com (`user_name`,`pwd`,`level`) values(‘benwin','iampwd',5)#',1) "; $sql = "insert into phpben.com (`user_name`,`pwd`,`level`) values(‘benwin','iampwd',5)-- ',1) ";这样就把一个权限为1的用户提权到等级5
(5)惡意更新與刪除
//正常语句 $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";
(6)猜測表格資訊的注入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'#''";
2. 防注入的一些函數和注意事項。
(1)addslashes 和stripslashes。
Addslashes為這些「'」、「」」、「\」,「NULL」 加上斜桿「\'」、「\」」、「\\」,「\NULL」, stripslashes則相反,這裡要注意的是php.ini是否開啟了magic_quotes_gpc=ON,開啟若使用addslashes會出現重複。所以使用的時候要先get_magic_quotes_gpc()檢查
(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 ); }(3)字元取代函數和匹配函數
str_replace() 、perg_replace()這些函數之所以也在這裡提是因為這些函數可以用來過濾或替代一些敏感、致命的字符。
以上是php中mysql如何防注入與一些防注入函數用法總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!