【求助】
動態sql,主要是表名和欄位名動態化, 怎樣才能有效防止sql注入?
介面傳入引數進行過濾,我覺得這是一種辦法, 但是應該不能百分百防止sql注入。
使用的mybatis框架。
uj5u.com熱心網友回復:
你用#{title} 這種方式,不要用 ${}。就是防注入uj5u.com熱心網友回復:
用#不用$。uj5u.com熱心網友回復:
都說是 表名 欄位名 了,你們還用 #{} 能決議嘛?uj5u.com熱心網友回復:
前臺傳編碼,后臺配置 編碼---欄位/表名 映射,在后臺拼接uj5u.com熱心網友回復:
有道理,這樣就相當于過濾, 但是到了mybatis那里 就用${}uj5u.com熱心網友回復:
有道理,這樣就相當于過濾, 但是到了mybatis那里 就用${}
uj5u.com熱心網友回復:
我這里只有一個比較復雜的實作方案,那就是撰寫mybatis插件(攔截器),自定義執行器或者引數處理器進行校驗。
還可以配合自定義的annotation,在執行SQL陳述句之前,進行表名引數和欄位引數的校驗。
通過自定義的annotation來區分表名引數和欄位引數。
校驗程序是,在插件初始化的時候,從資料庫中加載所有表的表名,以及欄位名的資訊。
然后在自定義的執行器或者引數處理器中,根據加載的這些資訊進行校驗。
uj5u.com熱心網友回復:
要靈活,又要安全,這確實很難辦到,你自己說的是一種方式,其它方式應該會更麻煩。uj5u.com熱心網友回復:
你的這個方式確實有點復雜,我看看這個實作的作業量要多少
uj5u.com熱心網友回復:
動態SQL一般用于查詢,都是select開頭,不存在注入,實在不放心都用預編譯;delete/insert/update,這些都用問號占位符,比如:delete from table where id = ?,哪兒還有什么注入
uj5u.com熱心網友回復:
檢查注入的引數;復雜的話,可以用sql決議器決議下轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/9705.html
標籤:Java相關
上一篇:求大佬幫助
