SQL WHERE IN引數化編譯寫法簡單示例
阿新 • • 發佈:2020-01-09
前言
最近在一次使用sql中的where in語句時,造成了一些非預期的查詢結果。尤其是在程式碼中去編寫並執行sql語句時,會出現一些意外情況。再查閱了一些資料以及手動測試後,發現是自己sql語句寫法存在問題,在此記錄。
例子
業務需求,需要通過SQL語句從asset資產表中查詢域名欄位在(“thief.one”,”nmask.cn”,”sec.thief.one”)範圍內的資料庫記錄,SQL語句該怎麼寫呢?
拼接法(錯誤)
values = "'thief.one','nmask.cn','sec.thief.one'" sql = "select * from asset where domain in ("+values+")" print sql
說明:通過將搜尋條件以字串拼接的方式構造sql語句,語法上可通過,但存在著安全隱患(參照sql注入漏洞)
引數化1(錯誤)
values = (("thief.one","nmask.cn","sec.thief.one"),) sql = "select * from asset where domain in %s" print sql print values
說明:通過引數化方式,將where in 後面的查詢內容傳入。表面上看沒問題,但在編譯過程中,會將(“thief.one”,”sec.thief.one”)整體看成一個字串,而作為查詢條件,與需求不符合。
引數化2(正確)
values = ("thief.one","sec.thief.one") sql = "select * from asset where domain in ({})".format(",".join(['%s' for i in values])) print sql print values
說明:通過計算values裡面字串個數,動態構造編譯的引數。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對我們的支援。