-- ----------------------------
-- Table structure for security_event_log
-- ----------------------------
-- 用途：
--   记录应用层、网关或 WAF 识别到的安全风险事件，用于追踪恶意请求、误报复盘、统计分析和后续封禁策略。
-- 设计原则：
--   1. 不保存完整请求体，仅保存截断摘要和哈希，降低敏感数据落库风险。
--   2. 事件识别与事件记录解耦，应用校验、限流、网关/WAF 等检测源都可以写入本表。
--   3. 枚举值使用 varchar，便于后续扩展检测类型、处置动作和风险等级。

CREATE TABLE IF NOT EXISTS `security_event_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID，自增唯一标识一条安全事件记录',
  `event_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '安全事件类型，例如 SQL_INJECTION、XSS、INVALID_JSON、INVALID_PARAMETER、WAF_BLOCK、RATE_LIMIT',
  `risk_level` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'LOW' COMMENT '风险等级：LOW-低风险，MEDIUM-中风险，HIGH-高风险，CRITICAL-严重风险',
  `detector` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '检测来源：APP_VALIDATION-应用参数校验，APP_RULE-应用安全规则，WAF-WAF网关，GATEWAY-网关，RATE_LIMIT-限流组件，MANUAL-人工标记',
  `rule_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '命中的检测规则编号或规则名称，例如 mapper-order-field-whitelist、waf-942100；无明确规则时可为空',
  `event_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '安全事件简要描述，用于列表展示和人工快速判断事件原因',
  `request_uri` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求路径，不包含协议、域名和查询字符串，例如 /applet/v1/homePage/getStationInfoPage',
  `request_method` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'HTTP请求方法，例如 GET、POST、PUT、DELETE',
  `query_string` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'URL查询字符串摘要，超过字段长度应在写入前截断；用于定位GET参数风险',
  `client_ip` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '客户端IP地址，支持IPv4和IPv6；通常取系统解析后的真实访问IP',
  `x_forwarded_for` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'X-Forwarded-For请求头原始摘要，用于排查代理链路；超过字段长度应在写入前截断',
  `user_agent` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'User-Agent请求头摘要，用于识别浏览器、脚本工具或扫描器',
  `referer` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'Referer请求头摘要，用于分析请求来源页面；可能为空',
  `user_id` bigint(20) NULL DEFAULT NULL COMMENT '平台用户ID；未登录、无法解析或第三方请求无平台用户时为空',
  `operator_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '第三方运营商ID或渠道方标识；非第三方请求可为空',
  `request_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求追踪ID，例如网关TraceId、日志MDC TraceId或业务生成的请求序列号，用于关联应用日志',
  `matched_field` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '命中风险的字段名或参数名，例如 latitude、sortType、orderBy；无法定位字段时为空',
  `payload_excerpt` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '命中风险的请求内容摘要，仅保存截断片段，不保存完整请求体，避免敏感数据长期落库',
  `payload_hash` char(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '命中内容的SHA-256哈希值，便于去重、关联同类攻击和追踪重复扫描行为',
  `action` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'OBSERVE' COMMENT '处置动作：OBSERVE-仅记录，REJECT-拒绝请求，BLOCK-阻断请求，RATE_LIMIT-触发限流，ALLOW-确认放行',
  `http_status` int(11) NULL DEFAULT NULL COMMENT '本次请求最终返回的HTTP状态码，例如 400、403、429；未进入响应阶段时可为空',
  `handle_result` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '处理结果说明，例如 rejected_by_validation、blocked_by_waf、record_only、false_positive',
  `remark` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注信息，用于人工复核、误报说明或补充上下文',
  `create_by` bigint(20) NULL DEFAULT NULL COMMENT '创建人ID；系统自动记录通常为空或为系统账号ID',
  `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间，即安全事件写入数据库的时间',
  `update_by` bigint(20) NULL DEFAULT NULL COMMENT '更新人ID；人工复核或修改事件状态时记录操作人ID',
  `update_time` datetime NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间，事件被人工复核、修改备注或更新处置结果时刷新',
  `is_deleted` tinyint(4) NOT NULL DEFAULT 0 COMMENT '逻辑删除标识：0-未删除，1-已删除；用于后台列表隐藏而非物理删除',
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `idx_security_event_create_time` (`create_time`) USING BTREE,
  INDEX `idx_security_event_type_time` (`event_type`, `create_time`) USING BTREE,
  INDEX `idx_security_event_risk_time` (`risk_level`, `create_time`) USING BTREE,
  INDEX `idx_security_event_ip_time` (`client_ip`, `create_time`) USING BTREE,
  INDEX `idx_security_event_request_id` (`request_id`) USING BTREE,
  INDEX `idx_security_event_payload_hash` (`payload_hash`) USING BTREE,
  INDEX `idx_security_event_action_time` (`action`, `create_time`) USING BTREE
) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '安全事件日志表' ROW_FORMAT = DYNAMIC;

