语言注入设置:SQL 注入
在 语言注入 页面中,点击
 ,并从上下文菜单中选择 SQL 注入 ,或者选择一个条目并点击
,将打开此对话框。
项目 | 描述 |
|---|
名称 | 注入的名称。 |
Language | 要注入的语言。 ID :选择要注入的语言的 ID 或名称。 前缀 :指定要在相应字符串值之前添加的字符序列。 后缀 :指定要在相应字符串值之后添加的字符序列。
前缀和后缀是可选的。 |
位置模式 | 在此字段中,输入用于定义希望 DataGrip 将字面量识别为注入的上下文的规则。 SQL 元素模式: 使用 SQL 元素模式识别适用语言注入的 SQL 元素。 可以组合模式,按 SQL 方言、函数名称、实参位置和函数实参数量来限制匹配。 基础模式:
sqlElement().forDialects(<DIALECT>).functionArgument(<INDEX>, <FUNCTION-PATTERN>)
sqlElement() 启动 SQL 元素的模式。 forDialects(<DIALECT>) 将匹配限制为指定的 SQL 方言。 functionArgument(<INDEX>, <FUNCTION-PATTERN>) 进一步将匹配限制为在指定的从零开始索引处用作函数实参的元素。 函数调用必须匹配 <FUNCTION-PATTERN>。
<FUNCTION-PATTERN>:
sqlFunctionCall().name(<NAME>).params(<PARAMS-PATTERN>)
sqlFunctionCall() 启动函数调用的模式。 name(<NAME>) 将匹配限制为具有指定名称的函数。 params(<PARAMS-PATTERN>) 对函数实参应用附加条件。
<PARAMS-PATTERN>:
sqlExpressions().count(<MIN>, <MAX>)
sqlExpressions() 启动 SQL 表达式列表的模式。 count(<MIN>, <MAX>) 将匹配限制为包含 <MIN> 到 <MAX> 个表达式的列表。
组合示例: [Oracle] REGEXP_LIKE 中的 RegExp 内置规则名称: Oracle RegExp。
sqlElement()
.forDialects("Oracle")
.functionArgument(
1,
sqlFunctionCall()
.name("regexp_like")
.params(sqlExpressions().count(2, 3))
)
当某个 SQL 元素位于 Oracle 方言中,且该元素是具有两个或三个实参的 regexp_like 函数调用中索引 1 处的实参时,此模式会匹配该元素。 REGEXP_LIKE 的第二个实参是正则表达式模式,因此 DataGrip 会将匹配的字符串字面量 '^[a-z]+$' 视为 RegExp 片段:
SELECT 'Match'
FROM dual
WHERE REGEXP_LIKE('hello', '^[a-z]+$');
![[Oracle] REGEXP_LIKE 中的 RegExp部分匹配项与 RegExp片段: [Oracle] REGEXP_LIKE 中的 RegExp部分匹配项与 RegExp片段:](https://resources.jetbrains.com.cn/help/img/idea/2026.3/db_sql_injection_example_oracle_regexp.png) 更多示例: [Oracle] XMLQUERY 中的 XPath 内置规则名称: Oracle XPath。
sqlElement().forDialects("Oracle").functionArgument(0, sqlFunctionCall().name("xmlquery","xmlexists"))
此模式会匹配 Oracle XMLQUERY 和 XMLEXISTS 函数调用中索引 0 处的实参。 DataGrip 会将匹配的字符串字面量 '/catalog/book' 视为 XPath 片段:
SELECT XMLQUERY(
'/catalog/book'
PASSING XMLTYPE('<catalog><book>SQL</book></catalog>')
RETURNING CONTENT
)
FROM dual;
![[Oracle] XMLQUERY 中的 XPath [Oracle] XMLQUERY 中的 XPath](https://resources.jetbrains.com.cn/help/img/idea/2026.3/db_sql_injection_example_oracle_xpath.png) [Microsoft SQL 服务器] OPENJSON 中的 JSON 内置规则名称: SQL Server JSON。
sqlElement().forDialects("TSQL").functionArgument(0,sqlFunctionCall().name("openjson").params(sqlExpressions().count(1, 2)))
此模式会匹配带有一个或两个实参的 T-SQL OPENJSON 调用中索引 0 处的实参。 DataGrip 会将匹配的字符串字面量 '{"name":"Alice","age":30}' 视为 JSON 片段:
SELECT *
FROM OPENJSON('{"name":"Alice","age":30}');
![[Microsoft SQL Server] OPENJSON 中的 JSON [Microsoft SQL Server] OPENJSON 中的 JSON](https://resources.jetbrains.com.cn/help/img/idea/2026.3/db_sql_injection_example_ms_sql_server_json.png)
多个模式 可以为单个注入规则定义多个位置模式。 如果任一模式匹配,注入就会激活(这些模式通过 OR 逻辑组合)。 将每个模式添加到单独一行。 |
高级 | 在此区域,可以选择指定其他设置,以缩小注入规则适用的上下文,从而对注入过程进行更细粒度的控制。 值模式 输入用于确定语言注入上下文的正则表达式。 通过使用模式的第一个捕获组作为注入目标,您可以配置过程,使语言仅注入到匹配某个模式的值或匹配该模式的多个部分中。 单个文件 - 如果关闭该选项,符合值模式的片段会被单独处理,作为不同的"文件",例如从片段编辑器的视角来看。 如果该选项开启,相应的片段将全部合并在一起,形成一个单一的单元或“文件”。 鉴于此数值模式 xxx (.+) yyy (.+) zzz
以及片段 xxx select * yyy from family zzz,
select * 和 from family 在选项关闭时被视为两个独立的片段(或“文件”)。 如果此选项开启, select * from family 会被视为单个单元或“文件”。
|
2026年 11月 7日