[英]Rails: Search for substring without getting SQL Injected
我正在嘗試為Rails實現自動完成。 我的代碼中有類似以下內容的內容-
Location.where("name like ?", "%#{params[:location]}%")
恐怕這會導致SQL注入。 類似於以下內容-
SELECT * FROM Locations WHERE (name LIKE '%green%') OR 1=1--%'
當params[:location]
是這樣的green%') OR 1=1--
有什么辦法可以避免在Rails中針對子字符串搜索使用SQLi嗎?
戴夫是對的。 試試看,看看它輸出了什么。 它把整個東西包裝起來作為條件的一部分。 在我的課程模型中。
> x = "'') OR SELECT * FROM Users"
=> "'') OR SELECT * FROM Users"
> Course.where(["name like ?", "%#{x}%"])
Course Load (38.7ms) SELECT "courses".* FROM "courses" WHERE
(name like '%'''') OR SELECT * FROM Users%')
=> []
如果您使用的是Postgres,建議您在Postgres中使用Trigram支持。
將此內容進行遷移以進行設置:
CREATE EXTENSION pg_trgm;
然后像這樣運行查詢:
Location.select('*', "similarity(search_term, #{ActiveRecord::Base.sanitize(search_term)}) AS similarity").order('similarity DESC, search_term')
或者,只需執行您的操作,然后將參數包裝在#{ActiveRecord::Base.sanitize(search_term)}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.