pub struct RouteWaf {
pub enabled: bool,
pub dry_run: bool,
pub filters: Vec<String>,
pub max_body_inspect_bytes: u64,
pub custom_patterns: Vec<String>,
}Expand description
Route-scoped WAF-lite config (DW-051, routes[].waf).
A lightweight, heuristic-based web application filter: regex pattern
matching for SQL injection, XSS, and path traversal signatures across
the request path, query string, selected headers (User-Agent, Referer,
Cookie, X-Forwarded-For), and body (when the content type is JSON or
form-urlencoded, up to max_body_inspect_bytes). This is NOT a full
WAF — it is a first-line traffic filter that rejects obvious attack
signatures before authentication or rate limiting. Per-route opt-in;
routes without a waf block are never inspected.
Fields§
§enabled: boolMaster switch. Default false: the WAF block is inert even when present (allows staged rollout). When true, the configured filter categories run on every request the route matches.
dry_run: boolAudit-log-only mode (dry-run synergy, DW-041): when true, the
WAF evaluates every filter and LOGS matches (a dwara::policy
warn event + the dwara_waf_total{outcome="logged"} counter)
but does NOT block — the request continues to the upstream.
Lets an operator observe what the WAF would catch before
enforcing it. Default false: matches are blocked with 403.
filters: Vec<String>Which filter categories to run. An empty or absent list
defaults to all three (sqli, xss, path_traversal).
Validation rejects an enabled WAF with an explicit non-empty
list containing an unknown category name.
max_body_inspect_bytes: u64Maximum number of body bytes to inspect (0 = do not inspect the body at all; 1..=1048576 = inspect up to this many bytes). Default 131072 (128 KiB). Bodies larger than this limit are inspected only up to the limit (a malicious payload beyond the limit is not caught — the trade-off for a bounded inspection cost). Validation rejects values > 1048576 (1 MiB).
custom_patterns: Vec<String>Optional custom regex pattern overrides (additional patterns appended to the built-in signatures for each filter category). Each entry is a regex string compiled at config publish time; an invalid regex fails validation. When absent, only the built-in signatures are used.
Trait Implementations§
Source§impl<'de> Deserialize<'de> for RouteWaf
impl<'de> Deserialize<'de> for RouteWaf
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl JsonSchema for RouteWaf
impl JsonSchema for RouteWaf
Source§fn schema_id() -> Cow<'static, str>
fn schema_id() -> Cow<'static, str>
Source§fn json_schema(generator: &mut SchemaGenerator) -> Schema
fn json_schema(generator: &mut SchemaGenerator) -> Schema
Source§fn inline_schema() -> bool
fn inline_schema() -> bool
$ref keyword. Read moreimpl StructuralPartialEq for RouteWaf
Auto Trait Implementations§
impl Freeze for RouteWaf
impl RefUnwindSafe for RouteWaf
impl Send for RouteWaf
impl Sync for RouteWaf
impl Unpin for RouteWaf
impl UnwindSafe for RouteWaf
Blanket Implementations§
§impl<T> AnyExt for T
impl<T> AnyExt for T
§fn downcast_ref<T>(this: &Self) -> Option<&T>where
T: Any,
fn downcast_ref<T>(this: &Self) -> Option<&T>where
T: Any,
T behind reference§fn downcast_mut<T>(this: &mut Self) -> Option<&mut T>where
T: Any,
fn downcast_mut<T>(this: &mut Self) -> Option<&mut T>where
T: Any,
T behind mutable reference§fn downcast_rc<T>(this: Rc<Self>) -> Result<Rc<T>, Rc<Self>>where
T: Any,
fn downcast_rc<T>(this: Rc<Self>) -> Result<Rc<T>, Rc<Self>>where
T: Any,
T behind Rc pointer§fn downcast_arc<T>(this: Arc<Self>) -> Result<Arc<T>, Arc<Self>>where
T: Any,
fn downcast_arc<T>(this: Arc<Self>) -> Result<Arc<T>, Arc<Self>>where
T: Any,
T behind Arc pointer§fn downcast_box<T>(this: Box<Self>) -> Result<Box<T>, Box<Self>>where
T: Any,
fn downcast_box<T>(this: Box<Self>) -> Result<Box<T>, Box<Self>>where
T: Any,
T behind Box pointer§fn downcast_move<T>(this: Self) -> Option<T>
fn downcast_move<T>(this: Self) -> Option<T>
Self to T,
useful only in generic context as a workaround for specializationSource§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T, X> CoerceTo<T> for Xwhere
T: CoerceFrom<X> + ?Sized,
impl<T, X> CoerceTo<T> for Xwhere
T: CoerceFrom<X> + ?Sized,
fn coerce_rc_to(self: Rc<X>) -> Rc<T>
fn coerce_box_to(self: Box<X>) -> Box<T>
fn coerce_ref_to(&self) -> &T
fn coerce_mut_to(&mut self) -> &mut T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more