SQL注入的防範

2021-07-16 10:21:04 字數 1320 閱讀 9926

所謂sql注入,就是通過把sql命令偽裝成正常的http請求引數,傳遞到服務端,欺騙伺服器最終執行惡意的sql命令,達到入侵目的。攻擊者可以利用sql注入漏洞,查詢非授權資訊,修改資料庫伺服器的資料,改變表結構,甚至是獲取伺服器root許可權。

預編譯語句使用引數佔位符來替代需要動態傳入的引數,這樣攻擊者無法改變sql語句的結構,sql語句的語義不會發生改變,即使使用者傳入類似於』 or 『1』=』1這樣的字串,資料庫也會將其作為普通的字串來處理。預編譯sql語句中的特殊字元會被轉義。

常見的orm框架,如mybatis、hibernate等,都支援對相應的關鍵字或者特殊符號進行轉義。

通過#符號配置的變數,mybatis能夠對輸入變數的一些關鍵字進行轉義,防止sql注入攻擊。

特別注意:

mybatis將#解釋為引數標記,將$解釋為字串替換。知道引數標記和字串替換的這個區別很重要,因為引數標記不可以用在sql語句的某些地方。例如,您不能使用引數標記來指定表名。

**示例如下:

map parms = new hashmap();

parms.put("table", "foo");

parms.put("criteria", 37);

select * from $ where col1 = #

select>

mybatis將生成如下的預編譯語句:

select * from foo where col1 = ?
對儲存的密碼進行單向hash,如使用md5對密碼進行摘要,而非直接儲存明文密碼,這樣的好處就是萬一使用者資訊洩露,即圈內所說的被「拖庫」,黑客無法直接獲取使用者密碼。

但是,md5目前也變得不那麼安全了。近幾年開始流行一種使用彩虹表的破解辦法,能夠根據使用者密碼的hash碼,比較快速地逆向得出密碼的原文(或者是碰撞串)。

雜湊加鹽法(hash+salt)能夠在一定程度上解決這個問題。所謂加鹽就是在生成hash時給予乙個擾動,使hash值與標準的hash結果不同。

後台的系統異常很可能包含了一些如伺服器版本、資料庫版本、程式語言等資訊,甚至是資料庫連線的位址與使用者名稱密碼,攻擊者可以按圖索驥,找到對應版本的伺服器漏洞或者資料庫漏洞進行攻擊。因此,必須要處理好後台異常,重定向到相應的錯誤處理介面,而不是任由其直接輸出到頁面上。

[1]

[2] 大型分布式**架構 陳康賢 著

防範sql注入

真沒語言了,公司的 都有這個漏洞,明天趕緊把改了 sql注入式攻擊是利用是指利用設計上的漏洞,在目標伺服器上執行sql命令以及進行其他方式的攻擊 動態生成sql命令時沒有對使用者輸入的資料進行驗證是sql注入攻擊得逞的主要原因。比如 如果你的查詢語句是select from admin where ...

sql 注入防範

關於身份驗證 sql select from user where name name and pwd pwd 假設只知道使用者名稱不知道密碼 1 我們在使用者名稱位置輸入 admin or 1 1 注 內容只有 內的。看看sql會變成什麼 sql select from user where na...

SQL注入的防範

1.不要使用sa使用者連線資料庫 2 新建乙個public許可權資料庫使用者,並用這個使用者訪問資料庫 3 角色 去掉角色public對sysobjects與syscolumns 物件的select訪問許可權 4 使用者 使用者名稱 右鍵 屬性 許可權 在sysobjects與syscolumns上...