【问题标题】:How to use * as a wild card in SQL query safely如何在 SQL 查询中安全地使用 * 作为通配符
【发布时间】:2023-03-16 18:00:01
【问题描述】:

我需要实现一个用户可以输入 * 作为通配符的搜索。他们正在搜索的数据库是 SQL 服务器。我正在考虑将 * 替换为 %:

userInput = userInput.replace('*', '%');

我担心由于我是“手动”执行此操作,因此可能会引入一些错误或安全漏洞。你看到这样做有什么问题吗?有没有图书馆可以帮我做这个?

我使用 Hibernate 作为 ORM 映射器和 Criteria API 来创建查询(如果它有助于回答)。

【问题讨论】:

  • 如果您使用like,您还想转义现有的%_[...]。这可能与以下内容重复:Escape a string in SQL Server so that it is safe to use in LIKE expression
  • 但只要您使用的是 PreparedStatement,就不会引发任何安全漏洞。
  • @Kobi 谢谢,我不知道 _ 和 []。必须尝试这些如何影响查询。 Hibernate 允许我设置一个转义字符,所以我可能会更新这个问题,尝试转义我不希望用户使用的东西。

标签: java sql hibernate


【解决方案1】:

这正是我们公司所做的。我们有两种产品,一种像您的示例一样在代码中使用简单替换。另一个非常重的存储过程在“搜索”存储过程本身中执行。

无论哪种方式,我们都没有遇到任何安全问题或用户对系统的投诉。

只是为了显示存储过程布局,但正如您所说的使用 ORM 可能是多余的:

CREATE PROC [dbo].[p_aaa]
    @username nvarchar(100) = 'dbo',
    @rows int = 0,
    @name nvarchar(100) = '%'       
AS

SET @name = REPLACE(@name, '*', '%')

【讨论】:

    【解决方案2】:

    如果该表中的所有数据基于此搜索值都是公开的,我相信将 * 更改为 % 不会导致任何问题。还有similar topic,它对sql示例有更多的正则表达式。

    这将使您的应用程序比使用database vendror-specific regexp matching mechanism 更加独立。

    【讨论】:

    • 不是反过来吗?如果我在服务层中对其进行转换,我将在这个特定的数据库中对我必须做的转义进行硬编码。如果我在 DAO 层中这样做,我可以对不同的存储有不同的实现。我什至可能有一个 NOSQL 数据存储。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多