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

ruo*_*ola -25 sql t-sql sql-server wildcard sql-like

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

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

表格示例:

| 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__________|
Run Code Online (Sandbox Code Playgroud)

查询示例:

SELECT ID
FROM ExampleTable
WHERE 'AVVYXZZZZ5ABCDEFGHIJ' LIKE String;
Run Code Online (Sandbox Code Playgroud)

查询结果:

SELECT ID
FROM ExampleTable
WHERE 'AVVYXZZZZ5ABCDEFGHIJ' LIKE String;
Run Code Online (Sandbox Code Playgroud)

这是使用它们的有效且惯用的方法吗?在某些文档或其他参考资料中是否有使用此类SQL通配符的示例?

Gor*_*off 15

如果将用户输入直接输入到表中而不进行验证,并且用户只能看到自己的内容,则可能会出现安全漏洞。

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

但是,在类似模式下使用列名不存在SQL注入风险,因为它不会导致另一个命令“无意间”运行。并且,如果您将模式放入表中以进行匹配,则不会有其他风险。

可能与性能有关,但这完全是另一个问题。


Lau*_*gil 9

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

 | ID        | Identifier          |
 | --------- |---------------------|
 | 8         | A%                  |
 | 9         | %                   |
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我使用了类似的“映射”方法,其中“优先级”列将通过让代码选择具有最高优先级的匹配来/处理/重叠掩码。考虑到系统必须经历的字符串操作数量,性能出奇地好,即使是应用于 250k+ 记录的几百个过滤器;那时 PIII 被认为是一流的 =) (2认同)