SQL注入$和#的區別

#{ } 解析爲一個 JDBC 預編譯語句(prepared statement)的參數標記符。
例如,sqlMap 中如下的 sql 語句
select * from user where name = #{name};

解析爲:
select * from user where name = ?;

一個 #{ } 被解析爲一個參數佔位符 ? 。
${ } 僅僅爲一個純碎的 string 替換,在動態 SQL 解析階段將會進行變量替換
例如,sqlMap 中如下的 sql
select * from user where name = '${name}';

當我們傳遞的參數爲 "ruhua" 時,上述 sql 的解析爲:
select * from user where name = "ruhua";

預編譯之前的 SQL 語句已經不包含變量 name 了。
綜上所得, ${ } 的變量的替換階段是在動態 SQL 解析階段,而 #{ }的變量的替換是在 DBMS 中。
注意:${ } 在預編譯之前已經被變量替換了,這會存在 sql 注入問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章