天天看點

Mybatis如何防止SQL注入的騷操作

SQL注入是一種常見的Web漏洞攻擊手段,危害非常嚴重。攻擊者利用漏洞不但可以看到全部資料,更有甚者删庫跑路。

一、SQL注入示範

SQL注入,可以利用傳入的參數,進行惡意僞造,僞造後的參數最終通過前台傳入到後端執行,

1、示例一(查詢敏感資訊)

比如,我們有一個查詢接口,可以查詢目前使用者的資訊,

select * from user where id = '1';
           

正常執行不會出現問題,一旦被sql注入,比如将傳入參數 id="3 or 1=1" ,那麼sql會變成

select * from user where id = 3 or 1=1
           

這樣所有使用者資訊就一覽無遺了。

2、示例二(惡意删表)

比如,我們現在有個簡單的頁面表單,隻要輸入name,就可以插入到 user 使用者表,

insert into user(name) values('zhangsan');
           

其中name字段來自頁面的前端input輸入,有惡意攻擊者輸入了這個 'lisi');drop table user;--

insert into user(name) values('lisi');drop table user;--;
           

如果真被執行了,完蛋了,表被删了。

二、如何防止SQL注入

1、使用ORM架構提供的方法

一般ORM架構都做了SQL防注入的方案,比如Mybatis,傳入參數時,推薦用 #{para},而不是 ${para}。

  • #将傳入的資料當成一個字元串,會對傳入的資料加一個雙引号,比如where id = “123”。
  • $将傳入的資料直接顯示在sql中,比如 where id = 123。

是以,#與$相比,#可以很大程度的防止sql注入,因為對sql做了預編譯處理,是以在使用中一般使用#{}方式。

2、加強參數輸入驗證,正則比對過濾

加強資料輸入驗證,使用正規表達式等字元串過濾手段限制資料項的格式、字元數目等,尤其是避免資料項中存在引号、分号等特殊字元就能很大程度上避免SQL注入問題的發生。

3、避免正常化的資料庫表名、字段名的設計

比如資料庫表 user,設計時可以加些字首,不容易猜到的,比如xxx_xxx_t_user。實際上,SQL注入也并不是那麼簡單的,一個前提就是需要攻擊者本身對資料庫的結構有足夠的了解才能夠成功。是以在建構資料庫的時候要盡量使用較為複雜的結構和命名方式,就能有效降低被攻擊成功的機率。

4、注意資料庫備份和對敏感内容進行加密

不怕一萬就怕萬一,定期的資料備份還是要做的。另外,一些敏感資料可以适當加密後再存入db,取出後按規則解密,雖說麻煩些,但安全。當然,具體大家還是要按照實際的業務場景來。