如何修復SQL注入漏洞
如何修復SQL注入漏洞
以下是OMG小編為大家收集整理的文章,希望對大家有所幫助。
SQL注入是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執(zhí)行惡意的SQL命令。其實就是就是提交精心構造的數(shù)據(jù)庫語句,使其反饋一些有用的數(shù)據(jù)。說白了就是去欺騙數(shù)據(jù)庫,假如只有web服務器的話,是沒法進行SQL注入的。
網(wǎng)上常用的注入手法有兩種,一種是猜測,讓數(shù)據(jù)庫暴出用戶名、密碼等信息;另一種直接繞過認證,取得權限。相對應,要想修復此類漏洞,就必須禁止特殊數(shù)據(jù)的提交或?qū)⑻厥馓峤坏臄?shù)據(jù)修改。
下面是不同腳本語言下的防注入過濾代碼,其實思想是一致的。
1、 PHP防注入過濾代碼
php 代碼復制內(nèi)容到剪貼板
/*************************
說明: 判斷傳遞的變量中是否含有非法字符 如$_POST、$_GET
功能: 防注入
使用方法: 將下列代碼保存為ak,php,調(diào)用方式 在數(shù)據(jù)提交頁加上include("ak.php");
**************************/
function dowith_sql($str)
//實現(xiàn)將特征碼兩邊加.
{
$refuse_str="exec|and|or|select|update|from|where|order|by|*|delete||insert|into|values|create|table|
database|set|char|asc|cast|declare|
//定義防注入的字符
$arr=explode("|",$refuse_str);
//將$refuse_str中的值單獨取出
for($i=0;$i
{
$replace="[".$arr[$i]."]";
$str=str_replace($arr[$i],$replace,$str);
//在變量$str中搜索字符串$arr[$i],并將其替換為字符串[$replace]
}
return $str;
}
foreach ($_GET as $key=>$value)
//遍歷獲GET方法獲得的參數(shù)$_GET的值傳給$key,并賦值給$value
{
$_GET[$key]=dowith_sql($value);
//將$value中的特征碼處理傳個$_GET[$key]
}
foreach ($_POST as $key=>$value)
{
$_POST[$key]=dowith_sql($value);
}
?>
上面的防注入的方法只是防了GET與POST方法提交的數(shù)據(jù),但是,WEB服務器讀取數(shù)據(jù)的順序是,先取GET中的數(shù)據(jù),沒有再去POST中的數(shù)據(jù),沒有還會再去COOKIES中的數(shù)據(jù),上面的代碼還沒有防cookies注入。防cookies注入就比較簡單了,cookies的id值一般只為阿拉伯數(shù)字,但是cookies注入必須得在id中構造代碼,只要在獲得參數(shù)UID后,對其進行過濾就可以了,代碼如下:
php 代碼復制內(nèi)容到剪貼板
if($_COOKIE[id]!=null) {
//判斷cookies不為空
foreach ($_COOKIE[id] as $key=>$id){
//讀取cookies中的值
if (is_numeric($id)<0){
echo " ";
}
}
?。?/p>
?>
將上述代碼保存為hk.php。
所以在平時應用時,在網(wǎng)頁上加上include("ak.php");與include("hk.php");
2、 ASP防注入過濾代碼
<%
--------說明------------------
使用方法: 在需要防注的頁面頭部用 ???? SSI ????????
包含就可以了
友情提示:把代碼復制到CONN.asp(數(shù)據(jù)庫連接文件) 那么,只要包含了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 ""
Response.Write "非法操作!系統(tǒng)做了如下記錄↓
"
Response.Write "操作IP:"&Request.ServerVariables("REMOTE_ADDR")&"
"
Response.Write "操作時間:"&Now&"
"
Response.Write "操作頁面:"&Request.ServerVariables("URL")&"
"
Response.Write "提交方式:POST
"
Response.Write "提交參數(shù):"&xf_Post&"
"
Response.Write "提交數(shù)據(jù):"&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 ""
Response.Write "非法操作!系統(tǒng)已經(jīng)給你做了如下記錄↓
"
Response.Write "操作IP:"&Request.ServerVariables("REMOTE_ADDR")&"
"
Response.Write "操作時間:"&Now&"
"
Response.Write "操作頁面:"&Request.ServerVariables("URL")&"
"
Response.Write "提交方式:GET
"
Response.Write "提交參數(shù):"&xf_Get&"
"
Response.Write "提交數(shù)據(jù):"&Request.QueryString(xf_Get)
Response.End
End If
Next
Next
End If
%>
同樣,再將cookies防一下,代碼加在數(shù)據(jù)提交頁。
if(Request.Cookies["uid"]!=null)
{
uid=Request.Cookies["uid"].value;
isnumeric cooidesID = new isnumeric();
//這是一個類
if (cooidesID.reIsnumeric(ruid))
//如果是數(shù)字就運行下面的
{
string str="select * from userTable where id="+uid;
...
}
}
3、 JSP防注入過濾代碼