不同點
●使用#擷取傳入的資料會在資料上加上引号。比如 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,很明顯對資料庫進行破壞,可能造成背景癱瘓。
若有寫的不對的地方可以提出互相學習,哈哈