??? 按照百度說法,SQL注入是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。其實就是就是提交精心構造的數據庫語句,使其反饋一些有用的數據。說白了就是去欺騙數據庫,假如只有web服務器的話,是沒法進行SQL注入的。
??? 網上常用的注入手法有兩種,一種是猜測,讓數據庫暴出用戶名、密碼等信息;另一種直接繞過認證,取得權限。相對應,要想修復此類漏洞,就必須禁止特殊數據的提交或將特殊提交的數據修改。
??? 下面是不同腳本語言下的防注入過濾代碼,其實思想是一致的。
SQL 注入、?
1、??? PHP防注入過濾代碼
牙齒缺失修復方法,/*************************
說明:??????? 判斷傳遞的變量中是否含有非法字符 如$_POST、$_GET?
功能:??????? 防注入
使用方法:??? 將下列代碼保存為ak,php,調用方式 在數據提交頁加上include("ak.php");
**************************/?
<?php function dowith_sql($str) //實現將特征碼兩邊加. {? $refuse_str="exec|and|or|select|update|from|where|order|by|*|delete|'|insert|into|values|create|table| database|set|char|asc|cast|declare|<script|script|iframe|3bomb|c.js|;"; |
??? 上面的防注入的方法只是防了GET與POST方法提交的數據,但是,WEB服務器讀取數據的順序是,先取GET中的數據,沒有再去POST中的數據,沒有還會再去COOKIES中的數據,上面的代碼還沒有防cookies注入。防cookies注入就比較簡單了,cookies的id值一般只為阿拉伯數字,但是cookies注入必須得在id中構造代碼,只要在獲得參數UID后,對其進行過濾就可以了,代碼如下:
有sql注入漏洞怎么利用,
<?php |
??? 將上述代碼保存為hk.php。所以在平時應用時,在網頁上加上include("ak.php");與include("hk.php");
2、asp防注入過濾代碼
'--------說明------------------
'使用方法:? 在需要防注的頁面頭部用 <!--#Include File="sql2.asp"-->包含就可以了
'友情提示:把代碼復制到CONN.asp(數據庫連接文件) 那么,只要包含了CONN的所有文件都防注了
<% For xf_Xh=0 To Ubound(xf_Inf) Response.Write "操作頁面:"&Request.ServerVariables("URL")&"<br>" |
??? 同樣,再將cookies防一下,代碼加在數據提交頁。
if(Request.Cookies["uid"]!=null) { uid=Request.Cookies["uid"].value; isnumeric cooidesID = new isnumeric(); //這是一個類 if (cooidesID.reIsnumeric(ruid)) //如果是數字就運行下面的 { string str="select * from userTable where id="+uid; ... } } |
3、??? JSP防注入過濾代碼
<script language="javascript"> <!-- var url = location.search; // 函數location.search作用是取?之后的參數值,取得 QueryString 部分 var re=/^?(.*)(select%20|insert%20|delete%20from%20|count(|drop%20table|update%20truncate%20|asc(|mid(|char(|xp_cmdshell|exec%20master|net%20localgroup%20administrators|"|:|net%20user||%20or%20)(.*)$/gi; //定義特殊字符串 var e = re.test(url); //test()字符串中是否有匹配正則表達式的子字符串。返回true或false。 if(e) { ??? alert("地址中含有非法字符~"); ??? location.href="error.asp"; } //--> <script> |
??? 當然,我們也可以定義過濾函數,直接應用到用戶名、密碼等提交的數據參數上,函數如下:
function checkuseravoid(str){ var inj_str="‘|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,"; var sarray=new Array(); sarray=inj_str.split('|'); for (var i=0 ;i <inj_stra.length ;i++ ) { if (str.indexOf(inj_stra)>=0) return true; } return false; } |
4、C#防注入過濾代碼
//這個例子里暫定為=號和號,可繼續添加 bool CheckParams(params object[] args) { ???? string[] Lawlesses={"=",""}; ???? if(Lawlesses==null||Lawlesses.Length<=0)return true; |
???? 構造正則表達式,例:Lawlesses是=號和號,則正則表達式為 .*[=}].*
???? 另外,由于我是想做通用而且容易修改的函數,所以多了一步由字符數組到正則表達式,實際使用中,直接寫正則表達式亦可;
???? string str_Regex=".*["; ???? for(int i=0;i< Lawlesses.Length-1;i++) ???????? str_Regex+=Lawlesses+"|"; ???? str_Regex+=Lawlesses[Lawlesses.Length-1]+"].*"; ???? // ???? foreach(object arg in args) ???? { ???????? if(arg is string) //如果是字符串,直接檢查 ???????? { ???????????? if(Regex.Matches(arg.ToString(),str_Regex).Count>0) ???????????? return false; ???????? } ???????? else if(arg is ICollection) //如果是一個集合,則檢查集合內元素是否字符串,是字符串,就進行檢查 ???????? { ???????????? foreach(object obj in (ICollection)arg) ???????????? { ???????????????? if(obj is string) ???????????????? { ???????????????????? if(Regex.Matches(obj.ToString(),str_Regex).Count>0) ???????????????????? return false; ???????????????? } ???????????? } ???????? } ???? } ???? return true; |