xiis 的 SQL标签允许在模板中直接书写只读查询,查询结果按循环方式渲染,适合标准标签覆盖不到的复杂统计与多表关联场景。每个查询由服务端自动按当前站点注入隔离条件,模板中无需也不能手写站点编号,越权访问会被直接拒绝。
SQL标签默认关闭,需要在后台站点配置的分组里把开关改为开启后才会解析,未开启时标签整体输出空字符串,页面其余内容正常渲染。配置带有缓存周期,修改后可到缓存管理页清理立即生效。
标签参数有三个:语句参数必填,行数参数限制渲染行数,时间格式参数设置时间列的默认输出格式。行数上限为二百行,参数只可收窄不可放大;结果集本身也有同样的上限截断保护。
结果字段用方括号加列名输出,列名由语句的别名决定,时间列支持字段级格式覆盖。循环通用字段同样可用:自增序号从 1 开始、索引0 从 0 开始、总数返回结果行数。渲染方式与普通循环标签完全一致,结果内部还可以嵌套条件判断,按当前行的列值控制输出。
查询由服务端按当前站点自动追加隔离条件:主表的条件注入到过滤区域,关联表注入到连接条件内以保持左连接语义,分组与排序子句之前完成插入。全局共享表不含站点列,不做注入;语句显式写了其他站点编号或编号列表包含其他站点时,查询被拒绝执行并记录日志。
公共表表达式整体被拒绝,因为它可能用别名伪装成共享表绕过隔离;子查询无法自动定位注入点,需要在语句中显式写明当前站点条件。这些边界共同保证同一套模板在多站点下读取各自的数据。
语句进入执行前要穿过一组校验:只读白名单要求首个关键字为查询类语句;多语句与注释被拦截,防止堆叠注入与注释绕过;写操作、结构变更与危险函数被禁用;敏感表与系统库被黑名单拦截;系统信息函数同样不可用。任一校验失败即拒绝执行并写入服务日志,模板输出空字符串。
| 校验层次 | 拦截对象 |
|---|---|
| 语句形态 | 多语句、注释、非查询首关键字 |
| 操作类型 | 写操作、结构变更、权限语句 |
| 对象范围 | 敏感表、系统库、信息探测函数 |
| 站点边界 | 跨站点编号、表达式伪装、子查询注入点 |
不熟悉语句书写的作者可以使用标签生成器中的可视化构建器:按数据表、关联表、筛选条件、分组字段、聚合函数、分组筛选、输出字段、去重、排序与条数的顺序逐节配置,语句实时生成并填入参数框。构建器的表字段清单来自站点根目录的元数据文件,带中文注释,敏感表不出现在清单中。
构建器无需登录,面向所有模板作者开放;元数据文件可以自行编辑增删表或修正注释,修改后在后台缓存管理页清理一次即可生效。站点未开启 SQL标签开关时,构建器不展示任何表结构。
只读查询的能力边界由安全模型划定:能读什么、不能读什么、读到哪一批数据,都有明确规则。把复杂统计交给 SQL标签、把常规展示交给标准标签,是模板层的稳定分工方式。
评论
加载中...