??? 按照百度說法,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|;";
//定義防注入的字符
?? $arr=explode("|",$refuse_str);
//將$refuse_str中的值單獨取出
?? for($i=0;$i<count($arr);$i++)
?? {
???? $replace="[".$arr[$i]."]";
???? $str=str_replace($arr[$i],$replace,$str);
//在變量$str中搜索字符串$arr[$i],并將其替換為字符串[$replace]
?? }
?? return $str;
}
foreach ($_GET as $key=>$value)
//遍歷獲GET方法獲得的參數$_GET的值傳給$key,并賦值給$value
{
? $_GET[$key]=dowith_sql($value);
//將$value中的特征碼處理傳個$_GET[$key]
}
foreach ($_POST as $key=>$value)
{
? $_POST[$key]=dowith_sql($value);
}
?>



??? 上面的防注入的方法只是防了GET與POST方法提交的數據,但是,WEB服務器讀取數據的順序是,先取GET中的數據,沒有再去POST中的數據,沒有還會再去COOKIES中的數據,上面的代碼還沒有防cookies注入。防cookies注入就比較簡單了,cookies的id值一般只為阿拉伯數字,但是cookies注入必須得在id中構造代碼,只要在獲得參數UID后,對其進行過濾就可以了,代碼如下:

有sql注入漏洞怎么利用,

<?php
if($_COOKIE['id']!=null) {
//判斷cookies不為空
foreach ($_COOKIE['id'] as $key=>$id){
//讀取cookies中的值
if (if_numeric($id)<0){
echo "<script language=\\"javascript\\">alert(\\"請不要輸入非法字符!\\");</script>" history.go(-1);</script>";?
}
}
?>


??? 將上述代碼保存為hk.php。所以在平時應用時,在網頁上加上include("ak.php");與include("hk.php");


2、asp防注入過濾代碼
'--------說明------------------
'使用方法:? 在需要防注的頁面頭部用 <!--#Include File="sql2.asp"-->包含就可以了
'友情提示:把代碼復制到CONN.asp(數據庫連接文件) 那么,只要包含了CONN的所有文件都防注了

<%
Dim xf_Post,xf_Get,xf_In,xf_Inf,xf_Xh,xf_db,xf_dbstr
'自定義需要過濾的字串,用 "|" 分隔
xf_In = "'|;|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare"
xf_Inf = split(xf_In,"|")
If Request.Form<>"" Then
For Each xf_Post In Request.Form

For xf_Xh=0 To Ubound(xf_Inf)
If Instr(LCase(Request.Form(xf_Post)),xf_Inf(xf_Xh))<>0 Then
Response.Write "<Script Language=JavaScript>alert('請不要在參數中包含非法字符嘗試注入');</Script>"
Response.Write "非法操作!系統做了如下記錄↓<br>"
Response.Write "操作IP:"&Request.ServerVariables("REMOTE_ADDR")&"<br>"
Response.Write "操作時間:"&Now&"<br>"
Response.Write "操作頁面:"&Request.ServerVariables("URL")&"<br>"
Response.Write "提交方式:POST<br>"
Response.Write "提交參數:"&xf_Post&"<br>"
Response.Write "提交數據:"&Request.Form(xf_Post)
Response.End
End If
Next
Next
End If
If Request.QueryString<>"" Then
For Each xf_Get In Request.QueryString
For xf_Xh=0 To Ubound(xf_Inf)
If Instr(LCase(Request.QueryString(xf_Get)),xf_Inf(xf_Xh))<>0 Then
Response.Write "<Script Language=JavaScript>alert('請不要在參數中包含非法字符嘗試注入');</Script>"
Response.Write "非法操作!系統已經給你做了如下記錄↓<br>"
Response.Write "操作IP:"&Request.ServerVariables("REMOTE_ADDR")&"<br>"
Response.Write "操作時間:"&Now&"<br>"

Response.Write "操作頁面:"&Request.ServerVariables("URL")&"<br>"
Response.Write "提交方式:GET<br>"
Response.Write "提交參數:"&xf_Get&"<br>"
Response.Write "提交數據:"&Request.QueryString(xf_Get)
Response.End
End If
Next
Next
End If
%>



??? 同樣,再將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;