在列中存储通配符字符串(与 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注入很容易,但最终会节省大量代码。
所以回到主要问题 - 该技术会很好。
在 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注入很容易,但最终会节省大量代码。
所以回到主要问题 - 该技术会很好。