區別:
(1)#將傳入的資料都當成乙個字串,會對自動傳入的資料加乙個雙引號。如:order by #user_id#,如果傳入的值是id,則解析成的sql為order by "id"。
(2)$將傳入的資料直接顯示生成在sql中。如:order by $user_id$,如果傳入的值是id,則解析成的sql為order by id。
(3)#方式在很大程度上能夠防止sql注入。
(4)$方式無法防止sql注入。
(5)$方式一般用於傳入資料庫物件,例如傳入表名。(這裡得注意sql注入問題)
(6)一般能用#的就別用$。
ps:在使用mybatis中還遇到的用法,在該符號內的語句,將不會被當成字串來處理,而是直接當成sql語句,比如要執行乙個儲存過程。
總結區別:#{} 傳入值時,sql解析時,引數是帶引號的,而${}穿入值,sql解析時,引數是不帶引號的。
舉個例子:
select * from $ where name = #
在這個例子中,如果表名為
user; delete user; --
則動態解析之後 sql 如下:
select * from user;delete
user; -- where name = ?;
--之後的語句被注釋掉,而原本查詢使用者的語句變成了查詢所有使用者資訊+刪除使用者表的語句,會對資料庫造成致命損傷。
但是表名用引數傳遞進來的時候,只能使用 ${} 。這也提醒在這種用法中要小心sql注入的問題。
防止sql注入方法:
首先,永遠不要相信使用者的輸入。
(1)不使用sql,考慮nosql。
(2)正規表示式,字串過濾。
(3)引數繫結preparedstatement。
(4)使用正規表示式過濾傳入的引數。
(5)jsp中呼叫該函式檢查是否包函非法字元或jsp頁面判斷**。jsp參考jsp使用過濾器防止sql注入
以上個人拙作,希望能給路上同仁帶去點光。
sql中 與 的區別
在這裡用到了 使用 時 1 用來傳入引數,sql在解析的時候會加上 當成字串來解析 如這裡 role id roleid 2 能夠很大程度上防止sql注入 延伸 1 用傳入資料直接顯示在生成的sql中,如上面的語句,用roleid 傳入資料直接顯示在生成的sql中,如上面的語句,用roleid 那麼...
sql中exist與in的區別
in 和 exists也是很好區別的.in 是乙個集合運算子.a in 這個運算中,前面是乙個元素,後面是乙個集合,集合中的元素型別是和前面的元素一樣的.而exists是乙個存在判斷,如果後面的查詢中有結果,則exists為真,否則為假.in 運算用在語句中,它後面帶的select 一定是選乙個字段...
sql中exist與in的區別
in 和 exists也是很好區別的.in 是乙個集合運算子.a in 這個運算中,前面是乙個元素,後面是乙個集合,集合中的元素型別是和前面的元素一樣的.而exists是乙個存在判斷,如果後面的查詢中有結果,則exists為真,否則為假.in 運算用在語句中,它後面帶的select 一定是選乙個字段...