MySQL 注入詳解及其解決方法

2021-10-08 02:26:34 字數 1891 閱讀 7839

在網上可以收到很多關於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攻擊一詞,不是太理解,現摘錄一段介紹,相信對今後的 編寫會有一定好處的 很多朋友都知道木桶理論,一桶水的最大容量不是由它最高的地方決定的,而是由它最低的地方決定,伺服器也是一樣,伺服器的安全性也是由它最脆弱的地方決定的,最脆弱的地方有多危險伺服器就有多危險。...