PhpStorm 2026.3 Help

语言注入设置:SQL 注入

在 语言注入 页面中,点击 "添加"按钮  ,并从上下文菜单中选择 SQL 注入 ,或者选择一个条目并点击 编辑按钮 ,将打开此对话框。

PhpStorm 包含预定义的注入配置,可确保高效和易用。 我们建议您使用这些配置,而不是创建新的配置。

项目

描述

名称

注入的名称。

语言

要注入的语言。

  • ID: 选择要 inject 的语言的 ID 或名称。

  • 前缀: 指定要添加到相应字符串值之前的字符序列。

  • 后缀: 指定要添加到相应字符串值之后的字符序列。

前缀和后缀是可选的。

位置模式

在此字段中,输入规则,用于定义您希望 PhpStorm 将字面量识别为注入的上下文。

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)) )

此模式匹配 Oracle 方言中的 SQL 元素,条件是该元素是索引 1 处的实参,属于具有两个或三个实参的 regexp_like 函数调用。

REGEXP_LIKE 的第二个实参是正则表达式模式,因此 PhpStorm 会将匹配的字符串文字 '^[a-z]+$' 视为 RegExp 片段:

SELECT 'Match' FROM dual WHERE REGEXP_LIKE('hello', '^[a-z]+$');
[Oracle] REGEXP_LIKE 中的 RegExp

更多示例:

  • [Oracle] XMLQUERY 中的 XPath

    内置规则名称: Oracle XPath。

    sqlElement().forDialects("Oracle").functionArgument(0, sqlFunctionCall().name("xmlquery","xmlexists"))

    此模式匹配索引 0 处的实参,该实参属于 Oracle XMLQUERY 和 XMLEXISTS 函数调用。

    PhpStorm 会将匹配的字符串文字 '/catalog/book' 视为 XPath 片段:

    SELECT XMLQUERY( '/catalog/book' PASSING XMLTYPE('<catalog><book>SQL</book></catalog>') RETURNING CONTENT ) FROM dual;
    [Oracle] XMLQUERY 中的 XPath
  • [Microsoft SQL Server] OPENJSON 中的 JSON

    内置规则名称: SQL Server JSON。

    sqlElement().forDialects("TSQL").functionArgument(0,sqlFunctionCall().name("openjson").params(sqlExpressions().count(1, 2)))

    此模式匹配索引 0 处的实参,该实参属于具有一个或两个实参的 T-SQL OPENJSON 调用。

    PhpStorm 会将匹配的字符串文字 '{"name":"Alice","age":30}' 视为 JSON 片段:

    SELECT * FROM OPENJSON('{"name":"Alice","age":30}');
    [Microsoft SQL 服务器] OPENJSON 中的 JSON

多个模式

可以为单个注入规则定义多个位置模式。 如果有任意模式匹配,则会激活注入(它们以 OR 逻辑组合)。 请将每个模式写在单独的行上。

高级

在此区域,可以选择指定其他设置,以缩小注入规则适用的上下文,从而启用对注入过程更细粒度的控制。

  • 值模式 输入用于确定 inject 语言上下文的正则表达式。 通过将模式的第一个捕获组用作注入目标,您可以将该过程配置为仅将语言注入匹配某一模式的值,或注入匹配该模式的多个部分。

  • 单个文件 - 如果此选项关闭,与值模式匹配的片段将被单独处理,视为不同的“文件”——例如,从片段编辑器的视角来看。

    如果该选项开启,相应的片段将全部合并在一起,形成一个单元,或 "file"。

    鉴于此数值模式

    xxx (.+) yyy (.+) zzz

    以及片段

    xxx select * yyy from family zzz,

    如果该选项关闭, select * 和 from family 将被视为两个独立的片段(或 "文件")。 如果该选项开启, select * from family 将被视为一个单元,或 "文件"。

2026年 11月 9日