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