演示原型 界面为设计稿,全部数据为模拟数据,未连接真实 ODS
数据服务平台 / 工作台

我的数据集

ODS · 测试实例
我负责的数据集
14
已发布 11 · 草稿 3
昨日调用
8,412
工作台模拟 37 次已记审计
失败率
1.7%
较上周 +0.9pt,集中在费用汇总
查询耗时 P95
2.8s
阈值 3s,2 个数据集逼近

我负责的数据集

按昨日调用量排序
数据集状态权限维度 调用失败率 P95数据截止
mkt_fee_summary
营销费用汇总
v3 已发布 office 3,2043.1% 2.9s09-21 14:30
mkt_fee_detail
费用单据明细
v2 已发布 officedivision 1,8870.4% 1.2s09-21 14:30
sales_daily_office
办事处日销
v5 已发布 office 1,5400.2% 0.7s09-21 15:02
prod_output_plant
基地产量
v1 已发布 plant 9860.0% 0.5s09-21 13:00
fin_budget_dept
部门预算执行
v2 待发布 dept 00.0% 2.1s09-20 T+1

卡住的草稿

闸门未过
mkt_fee_ratio

SQL 未声明 {{XJ_SCOPE}} 占位符,且 7 个字段缺中文名

fin_budget_dept

越权用例 V5 未通过:dept 维度未标 is_required

hr_headcount_dept

缺口径 Owner 工号

越权尝试告警

近 7 天
mkt_fee_detail · 4 次 同一工号构造 office_id 参数尝试跨区,已被丢弃并记审计
sales_daily_office · 1 次 密级 L2 用户请求 gross_profit_amt,字段已物理删除

mkt_fee_ratio

草稿 v2
SQL 模板 · SQL Server 方言
只读参数 #{} 占位符已声明
1
2
3
4
5
6
7
8
9-- dataset_code: mkt_fee_ratio · 口径 Owner: 谌辉 100871
SELECT office_id, office_name, month_id,
       fee_apply_amt, fee_verify_amt, sales_amt,
       /* L3 */ gross_profit_amt,
       CAST(fee_verify_amt AS DECIMAL(18,4)) / NULLIF(sales_amt,0) AS fee_sales_ratio
FROM   dm.dm_mkt_fee_summary
WHERE  month_id BETWEEN #{monthFrom} AND #{monthTo}
  {{XJ_SCOPE}}
ORDER BY month_id DESC, office_id
占位符检查通过 切面会在执行前把 {{XJ_SCOPE}} 替换为参数化条件。客户端传入的同名权限参数一律丢弃。

mkt_fee_ratio

草稿 v2 试跑走生产权限链路,仅把身份换为模拟主体
每次模拟写一条审计,channel=workbench,params_json 记录 simulated_as。以他人视角取数的能力本身受 R_DATA_DEV 单独授权约束。

注入后的最终 SQL

陈立 视角
全部参数化
SELECT office_id, office_name, month_id,
       fee_apply_amt, fee_verify_amt, sales_amt,
       /* gross_profit_amt 已由后置切面物理删除 */
       CAST(fee_verify_amt AS DECIMAL(18,4)) / NULLIF(sales_amt,0) AS fee_sales_ratio
FROM   dm.dm_mkt_fee_summary
WHERE  month_id BETWEEN ? AND ?
  AND office_id IN (?, ?)
ORDER BY month_id DESC, office_id
绑定参数
1'202601'
2'202609'
3'CS01'scope
4'ZZ02'scope

范围值走绑定参数,不进 SQL 字符串。构造含注入特征的参数不会改变 SQL 结构。

越权用例 V1-V8

7 通过 · 1 失败
V1
客户端构造 office_id 参数

传入的 office_id 被丢弃,生效范围仍为服务端计算值

41ms
V2
SQL 注入特征参数

传入 '; DROP TABLE 后 SQL 结构未变,作为字面量绑定

38ms
V3
未订阅数据集调用

返回 403 / 40301,且不泄露数据集是否存在

12ms
V4
L2 用户请求 L3 字段

响应体中不存在 gross_profit_amt 这个 key

55ms
V5
无范围用户取数

office 维度无范围时应返回空集,实测返回全量

期望 rowCount 0 实际 rowCount 1248 原因 office 维度 is_required = 0
2.1s
V6
deny 表覆盖 allow

被拒绝的办事处不出现在结果中

63ms
V7
缓存跨用户串数据

两个不同范围的用户命中不同缓存键

29ms
V8
过期授权继续调用

valid_to 已过的 granted 记录不参与范围计算

18ms

影响分析

订阅关系 + 近 30 天审计日志
经营分析门户 · 费用板块

dataui 前端,3 个图表引用

4,102 次
帆软 · 月度经营分析报表

AppKey FR_MONTHLY,每月 1 日批量调用

612 次
角色 R_DIV_GM · R_FIN_ALL · R_MKT_HQ

共 47 名用户已订阅

47 人
指标 m_fee_sales_ratio

费销比,口径 Owner 谌辉

1 个

版本历史

v2
草稿 · 待发布

许金 · 09-21 16:40 · 新增 fee_sales_ratio 与 division 维度

闸门未过
v1
当前生效

许金 · 09-12 10:22 · 首次发布

生效中

版本差异

v1 对比 v2 草稿
SELECT office_id, office_name, month_id,
fee_apply_amt, fee_verify_amt, sales_amt,
+ gross_profit_amt,
+ CAST(fee_verify_amt AS DECIMAL(18,4)) / NULLIF(sales_amt,0) AS fee_sales_ratio
FROM dm.dm_mkt_fee_summary
WHERE month_id BETWEEN #{monthFrom} AND #{monthTo}
{{XJ_SCOPE}}
+2字段登记:gross_profit_amt (L3)、fee_sales_ratio (L1)
+1权限规则:division 维度,过滤列 division_id
!新增 L3 字段会改变低密级用户的响应结构,需重跑 V4