mysql 防止注入 mysql如何防止sql注入

2021-10-17 12:40:47 字數 2469 閱讀 6386

mysql防止sql注入的方法:1、普通使用者與系統管理員使用者的許可權要嚴格地區分開;2、強迫使用者使用引數化語句;3、盡量使用sql server資料庫自帶的安全引數;4、對使用者輸入的內容進行驗證。

sql injection攻擊具有很大的危害,攻擊者可以利用它讀取、修改或者刪除資料庫內的資料,獲取資料庫中的使用者名稱和密碼等敏感資訊,甚至可以 獲得資料庫管理員的許可權。如果能夠再利用sqlserver擴充套件儲存過程和自定義擴充套件儲存過程來執行一些系統命令,攻擊者還可以獲得該系統的控制權。

而且sql injection 也很難防範。**管理員無法通過安裝系統補丁或者進行簡單的安全配置進行自我保護,一般的防火牆也無法攔截sql injection 攻擊。

mysql如何防止sql注入?

1. 普通使用者與系統管理員使用者的許可權要有嚴格的區分。

如果乙個普通使用者在使用查詢語句中嵌入另乙個drop table語句,那麼是否允許執行呢?

由於drop語句關係到資料庫的基本物件,故要操作這個語句使用者必須有相關的許可權。在許可權設計中,對於終端使用者,即應用軟體的使用者,沒有必要給他們資料庫物件的建立、刪除等許可權。

那麼即使在他們使用sql語句中帶有嵌入式的惡意**,由於其使用者許可權的限制,這些**也將無法被執行。

2. 強迫使用引數化語句。

如果在編寫sql語句的時候,使用者輸入的變數不是直接嵌入到sql語句。而是通過引數來傳遞這個變數的話,那麼就可以有效的防治sql注入式攻擊。

也就是說,使用者的輸入絕對不能夠直接被嵌入到sql語句中。與此相反,使用者的輸入的內容必須進行過濾,或者使用引數化的語句來傳遞使用者輸入的變數。引數化的語句使用引數而不是將使用者輸入變數嵌入到sql語句中。採用這種措施,

可以杜絕大部分的sql注入式攻擊。不過可惜的是,現在支援引數化語句的資料庫引擎並不多。不過資料庫工程師在開發產品的時候要盡量採用引數化語句。

3. 多多使用sql server資料庫自帶的安全引數。

為了減少注入式攻擊對於sql server資料庫的不良影響,在sqlserver資料庫專門設計了相對安全的sql引數。在資料庫設計過程中,工程師要盡量採用這些引數來杜絕惡意的sql注入式攻擊。

如在sql server資料庫中提供了parameters集合。這個集合提供了型別檢查和長度驗證的功能。如果管理員採用了parameters這個集合的話,則使用者輸入的內容將被視為字元值而不是可執行**。即使使用者輸入的內容中含有可執行**,則資料庫也會過濾掉。因為此時資料庫只把它當作普通的字元來處理。使用parameters集合的另外乙個優點是可以強制執行型別和長度檢查,範圍以外的值將觸發異常。

如果使用者輸入的值不符合指定的型別與長度約束,就會發生異常,並報告給管理員。如上面這個案例中,如果員工編號定義的資料型別為字串型,長度為10個字元。而使用者輸入的內容雖然也是字元型別的資料,但是其長度達到了20個字元。則此時就會引發異常,因為使用者輸入的內容長度超過了資料庫字段長度的限制。

4. 加強對使用者輸入的驗證。

總體來說,防治sql注入式攻擊可以採用兩種方法,

一是加強對使用者輸入內容的檢查與驗證;二是強迫使用引數化語句來傳遞使用者輸入的內容。

在sqlserver資料庫中,有比較多的使用者輸入內容驗證工具,可以幫助管理員來對付sql注入式攻擊。測試字串變數的內容,只接受所需的值。拒絕包含二進位制資料、轉義序列和注釋字元的輸入內容。這有助於防止指令碼注入,防止某些緩衝區溢位攻擊。測試使用者輸入內容的大小和資料型別,強制執行適當的限制與轉換。這即有助於防止有意造成的緩衝區溢位,對於防治注入式攻擊有比較明顯的效果。

如可以使用儲存過程來驗證使用者的輸入。利用儲存過程可以實現對使用者輸入變數的過濾,如拒絕一些特殊的符號。如以上那個惡意**中,只要儲存過程把那個分號過濾掉,那麼這個惡意**也就沒有用武之地了。

在執行sql語句之前,可以通過資料庫的儲存過程,來拒絕接納一些特殊的符號。在不影響資料庫應用的前提下,應該讓資料庫拒絕包含以下字元的輸入。如分號分隔符,它是sql注入式攻擊的主要**。如注釋分隔符。注釋只有在資料設計的時候用的到。一般使用者的查詢語句中沒有必要注釋的內容,故可以直接把他拒絕掉,通常情況下這麼做不會發生意外損失。把以上這些特殊符號拒絕掉,那麼即使在sql語句中嵌入了惡意**,他們也將毫無作為。

故始終通過測試型別、長度、格式和範圍來驗證使用者輸入,過濾使用者輸入的內容。這是防止sql注入式攻擊的常見並且行之有效的措施。

多層環境如何防治sql注入式攻擊?

在多層應用環境中,使用者輸入的所有資料都應該在驗證之後才能被允許進入到可信區域。

未通過驗證過程的資料應被資料庫拒絕,並向上一層返回乙個錯誤資訊。實現多層驗證。對無目的的惡意使用者採取的預防措施,對堅定的攻擊者可能無效。

更好的做法是在使用者介面和所有跨信任邊界的後續點上驗證輸入。如在客戶端應用程式中驗證資料可以防止簡單的指令碼注入。

但是,如果下一層認為其輸入已通過驗證,則任何可以繞過客戶端的惡意使用者就可以不受限制地訪問系統。故對於多層應用環境,在防止注入式攻擊的時候,需要各層一起努力,在客戶端與資料庫端都要採用相應的措施來防治sql語句的注入式攻擊。

mysql防止SQL 注入

1 mysql real escape string 轉義 sql 語句中使用的字串中的特殊字元,並考慮到連線的當前字符集 使用方法如下 sql select count as ctr from users where username mysql real escape string userna...

mysql 防止依賴注入

string name request.getparameter name string query string.format select account balance from user data where user name s table a preparedstatement pst...

Mysql引數化查詢,防止Mysql注入

有部分的開發人員可能會認為使用引數化查詢,會讓程式更不好維護,或者在實現部分功能上會非常不便 請求 然而,使用引數化查詢造成的額外開發成本,通常都遠低於因為sql注入攻擊漏洞被發現而遭受攻擊,所造成的重大損失。除了安全因素,相比起拼接字串的sql語句,引數化的查詢往往有效能優勢。因為,引數化的查詢能...