java这是允许用户进行通配符搜索的正确方法吗?
例如,给定一个文本框名称,用户需求希望能够进行通配符搜索(例如包含、以开头、以结尾)
只要我还在后端(Java)中使用参数化查询,接受sql通配符(“%”和“"”)作为输入可以吗?实际上,允许用户构建自己的正则表达式,这正是用户需求的全部内容
例如:
中的用户类型
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(); } }
- 由于用户提供了一个正则表达式,所以结果集将包括名为“Waren”、“Jared”、“Clare”、“Blare”的人员李>
使用SQL参数化查询,我可以确保不允许SQL注入。这实现了通配符搜索的用户需求,但它是否违反了我可能遗漏的任何内容
更新: 刚刚发现谷歌也允许通配符,从他们的help page
# 1 楼答案
这是“安全的”,但可能不是一个好主意,原因有二:
# 2 楼答案
我很好奇,name
参数最终是如何在请求中设置的?这是什么站台罢工>(OP错过了setParameter
正如您所指出的,用户需要知道通配符语法,即
%
、_
等的使用。一种更流行的方法是只从用户名中获取字符串,以及一个“精确匹配”/“以“/”名称中的任意位置开头”的选项。如果你走这条路,在前两种情况下,你也将能够执行更高效的查询编辑:
如果客户坚持使用
contains
查询,那么我认为您当前要求最终用户输入模式的方法比通过在其周围放置%
将输入字符串转换为模式更好这是因为用户仍然可以选择而不是将
%
添加(或有选择地添加)到搜索字符串中,从而加快查询执行。例如:如果用户输入搜索字符串
Don
,则查询为select ... from ... where name like 'Don'
。RDBMS很可能会在名称上使用索引如果用户输入搜索字符串
Don%
,则查询为select ... from ... where name like 'Don%'
。RDBMS很可能仍然会在名称上使用索引如果用户输入搜索字符串
%Don
或%Don%
,则无法使用索引# 3 楼答案
好吧,这违反了用户需要知道(或被告知)如何构造SQL“LIKE”语法的事实,但仅此而已。您可能会以这种方式结束一个缓慢的查询,因为它通常无法使用索引,但我不会担心安全性或正确性