程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 有效防止SQL注入漏洞詳細說明

有效防止SQL注入漏洞詳細說明

編輯:關於PHP編程

1.如果動態構造的sql語句中包含參數,請必須對參數做如下操作
a.將'(單引號)替換成''(兩個單引號)
b.將--(注釋符)替換掉
c.將參數加入語句時,一定要在前後各加上引號,如:'select * from table where id='''+@id+''''這樣的加法
2.如果動態構造的sql語句中包含表參數,請勿必給表加上[](中括號),如:'select * from ['+@tab+']'這樣的做法

3..避免動態sql語句:尤其是從ie客戶端獲取查詢、修改、刪除條件的字段最容易被注入,例如上述從客戶端獲取personid,為了開發方便,直接把從客戶端獲取的persongid作為sql語句的條件,卻沒有對personid作必要的檢查,所以在開發時執行sql語句時最好使用preparedstatement類。

 

4.  驗證數據:在客戶端ie使用網頁特效驗證用戶輸入數據的合法性作用其實不是很大,一定要在獲取客戶端數據之後,對數據進行嚴格的驗證,開發人員不要假想用戶只會輸入合法的數據。確保在應用程序中檢查分號、引號、括號、sql關鍵字等。可以使用正則表達式來進行復雜的模式匹配,運用它可以達到良好的效果。


×××網站地址薄查看程序需要傳遞一個personid,personid可以通過url參數傳遞,由於地址本查看程序直接獲取personid,沒有做任何數據合法性驗證,而且personid是字符串變量,獲取personid的代碼如下:

if (getparameter(req,"personid")!=null){

personid=getparameter(req,"personid").trim();

}else{

personid="";

}

該程序中組合成的動態sql語句如下:

personsql="select * from 表名 where userid="+long.tostring(userid)+" and addrcontactid="+personid;

 

由於程序沒有檢查personid是否是整數,所以攻擊者隨便給personid賦一個值,即可繼續運行後續的程序邏輯,如果攻擊者輸入如下網址:

http://www.----------------------?personid=6414 or 2=2

組合成的sql語句如下:

select * from 表名where userid=1433620 and addrcontactid=6414 or 2=2

防范方法

  sql注入漏洞可謂是“千裡之堤,潰於蟻穴”,這種漏洞在網上極為普遍,通常是由於程序員對注入不了解,或者程序過濾不嚴格,或者某個參數忘記檢查導致。在這裡,我給大家一個函數,代替asp教程中的request函數,可以對一切的sql注入say no,函數如下:

function saferequest(paraname,paratype)
 '--- 傳入參數 ---
 'paraname:參數名稱-字符型
 'paratype:參數類型-數字型(1表示以上參數是數字,0表示以上參數為字符)

 dim paravalue
 paravalue=request(paraname)
 if paratype=1 then
  if not isnumeric(paravalue) then
   response.write "參數" & paraname & "必須為數字型!"
   response.end
  end if
 else
  paravalue=replace(paravalue,"'","''")
 end if
 saferequest=paravalue
end function

上面函數應用

對於int型的參數,如文章的id等,可以先判斷是不是整數。

id =trim(request("id"))
if id<>"" then
  if not isnumeric(id) then
    response.write"請提供數字型參數"
    response.end
  end if
  id = clng(id)
else
  response.write"請輸入參數id"
  response.end
end if

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved