From b195a38d647fceca38334a5d29121c106c9e06b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=9D=E5=B0=98?= <237809796@qq.com> Date: Sun, 14 Jun 2026 17:19:45 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D:=20FR-S6=20validate=5Fcolumn?= =?UTF-8?q?=5Fname=20=E6=9C=AA=E7=99=BB=E8=AE=B0=E8=A1=A8=E6=94=BE?= =?UTF-8?q?=E8=A1=8C=E2=86=92=E4=BF=9D=E5=AE=88=E6=8B=92=E7=BB=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit None 分支 Ok(放行)→Err(拒绝),与 is_allowed_column 的 None=>false 对齐;防未来未登记表走通用查询路径列名直进字符串拼接致 SQL 注入(当前 12 表全登记无影响,防御性) 来源 fullstack-review §2(待复核→确认);df-storage test pass / cargo 0 err --- crates/df-storage/src/crud.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/crates/df-storage/src/crud.rs b/crates/df-storage/src/crud.rs index fee1a64..0748262 100644 --- a/crates/df-storage/src/crud.rs +++ b/crates/df-storage/src/crud.rs @@ -335,7 +335,8 @@ fn validate_column_name(field: &str, table: &str) -> Result<()> { match allowed_columns_for(table) { Some(cols) if cols.contains(&field) => Ok(()), Some(_) => Err(Error::Storage(format!("表 {} 不允许的字段名: {}", table, field))), - None => Ok(()), + // 未登记表保守拒绝(FR-S6: 原放行 Ok,若未来未登记表走通用查询路径,列名直进字符串拼接即 SQL 注入;与 is_allowed_column 的 None=>false 对齐) + None => Err(Error::Storage(format!("表 {} 未登记列白名单,拒绝防注入", table))), } }