天天看點

#{}如何防止SQL注入的?頭疼百年的問題終于裂開了

先說一下:看完如果恍然大悟了,值得一贊 值得一贊 值得一贊

先給兩個經不起推敲的常見答案:

#{}

底層采用的是PreparedStatement,會預編譯,是以不會産生SQL注入問題;

#{}

不會産生字元串拼接,

${}

會産生字元串拼接,是以

${}

會出現SQL注入問題;

最後給出一個正确的答案:

MyBatis的#{}之是以能夠預防SQL注入是因為底層使用了PreparedStatement類的setString()方法來設定參數,此方法會擷取傳遞進來的參數的每個字元,然後進行循環對比,如果發現有敏感字元(如:單引号、雙引号等),則會在前面加上一個'/'代表轉義此符号,讓其變為一個普通的字元串,不參與SQL語句的生成,達到防止SQL注入的效果。