1. 程式人生 > >防止SQL注入的五種方法

防止SQL注入的五種方法

一、SQL注入簡介

    SQL注入是比較常見的網路攻擊方式之一,它不是利用作業系統的BUG來實現攻擊,而是針對程式設計師程式設計時的疏忽,通過SQL語句,實現無帳號登入,甚至篡改資料庫。

二、SQL注入攻擊的總體思路

1.尋找到SQL注入的位置

2.判斷伺服器型別和後臺資料庫型別

3.針對不通的伺服器和資料庫特點進行SQL注入攻擊

三、SQL注入攻擊例項

比如在一個登入介面,要求輸入使用者名稱和密碼:

可以這樣輸入實現免帳號登入:

使用者名稱: ‘or 1 = 1 –

密 碼:

點登陸,如若沒有做特殊處理,那麼這個非法使用者就很得意的登陸進去了.(當然現在的有些語言的資料庫API已經處理了這些問題)

這是為什麼呢? 下面我們分析一下:

從理論上說,後臺認證程式中會有如下的SQL語句:

String sql = "select * from user_table where username=

' "+userName+" ' and password=' "+password+" '";

當輸入了上面的使用者名稱和密碼,上面的SQL語句變成:

SELECT * FROM user_table WHERE username=

'’or 1 = 1 -- and password='’

分析SQL語句:

條件後面username=”or 1=1 使用者名稱等於 ” 或1=1 那麼這個條件一定會成功;

然後後面加兩個-,這意味著註釋,它將後面的語句註釋,讓他們不起作用,這樣語句永遠都能正確執行,使用者輕易騙過系統,獲取合法身份。

這還是比較溫柔的,如果是執行

SELECT * FROM user_table WHERE

username='' ;DROP DATABASE (DB Name) --' and password=''

….其後果可想而知… 

四、應對方法

下面我針對JSP,說一下應對方法:

1.(簡單又有效的方法)PreparedStatement

採用預編譯語句集,它內建了處理SQL注入的能力,只要使用它的setXXX方法傳值即可。

使用好處:

(1).程式碼的可讀性和可維護性.

(2).PreparedStatement盡最大可能提高效能.

(3).最重要的一點是極大地提高了安全性.

原理:

sql注入只對sql語句的準備(編譯)過程有破壞作用

而PreparedStatement已經準備好了,執行階段只是把輸入串作為資料處理,

而不再對sql語句進行解析,準備,因此也就避免了sql注入問題. 

2.使用正則表示式過濾傳入的引數

要引入的包:

import java.util.regex.*;

正則表示式:

private String CHECKSQL = “^(.+)\\sand\\s(.+)|(.+)\\sor(.+)\\s$”;

判斷是否匹配:

Pattern.matches(CHECKSQL,targerStr);

下面是具體的正則表示式:

檢測SQL meta-characters的正則表示式 :

/(\%27)|(\’)|(\-\-)|(\%23)|(#)/ix

修正檢測SQL meta-characters的正則表示式 :/((\%3D)|(=))[^\n]*((\%27)|(\’)|(\-\-)|(\%3B)|(:))/i

典型的SQL 注入攻擊的正則表示式 :/\w*((\%27)|(\’))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix

檢測SQL注入,UNION查詢關鍵字的正則表示式 :/((\%27)|(\’))union/ix(\%27)|(\’)

檢測MS SQL Server SQL注入攻擊的正則表示式:

/exec(\s|\+)+(s|x)p\w+/ix

等等…..

3.字串過濾

比較通用的一個方法:

(||之間的引數可以根據自己程式的需要新增)

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;

}

4.jsp中呼叫該函式檢查是否包函非法字元

防止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;

}

}

5.JSP頁面判斷程式碼:

使用javascript在客戶端進行不安全字元遮蔽

功能介紹:檢查是否含有”‘”,”\\”,”/”

引數說明:要檢查的字串

返回值:0:是1:不是

函式名是

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;

}

===================================

總的說來,防範一般的SQL注入只要在程式碼規範上下點功夫就可以了。

凡涉及到執行的SQL中有變數時,用JDBC(或者其他資料持久層)提供的如:PreparedStatement就可以 ,切記不要用拼接字串的方法就可以了。

相關推薦

防止SQL注入方法 防止SQL注入方法

防止SQL注入的五種方法   一、SQL注入簡介     SQL注入是比較常見的網路攻擊方式之一,它不是利用作業系統的BUG來實現攻擊,而是針對程式設計師程式設計時的疏忽,通過SQL語句,實現無帳號登入,甚至篡改資料庫。 二、SQL注

防止SQL注入方法

一、SQL注入簡介     SQL注入是比較常見的網路攻擊方式之一,它不是利用作業系統的BUG來實現攻擊,而是針對程式設計師程式設計時的疏忽,通過SQL語句,實現無帳號登入,甚至篡改資料庫。 二、SQL注入攻擊的總體思路 1.尋找到SQL注入的位置 2.判斷伺

防止SQL注入方法

一、SQL注入簡介     SQL注入是比較常見的網路攻擊方式之一,它不是利用作業系統的BUG來實現攻擊,而是針對程式設計師程式設計時的疏忽,通過SQL語句,實現無帳號登入,甚至篡改資料庫。 二、SQL注入攻擊的總體思路 1.尋找到SQL注入的位置 2.判斷伺服器型別和後臺資料庫型別 3.針對不通的伺服器和

父級塌陷清除浮動的方法

