pub trait Detector: Send + Sync {
// Required methods
fn name(&self) -> &'static str;
fn detect(&self, input: &str) -> Option<DetectionResult>;
}Expand description
所有检测器的唯一契约:一个名字,一次检测。
32 个内置检测器都只实现这两个方法。session / throttle 不实现本 trait
—— 它们是有状态的,输入不是单个字符串(token + 指纹 + 位置 + 时间),也不在
Scanner 的装配范围内,见各自模块。
实现契约(tests/invariants.rs 对全部内置实现逐个核验):
name非空、snake_case、全局唯一;detect返回的DetectionResult::attack_type必须等于name(),且命中时matched_pattern非空;- 同一实例的
name()恒定(扫过任意输入都不变); Send + Sync:Scanner靠它把检测器跨线程共享。
Required Methods§
Sourcefn name(&self) -> &'static str
fn name(&self) -> &'static str
检测器名:snake_case 且全局唯一,同时是
Scanner::scan_with 的过滤键与 DetectionResult::attack_type 的取值。
返回 &'static str:名字是编译期字面量,调用方可以收集成静态名单长期保存,
不受检测器生命周期约束。
Sourcefn detect(&self, input: &str) -> Option<DetectionResult>
fn detect(&self, input: &str) -> Option<DetectionResult>
扫描一个输入:命中返回 Some,未命中返回 None,至多一条结果。
返回字段的契约(tests/invariants.rs 与各检测器自测逐一核验):
attack_type == self.name();offset是input内的字节偏移(UTF-8 字节下标,不是字符数);matched_pattern恰好是&input[offset..offset + matched_pattern.len()], 即命中片段本身;- 有强弱两档的检测器先试强档:强档命中报声明的等级,未中再试弱档,弱档固定报
Severity::Low(弱信号,单条不构成拒绝理由,见DetectionResult::severity)。
无状态:&self 只读,同一输入任意次调用结果相同;实现不得借检测写入内部状态
(需要状态请用 session / throttle 这类独立模块)。
Dyn Compatibility§
This trait is dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety".