天天看點

SQL中#和$的差別以及使用它們會造成的問題

不同點

●使用#擷取傳入的資料會在資料上加上引号。比如 where userId =

#{userId },如果userId傳入的值為1,那最終的sql就是

where userId = “1”;

●使用$擷取傳入的資料不會對資料做任何改變,比如 where userId = #{userId },如果userId傳入的值為1,那最終的sql就是

where userId = 1;

● #能夠一定程度上防止SQL注入

● $無法防止SQL注入

● $一般用于傳入資料庫對象,例如傳入表名。(仍會存在SQL注入問題)

使用SQL注入導緻的問題

此處隻舉例sql注入産生的問題,至于是#導緻還是$導緻,自己深刻了解一下記憶會更深,這裡就不過多闡述(可以實際操作一下)。

(1)基于 1=1 總為真

入參 userId ,實際傳入的值 userId :100 or 1=1

sql:select * from Student where userId = 100 or 1=1;

隻要傳入100 or 1=1就可以查到所有學生使用者資訊,吐過包含敏感資訊就會洩露。

(2)基于 “” = “” 總為真

入參 uesrName ,實際傳入的值 userName : " or “” =";

sql: select * from user where userName = “” or “”="";

隻要傳入的最後結果為or “”=""(等号左右兩邊相等),那就任然可以查到所有資料。也會洩露。

(3)基于批量處理

入參 userId,實際參入的值userId:105;drop table user

select * from user where userId = 105; drop table user;

删除表user,很明顯對資料庫進行破壞,可能造成背景癱瘓。

若有寫的不對的地方可以提出互相學習,哈哈