一、項目演示
(1)主演示就是一張t_user表,利用常見的用戶登錄來模擬sql注入對後臺數據的侵入
(2)數據庫腳本 -- postgresql
DROP TABLE IF EXISTS "public"."t_user";
CREATE TABLE "public"."t_user" (
"id" int8 NOT NULL,
"name" varchar(255) COLLATE "pg_catalog"."default",
"password" varchar(255) COLLATE "pg_catalog"."default"
)
;
DROP TABLE IF EXISTS "public"."t_user_info";
CREATE TABLE "public"."t_user_info" (
"id" int8 NOT NULL,
"uid" int8,
"name" varchar(255) COLLATE "pg_catalog"."default",
"gender" int2,
"age" int2,
"address" varchar(255) COLLATE "pg_catalog"."default"
)
;
ALTER TABLE "public"."t_user" ADD CONSTRAINT "t_user_pkey" PRIMARY KEY ("id");
ALTER TABLE "public"."t_user_info" ADD CONSTRAINT "t_user_info_pkey" PRIMARY KEY ("id");
(3)數據庫表結構
(4)代碼中,體現防sql注入和sql注入的地方如下:
(5)先來註冊個用戶
(6) 先來個帶有侵入性的正常登錄
傳入參數:
{
"name":"appelyk",
"password":"'';drop table if exists t_user_info;"
}
由於這個演示掉的後臺接口些的sql是防注入的,所以,我們調用接口的時候,可以看到myabtis輸出的sql語句如下:
SELECT ID
,
NAME,
PASSWORD
FROM
t_user
WHERE
NAME = 'appleyk'
AND PASSWORD = ''';drop table if exists t_user_info;'
數據庫執行效果,那還用說嘛,肯定找不到啦!
(7) 再來個帶有侵入性的"非"正常登錄
我們看下後臺輸入的sql日誌:
我們去數據庫查看一下,發下,t_user_info表已經不存在了!!!!
二、總結
(1)檢查sql語句,慎用$,請選擇用#
(2)如果非要用$,請在自己的業務層,實現對可能會發生SQL注入的參數進行手動過濾處理,不要希望mybaits會對你的$參數進行攔截處理!
三、項目地址
GitHub地址:https://github.com/kobeyk/springboot-myabtis-injection-sample