簡體   English   中英

這是允許用戶進行通配符搜索的正確方法嗎?

[英]Is this a correct way to allow wildcard search for a user?

例如,給定一個文本框名稱,用戶要求希望能夠進行通配符搜索(例如contains,starts with,ends with)。

是否可以接受sql通配符('%'和'_')作為輸入,只要我仍在后端(Java)中使用參數化查詢? 實際上,允許用戶構建自己的正則表達式,這是用戶的要求所在。

例:

  1. 用戶類型

     textbox = '%are%' 
  2. 此參數將作為后端提供給后端:

     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(); } } 
  3. 結果集將包括名稱為“Waren”,“Jared”,“Clare”,“Blare”的人,因為用戶提供了正則表達式。

使用SQL Parameterize Query,我可以確保不會允許SQL注入。 這實現了用戶對通配符搜索的要求,但是它可能違反了我可能錯過的任何內容嗎?

更新:剛剛從他們的幫助頁面發現Google也允許使用通配符。

好吧,它違反了用戶需要知道(或被告知)如何構造SQL“LIKE”語法的事實,但這就是全部。 您最終可能會以這種方式查詢速度慢,因為它通常不能使用索引,但我不會擔心安全性或正確性。

這是“安全的”,但可能不是一個好主意,原因有兩個:

  1. 要求您的用戶知道sql語法可能不是最好的ui設計。
  2. 這對於性能來說太可怕了:這些查詢通常無法使用您的索引,因此執行起來很慢。 並且它們需要大量的CPU時間來比較所有文本,因此它們會給您的服務器增加很多負載(與已經很高的執行時間不成比例)。 您需要一個依賴於全文索引的解決方案。

我很好奇, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM