在網上可以收到很多關於sql注入的例子,我這裡想說一下最
基本的。
1:最基本的查詢
xml語句
select *
from user where id = #
;
查詢介面:select 請求方式:get 請求引數:id
(value =
"/select/"
, method = requestmethod.
get)
這就是乙個最普通的,根據id查詢user表中的id與輸入的id對應的一行資料,同樣這是乙個簡單的介面定義,但是存在sql注入風險。
如果在瀏覽器輸入
1傳送這個請求相當於呼叫乙個查詢語句
正常情況下,應該返回乙個id=1的文章資訊。
但是存在問題:
當在瀏覽器輸入時
1這就是乙個sql注入攻擊了,可能會返回所有文章的相關資訊。為什麼會這樣呢?
1=1永遠是true,所有整個where語句永遠是ture,所以where條件相當於沒有加where條件,那麼查詢的結果相當於整張表的內容。
那麼有哪些方法可以解決這些問題呢?
1、嚴格檢查輸入變數的型別和格式
對於整數引數,加判斷條件:不能為空、引數型別必須為數字
對於以上的xml語句:我們可以這麼改寫:
select *
from user where
<
if test=
"id != null and id != ''"
>
id = #
>
//對id進行非空校驗,如果為空會報錯
<
/select>
同樣的可以對介面編寫進行修改
對於字串引數,可以使用正規表示式進行過濾:如:必須為[0-9a-za-z]範圍內的字串
2)過濾和轉義特殊字元
在username這個變數前進行轉義,對 '、"、\ 等特殊字元進行轉義,如:
username = stringescapeutils.
escapesql
(username)
;
3)利用mysql的預編譯機制
把sql語句的模板(變數採用佔位符進行佔位)傳送給mysql伺服器,mysql伺服器對sql語句的模板進行編譯,編譯之後根據語句的優化分析對相應的索引進行優化,在最終繫結引數時把相應的引數傳送給mysql伺服器,直接進行執行,節省了sql查詢時間,以及mysql伺服器的資源,達到一次編譯、多次執行的目的,除此之外,還可以防止sql注入。具體是怎樣防止sql注入的呢?實際上當將繫結的引數傳到mysql伺服器,mysql伺服器對引數進行編譯,即填充到相應的佔位符的過程中,做了轉義操作。
這個就像我上面寫的
select * from user where id = #
;//使用#{},#可以對id進行預編譯
//而不能使用${},這是直接將${}裡的值,賦值給id
小白的才疏學淺的總結就到這裡了,感謝各位的閱讀 SQL注入解決方法
簡單又有效的方法 preparedstatement 採用預編譯語句集,它內建了處理sql注入的能力,只要使用它的set 方法傳值即可。使用好處 1 的可讀性和可維護性.2 preparedstatement盡最大可能提高效能.3 最重要的一點是極大地提高了安全性.原理 sql注入只對sql語句的準...
sql注入的解決方法
sql注入的原因 表面上說是因為拼接字串,構成sql語句,沒有使用sql語句預編譯,繫結變數造成的。但是更深層次的原因是將使用者輸入的字串,當成了 sql語句 來執行。sql注入的常用兩種解決方法 1 基本上大家都知道 採用sql語句預編譯和繫結變數,是防禦sql注入的最佳方法。但是其中的深層次原因...
CC攻擊及其解決方法
好久不關心網路安全之類,今天突然間聽說cc攻擊一詞,不是太理解,現摘錄一段介紹,相信對今後的 編寫會有一定好處的 很多朋友都知道木桶理論,一桶水的最大容量不是由它最高的地方決定的,而是由它最低的地方決定,伺服器也是一樣,伺服器的安全性也是由它最脆弱的地方決定的,最脆弱的地方有多危險伺服器就有多危險。...