安全专题
==========
安全基线
--------------------------------
Juice 本身不替代应用安全控制。建议把安全分为三层:
1. SQL 构造层(参数绑定、动态片段)
2. 应用层(输入校验、鉴权、审计)
3. 数据库层(账号权限、连接策略)
参数绑定规则(必须)
--------------------------------
在 mapper 中优先使用 ``#{}``:
- ``#{name}``:预编译参数,占位符绑定,推荐。
- ``${name}``:字符串直拼,存在注入风险,仅在受控场景使用。
安全示例:
.. code-block:: text
高风险示例(避免):
.. code-block:: text
动态 SQL 安全模式
--------------------------------
**1) 动态排序白名单**
.. code-block:: go
var orderByWhitelist = map[string]string{
"created_at": "created_at",
"name": "name",
"id": "id",
}
func SafeOrderBy(input string) string {
if v, ok := orderByWhitelist[input]; ok {
return v
}
return "created_at"
}
然后再将安全值传给 mapper(即使使用 ``${}``,值也来自白名单)。
**2) 动态表名白名单**
分表场景下,不直接信任请求参数;先映射成已知表名。
**3) IN 列表限长**
无论是 ``foreach`` 还是手写 SQL,限制列表长度,防止超长 SQL 与资源耗尽。
日志与审计
--------------------------------
- 生产环境避免输出敏感参数(手机号、身份证、token、密码等)。
- 建议在调试中间件前增加脱敏中间件。
- 对关键写操作记录审计字段(操作者、请求 ID、时间、来源)。
数据库权限最小化
--------------------------------
- 读写分离账号:读账号仅 ``SELECT``,写账号仅必要 ``DML``。
- 禁止业务账号使用 ``DROP/ALTER`` 等高危权限。
- 按服务拆分数据库账号,避免共享高权限凭据。
事务与安全
--------------------------------
- 不要把跨数据源写入当成一个本地事务(见“多数据源 × 事务交互”)。
- 对资金、库存等关键路径,结合幂等键和唯一约束,防止重放与并发穿透。
发布前安全检查清单
--------------------------------
- ``mapper`` 中是否存在未经白名单约束的 ``${}``。
- Debug 日志是否会泄露敏感参数。
- 数据库账号权限是否最小化。
- 高风险接口是否有鉴权、限流与审计。
- 动态查询是否有上限(分页、IN 长度、超时)。