全部产品
云市场

安全规则DSL语法

更新时间:2019-08-20 15:50:39

DMS自己定义了一套领域专用语言(Domain Specific Language/DSL)用来描述安全规则,它非常灵活,理论上可以表述任意的安全规则,从而不同企业完全可以定义符合自己企业的研发规范。

DSL语法

安全规则DSL语法非常简单,由分支判断(IF-ELSE)、条件和动作三部分组成,基本的形式如下:

  1. if
  2. 条件1
  3. then
  4. 动作1
  5. end

含义如下:当满足条件1,系统就执行动作1。

还有增强形式,即else后面还可以跟着if条件:

  1. if
  2. 条件1
  3. then
  4. 动作1
  5. elseif
  6. 条件2
  7. then
  8. 动作2
  9. [else 动作3]
  10. end

含义如下:如果满足条件1,就执行动作1,不满足条件1时如果满足条件2,就执行动作2,否则就执行动作3,[else 动作3]也可以没有,不满足条件2时,啥都不做。

这里注意,只有if语句是必须的,elseif可以有0个或多个,else可以有0个或1个。

  • 条件语句
    • 条件其实就是判断语句,用来判定true或false。条件由一下几部分组成:连接符(and/or)、操作符、因子(系统变量)组成,以下都是合法的条件语句:
  1. true // 最简单的条件语句,结果就是 true
  2. 1 > 0
  3. 1 > 0 and 2 > 1
  4. 1 <= 0 or 1 == 1

以上结果都是 true

  • 连接符(and/or)

    • 和其它语言一样,and/or是与或连接运算,and比or优先级高,但它们同时都比操作符的优先级低,所以 1 <= 0 or 1 == 1 语句,最先执行 1 <= 0判断,然后执行 1 == 1判断,最后执行 or 判断。
  • 操作符

    • 连接因子(系统变更)、常量进行相关逻辑运算,目前支持的操作符如下:
操作符 名称 使用示例
== 等于 1 == 1
!= 不等于 1 != 2
> 大于 1 > 2
>= 大于等于 1 >= 2
< 小于 1 < 2
<= 小于等于 1 <= 2
in 包含于 ‘a’ in [‘a’, ‘b’, ‘c’]
not in 不包含于 ‘a’ not in [‘a’, ‘b’, ‘c’]
matchs 正则匹配 ‘idxaa’ matchs ‘idx\w+’
not matchs 不匹配 ‘idxaa’ not matchs ‘idx\w+’
isBlank 为空 ‘’ isBlank
isNotBlank 不为空 ‘’ isNotBlank

上面的操作符虽然有优先级,但难以记住,因此不建议依赖优先级,如果条件语句较为复杂时,需要先判断的部分请使用括号括起来,来改变优先级,例如:1 <= 2 == true 执行顺序不明确,可改为: (1 <= 2) == true, 此时(1 <= 2)内一定先执行。

  • 因子
    • 它是系统内置变量,可用来获取安全规则校验地方的上下文信息,比如获取sql的类型、影响行数等。每个模块的不同检测点提供的因子不同,具体可到安全规则中查看:
      因子
    • 在条件语句中,可直接引用因子,例如:@fac.sql_type == ‘DML’,判断SQL类型是不是DML。
  • 动作语句
    • 动作就是满足if条件之后让系统执行的行为,比如:禁止提交工单、选择工作流、允许执行、拒绝执行等,这些动作就表达了安全规则的主要目的。和因子类似,每个模块的不同检测点提供的动作不同,具体可到安全规则中查看。
      动作主要是告诉DMS满足条件后接下来的行为,因此它有时候会附带一些参数,比如提示信息、审批模板ID等,使用方式如下:
  1. @act.allow_execute // 告诉DMS允许执行,无参数动作
  2. @act.reject_execute '理由' // 告诉DMS拒绝执行,并返回相应的理由,理由可自定义,有参动作
  3. @act.choose_approve_template 3 // 告诉DMS选择审批模板ID为3的工作流

不同模块动作的含义、参数后续会有说明,使用最频繁的动作是选择审批流程,“审批流程”章节会详细说明。

案例

控制单次执行SQL个数

  1. if
  2. @fac.sql_count > 1000
  3. then
  4. @act.reject_execute '单次执行SQL个数不能超过1000'
  5. else
  6. @act.allow_execute
  7. end

含义:如果sql的数量大于1000个时,就告诉DMS拒绝执行,并且返回相应的理由给用户,否则就允许执行。

允许提交DML语句

  1. if
  2. @fac.sql_type in [ 'UPDATE','DELETE','INSERT','INSERT_SELECT']
  3. then
  4. @act.allow_submit
  5. end

含义:如果提交的SQL是 UPDATE、DELETE、INSERT、INSERT_SELECT 类型就允许执行。