欧美激情网,国产欧美亚洲高清,欧美屁股xxxxx,欧美群妇大交群,欧美人与物ⅴideos另类,区二区三区在线 | 欧洲

知識(shí)學(xué)堂
  • ·聯(lián)系電話:+86.023-75585550
  • ·聯(lián)系傳真:+86.023-75585550
  • ·24小時(shí)手機(jī):13896886023
  • ·QQ 咨 詢:361652718 513960520
當(dāng)前位置 > 首頁(yè) > 知識(shí)學(xué)堂 > 網(wǎng)站建設(shè)知識(shí)
5種方法防止 jsp被sql注入
更新時(shí)間:2011-11-14 | 發(fā)布人:本站 | 點(diǎn)擊率:630

 一、 SQL注入簡(jiǎn)介

 
SQL注入是比較常見(jiàn)的網(wǎng)絡(luò)攻擊方式之一,它不是利用操作系統(tǒng)的BUG來(lái)實(shí)現(xiàn)攻擊,而是針對(duì)程序員編程時(shí)的疏忽,通過(guò)SQL語(yǔ)句,實(shí)現(xiàn)無(wú)帳號(hào)登錄,甚至篡改數(shù)據(jù)庫(kù)。
===========================================
 
二、 SQL注入攻擊的總體思路
 
1.尋找到SQL注入的位置
2.判斷服務(wù)器類型和后臺(tái)數(shù)據(jù)庫(kù)類型
3.針對(duì)不通的服務(wù)器和數(shù)據(jù)庫(kù)特點(diǎn)進(jìn)行SQL注入攻擊
===========================================
 
三、SQL注入攻擊實(shí)例
 
比如在一個(gè)登錄界面,要求輸入用戶名和密碼:
 
可以這樣輸入實(shí)現(xiàn)免帳號(hào)登錄:
 
用戶名: ‘ or 1 = 1 –
密 碼:
 
點(diǎn)登陸,如若沒(méi)有做特殊處理,那么這個(gè)非法用戶就很得意的登陸進(jìn)去了.(當(dāng)然現(xiàn)在的有些語(yǔ)言的數(shù)據(jù)庫(kù)API已經(jīng)處理了這些問(wèn)題)
 
這是為什么呢? 下面我們分析一下:
 
從理論上說(shuō),后臺(tái)認(rèn)證程序中會(huì)有如下的SQL語(yǔ)句:
 
String sql = "select * from user_table where username=
' "+userName+" ' and password=' "+password+" '";
當(dāng)輸入了上面的用戶名和密碼,上面的SQL語(yǔ)句變成:
 
SELECT * FROM user_table WHERE username=
'’or 1 = 1 -- and password='’
分析SQL語(yǔ)句:
條件后面 username=” or 1=1 用戶名等于 ” 或 1=1 那么這個(gè)條件一定會(huì)成功;
然后后面加兩個(gè)-,這意味著注釋,它將后面的語(yǔ)句注釋,讓他們不起作用,這樣語(yǔ)句永遠(yuǎn)都能正確執(zhí)行,用戶輕易騙過(guò)系統(tǒng),獲取合法身份。
 
這還是比較溫柔的,如果是執(zhí)行
 
SELECT * FROM user_table WHERE 
username='' ;DROP DATABASE (DB Name) --' and password=''
….其后果可想而知…
============================================
 
四、應(yīng)對(duì)方法
 
下面我針對(duì)JSP,說(shuō)一下應(yīng)對(duì)方法:
 
=============================================
 
 
要引入的包:
import java.util.regex.*;
 
正則表達(dá)式:
private String CHECKSQL = “^(.+)\\sand\\s(.+)|(.+)\\sor(.+)\\s$”;
 
判斷是否匹配:
Pattern.matches(CHECKSQL,targerStr);
 
下面是具體的正則表達(dá)式:
檢測(cè)SQL meta-characters的正則表達(dá)式 :
/(\%27)|(\’)|(\-\-)|(\%23)|(#)/ix
修正檢測(cè)SQL meta-characters的正則表達(dá)式 :/((\%3D)|(=))[^\n]*((\%27)|(\’)|(\-\-)|(\%3B)|(:))/i
典型的 SQL 注入攻擊的正則表達(dá)式 :/\w*((\%27)|(\’))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix
檢測(cè)SQL注入,UNION查詢關(guān)鍵字的正則表達(dá)式 :/((\%27)|(\’))union/ix(\%27)|(\’)
檢測(cè)MS SQL Server SQL注入攻擊的正則表達(dá)式:
/exec(\s|\+)+(s|x)p\w+/ix
等等…..
==========================================
 
 
比較通用的一個(gè)方法:
(||之間的參數(shù)可以根據(jù)自己程序的需要添加)
=======================================
 
public static boolean sql_inj(String str)
 {
    String inj_str = "'|and|exec|insert|select|delete|update|
count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";
    String inj_stra[] = split(inj_str,"|");
    for (int i=0 ; i < inj_stra.length ; i++ )
    {
        if (str.indexOf(inj_stra[i])>=0)
        {
            return true;
        }
    }
    return false;
 }
==========================================
 
=======================================
 
防止SQL從URL注入:
 
sql_inj.java代碼:
=======================================
 
package sql_inj; 
 
import java.net.*;
import java.io.*;
import java.sql.*;
import java.text.*;
import java.lang.String; 
 
public class sql_inj{
public static boolean sql_inj(String str)
{
    String inj_str = "'|and|exec|insert|select|delete|update|
count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";
//這里的東西還可以自己添加
String[] inj_stra=inj_str.split("\\|");
    for (int i=0 ; i < inj_stra.length ; i++ )
    {
        if (str.indexOf(inj_stra[i])>=0)
        {
            return true;
        }
    }
return false;
}
}
======================================
 
===================================
 
使用javascript在客戶端進(jìn)行不安全字符屏蔽
 
功能介紹:檢查是否含有”‘”,”\\”,”/”
參數(shù)說(shuō)明:要檢查的字符串
返回值:0:是 1:不是
函數(shù)名是
function check(a)
{
return 1;
fibdn = new Array (”‘” ,”\\”,”/”);
i=fibdn.length;
j=a.length;
for (ii=0; ii<i; ii++)
{ for (jj=0; jj<j; jj++)
{ temp1=a.charAt(jj);
temp2=fibdn[ii];
if (tem’; p1==temp2)
{ return 0; }
}
}
return 1;
 
}
===================================
 
總的說(shuō)來(lái),防范一般的SQL注入只要在代碼規(guī)范上下點(diǎn)功夫就可以了。
凡涉及到執(zhí)行的SQL中有變量時(shí),用JDBC(或者其他數(shù)據(jù)持久層)提供的如:PreparedStatement就可以 ,切記不要用拼接字符串的方法就可以了。