在列中存储通配符字符串(与 LIKE 运算符一起使用)会导致意外的查询结果或安全问题吗?

Can storing wildcard strings in a column (to be used with LIKE operator) cause unexpected query results or security issues?

在 table 的列中存储通配符字符串(用作查询中 LIKE 运算符的第二个操作数)会导致任何不明显的行为吗? 我特别想知道意外查询结果或安全问题的可能性。

这是一个我想知道的用法示例:

示例table:

| ID        | String              |
|-----------|---------------------|
| 1         | A__XX____5__________|
| 2         | A__XX____6__________|
| 3         | A__YX____5__________|
| 4         | B__XX____5__________|
| 5         | A__XX____5__________|
| 6         | A__XX____7__________|
| 7         | A__YY____5__________|

示例查询:

SELECT ID
FROM ExampleTable
WHERE 'AVVYXZZZZ5ABCDEFGHIJ' LIKE String;

查询结果:

| ID        |
|-----------|
| 3         | 

这是一种有效且惯用的使用方式吗?某些文档或其他参考文献 material 中是否有任何示例使用这样的 SQL 通配符?

这种做法没有固有的基本安全缺陷。但是,您可能需要解析或严格控制输入字符串的格式,以免出现如下条目:

 | ID        | Identifier          |
 | --------- |---------------------|
 | 8         | A%                  |
 | 9         | %                   |

另请注意,攻击者不太可能选择在这样的模式使用中寻找缺陷,因为这种情况非常罕见。

如果新的数据模式无意中匹配了现有的过滤器字符串,则可能会出现问题,从而错误地返回旧过滤器的新条目。但是,良好的数据格式化实践应该能够防止出现此类问题。

如果用户输入未经验证直接输入 table,安全漏洞就会出现 - 可以想象 - 用户只能看到他们可以看到的内容。

也就是说,如果 '%' 可以让某些人看到他们不应该看到的数据。

但是,使用类似模式的列名不存在 SQL 注入风险,因为它不会导致另一个命令 "inadvertently" 运行。如果您将模式放入 table 以进行匹配,则没有额外的风险。

可能存在性能问题,但这完全是另一个问题。

我已经相当广泛地使用了这种类型的技术,因此没有任何性能问题或安全问题。用例通常用于存储一些规则,因此数据集只有几行要处理——因此性能永远不是问题。这非常有用的用例是,例如:

集成期间有映射表。因此,系统 1 上的 A1、A2、A3 需要作为 X 发送到其他系统。使用通配符可以使用一行。

我总是使用排序序列# 来解决冲突,解决意外值会变成 bug/feature 而不是安全漏洞。

我经常使用的另一个变体——引擎需要考虑 SQL 注入类型的攻击——是更进一步并设置条件。因此,存储完整的 PL/SQL 或任何其他解释语言条件,如 @a = 'A' 和 @b = '2' ....

防止SQL注入很容易,但最终会节省大量代码。

所以回到主要问题 - 该技术会很好。