收紧错误报告元数据校验

限制 OSS object key、SHA-256、归档大小及事件日志计数

在开发期直接启用新校验,不增加迁移兼容层
This commit is contained in:
2026-09-02 19:09:36 +08:00
parent e0184338b6
commit 907bba9bf0
@@ -2,6 +2,9 @@ use crate::*;
const MAX_FIELD_CHARS: usize = 512;
const MAX_NOTE_CHARS: usize = 2_000;
const MAX_ARCHIVE_SIZE_BYTES: u64 = 20 * 1024 * 1024;
const MAX_EVENT_COUNT: u32 = 100;
const MAX_LOG_COUNT: u32 = 5;
const MAX_REPORTS_PER_IDENTITY_PER_HOUR: usize = 100;
const REPORT_QUOTA_WINDOW_MICROS: i64 = 60 * 60 * 1_000_000;
@@ -155,7 +158,24 @@ pub fn create_error_report_and_return(
let submission_id = validate_text(&input.submission_id, "submission_id")?;
let idempotency_key = validate_text(&input.idempotency_key, "idempotency_key")?;
let object_key = validate_text(&input.object_key, "object_key")?;
if object_key != format!("agc/error-reports/v1/{batch_id}.zip") {
return Err("error_report.object_key 格式无效".to_string());
}
let archive_sha256 = validate_text(&input.archive_sha256, "archive_sha256")?;
if archive_sha256.len() != 64
|| !archive_sha256.bytes().all(|byte| byte.is_ascii_hexdigit())
{
return Err("error_report.archive_sha256 必须是 64 位十六进制 SHA-256".to_string());
}
if input.archive_size_bytes == 0 || input.archive_size_bytes > MAX_ARCHIVE_SIZE_BYTES {
return Err("error_report.archive_size_bytes 超出上限".to_string());
}
if input.event_count == 0 || input.event_count > MAX_EVENT_COUNT {
return Err("error_report.event_count 超出上限".to_string());
}
if input.log_count > MAX_LOG_COUNT {
return Err("error_report.log_count 超出上限".to_string());
}
if let Some(existing) = tx
.db
.error_report()