Skip to main content

Detector

Trait Detector 

Source
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§

Source

fn name(&self) -> &'static str

检测器名:snake_case 且全局唯一,同时是 Scanner::scan_with 的过滤键与 DetectionResult::attack_type 的取值。

返回 &'static str:名字是编译期字面量,调用方可以收集成静态名单长期保存, 不受检测器生命周期约束。

Source

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".

Implementors§