沒有 高度 overflow left 結束 方法 子元素 添加 block 在文檔流中,若父元素未設置高度,那麽父元素的高度默認是被子元素撐開的,即子元素多高,父元素就有多高。但是當子元素設置浮動之後,子元素就會完全脫離文檔流,父元素還在文檔流中,此時父元素的高度就沒有子

詳解PHP實現定時任務的方法

清理 toolbar 路徑 頁面 文檔 errors conf star 包含 定時運行任務對於一個網站來說,是一個比較重要的任務,比如定時發布文檔,定時清理垃圾信息等,現在的網站大多數都是采用PHP動態語言開發的,而對於PHP的實現決定了它沒有Java和.Net這種A

想讓容器更快?這方法您必須知道!

之一 需要 處理 配額 應該 最大的 單詞 lin 有助於 容器的賣點之一是容器化應用程序的部署速度通常比虛擬機快,且性能更佳。 雖然容器的默認速度比其他基礎設施快,這並不意味著沒有辦法讓它們更快。本文將演示如何通過優化Docker容器鏡像構建時間、性能和資源消耗,來讓容器

JS中數組去重的方法

func 大量 環比 -- war 重新 pan 選擇 nbsp 數組去重方法 方法一:運用splice()方法和雙層for循環(有點類似選擇排序) function norepeat(arr){

OpenVZ架構VPS安裝BBR的方法(UML-LKL-LKL_Rinetd)

用戶 所見 unit 系統 nor hub rinetd 0.0.0.0 http OpenVZ架構雲主機部署BBR的五種方式(UML/LKL/LKL_Rinetd) 簡介 日前OpenVZ部署BBR可謂火氣酷熱。可樂一向沒寫教程,今日就把伏筆VPS所見到的做成集中寫成文章

頑石系列:CSS實現垂直居中的方法

如果 -c align 大於 lock shu 彈性 ext explorer 頑石系列:CSS實現垂直居中的五種方法 在開發過程中,我們可能沿用或者試探性地去使用某種方法實現元素居中,但是對各種居中方法的以及使用場景很不清晰。參考的內容鏈接大概如下: 行內元素:htt

JavaScript 數字前補“0”的方法

JavaScript中的數字是沒有前置0的,因此需要我們自己進行操作來新增前置0,而且還得轉換成字串。 <html> <body> <script> //迭代方式實現 function padding1(num, length) {

在 Java 中初始化 List 的方法

在 Java 中初始化 List 的五種方法 1.構造 List 後使用 List.add 初始化 2.使用 {{}} 雙括號語法 3.使用 Arrays.asList 4. 使用 Stream (JDK8) 5. 使用 Lists (JDK9)

關於清除浮動的方法

清除浮動的本質:為了解決父級元素印子級浮動引起內部高度為0的問題。 方式1:額外標籤法(w3c推薦的方法): 在最後一個浮動標籤後,新新增一個標籤 優點:通俗易懂,書寫方便。 缺點:不推薦使用,新增許多無意義的標籤,結構化較差。 .clear{    clear:b

Java 字串拼接 方法的效能比較分析 “+”、contact、join、append

一、五種方法分析: 1. 加號 “+” 2. String contact() 方法 3. StringUtils.join() 方法 4. StringBuffer append() 方法 5. StringBuilder append() 方法 二、優劣勢分析 開

斐波那契數列介紹及Python中方法斐波那契數列

Q:斐波那契數列為什麼那麼重要,所有關於數學的書幾乎都會提到? A:因為斐波那契數列在數學和生活以及自然界中都非常有用。 1. 斐波那契數列 概念引入 斐波那契數列(Fibonacci sequence),又稱黃金分割數列,因數學家列昂納多·斐波那契(Leonar

java 遍歷Map 的方法

遍歷Map的方法, 我總結了5種, CoreJava中給出的是第一種使用forEach+lambda表示式, 我認為這種方法應該是最好的, 但是隻能在Java8之後的版本使用; 建議優先使用第一種和第四種(類似第二種); 遍歷Map: 第一種可以使用Map的forEach方法加上Java

Vue資料傳遞的方法

元件(Component)是 Vue.js 最強大的功能。元件可以封裝可重用的程式碼,通過傳入物件的不同,實現元件的複用,但元件傳值就成為一個需要解決的問題。 1.父元件向子元件傳值 元件例項的作用域是孤立的。這意味著不能在子元件的模板內直接引用父元件的資料。要讓子元件使用父元件的資料,我們

用JQuery或JS改變div的id的方法

div的id是可以改變的,通常使用的方法是通過JQuery或Javascript來實現。本文介紹用JQuery或JS改變div的id的五種方法。 方法一:使用Tag選擇器 JQuery程式碼如下: <div id="myDivId">測試</div> <

計算併發使用者數的方法

一、經典公式1:    一般來說,利用以下經驗公式進行估算系統的平均併發使用者數和峰值資料   1)平均併發使用者數為 C = nL/T   2)併發使用者數峰值 C‘ = C + 3*根號C     C是平均併發使用者數,n是login session的數量,L

實現垂直水平居中的方法

1.基於表格樣式 將要使內容居中的外層容器元素的display設定成table,內層內容塊使用table-cell,然後分別設定水平和垂直居中: /*表格方案*/ #table-father{

HTML用JS匯出Excel的方法,無需js-xlsx庫

這五種方法前四種方法只支援IE瀏覽器,最後一個方法支援當前主流的瀏覽器(火狐,IE,Chrome,Opera,Safari) <!DOCTYPE html> <html> <head lang="en"> <meta c