[英]Is this a correct way to allow wildcard search for a user?
例如,給定一個文本框名稱,用戶要求希望能夠進行通配符搜索(例如contains,starts with,ends with)。
是否可以接受sql通配符('%'和'_')作為輸入,只要我仍在后端(Java)中使用參數化查詢? 實際上,允許用戶構建自己的正則表達式,這是用戶的要求所在。
例:
用戶類型
textbox = '%are%'
此參數將作為后端提供給后端:
public class PersonDaoImpl { public List<Person> search(String name){//name gets the value from textbox w/ sql wildcards Query q = mgr.createNativeQuery('select * from Person where name like :name'); //default to always use like since expecting searchkey with sql wildcards q.setParameter('name', name);//gives the input from the screen return q.getResultList(); } }
使用SQL Parameterize Query,我可以確保不會允許SQL注入。 這實現了用戶對通配符搜索的要求,但是它可能違反了我可能錯過的任何內容嗎?
更新:剛剛從他們的幫助頁面發現Google也允許使用通配符。
好吧,它違反了用戶需要知道(或被告知)如何構造SQL“LIKE”語法的事實,但這就是全部。 您最終可能會以這種方式查詢速度慢,因為它通常不能使用索引,但我不會擔心安全性或正確性。
這是“安全的”,但可能不是一個好主意,原因有兩個:
我很好奇,
name
參數如何在請求中設置?
這個平台是什么?
(OP早先錯過了setParameter
)
正如您所指出的,用戶需要知道通配符語法,即使用%
, _
等。更流行的方法是從用戶名中獲取字符串,以及“完全匹配”/“開始”的選項以“/”任何地方的名”。 如果你走這條路線,你也可以在前兩種情況下執行更有效的查詢。
編輯:
如果客戶堅持要contains
查詢,然后我覺得你現在需要更好的最終用戶輸入的模式,然后通過將輸入字符串轉換為模式的做法%
左右吧。
這是因為用戶仍然可以選擇不向搜索字符串添加(或有選擇地添加) %
,從而加快查詢執行速度。 例如:
如果用戶輸入搜索字符串Don
則查詢select ... from ... where name like 'Don'
。 RDBMS很可能會使用名稱上的索引。
如果用戶輸入搜索字符串Don%
則查詢select ... from ... where name like 'Don%'
。 RDBMS仍然很可能在名稱上使用索引。
如果用戶輸入搜索字符串%Don
或%Don%
則無法使用索引。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.