use crate::Request;
pub const CALIBRATION_PAYLOADS: &[&str] = &[
"' OR 1=1--",
"<script>alert(1)</script>",
"../../etc/passwd",
"; cat /etc/passwd",
];
const _: () = assert!(
!CALIBRATION_PAYLOADS.is_empty(),
"CALIBRATION_PAYLOADS must contain at least one payload — \
calibration_request indexes [0]"
);
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum CalibrationResult {
WafPresent,
NoWaf,
Uncertain,
}
#[must_use]
pub fn calibration_request(base_url: &str) -> Request {
Request::get(format!(
"{}?wafrift_calibrate={}",
base_url,
urlencoding::encode(CALIBRATION_PAYLOADS[0])
))
}
#[must_use]
pub fn analyze_calibration(status: u16, body: &[u8]) -> CalibrationResult {
if matches!(status, 403 | 406 | 429 | 503) {
return CalibrationResult::WafPresent;
}
if matches!(status, 301 | 302 | 307 | 308) {
return CalibrationResult::Uncertain;
}
let body_str = String::from_utf8_lossy(&body[..body.len().min(crate::BLOCK_SCAN_BODY_WINDOW)])
.to_ascii_lowercase();
let waf_indicators = [
"blocked",
"firewall",
"access denied",
"security",
"captcha",
"challenge",
"cloudflare",
"incapsula",
"akamai",
];
if waf_indicators.iter().any(|ind| body_str.contains(ind)) {
return CalibrationResult::WafPresent;
}
if status == 200 || status == 404 {
CalibrationResult::NoWaf
} else {
CalibrationResult::Uncertain
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn calibration_request_includes_payload() {
let req = calibration_request("https://example.com");
assert!(req.url.contains("wafrift_calibrate"));
}
#[test]
fn analyze_403_is_waf() {
assert_eq!(
analyze_calibration(403, b"Forbidden"),
CalibrationResult::WafPresent
);
}
#[test]
fn analyze_200_clean_is_no_waf() {
assert_eq!(
analyze_calibration(200, b"Welcome"),
CalibrationResult::NoWaf
);
}
#[test]
fn analyze_redirect_is_uncertain() {
assert_eq!(
analyze_calibration(301, b"Moved. Firewall notice"),
CalibrationResult::Uncertain
);
assert_eq!(
analyze_calibration(302, b"Redirect"),
CalibrationResult::Uncertain
);
}
#[test]
fn analyze_body_firewall_is_waf() {
assert_eq!(
analyze_calibration(200, b"Blocked by firewall"),
CalibrationResult::WafPresent
);
}
#[test]
fn analyze_unknown_status_is_uncertain() {
assert_eq!(
analyze_calibration(500, b"Internal Server Error"),
CalibrationResult::Uncertain
);
}
#[test]
fn calibration_payloads_not_empty() {
assert!(!CALIBRATION_PAYLOADS.is_empty());
}
#[test]
fn analyze_406_429_503_each_return_waf_present() {
for status in [406u16, 429, 503] {
assert_eq!(
analyze_calibration(status, b""),
CalibrationResult::WafPresent,
"status {status} must be WafPresent — block-code contract violation"
);
}
}
#[test]
fn analyze_status_off_by_one_around_429_is_not_waf() {
assert_ne!(
analyze_calibration(425, b""),
CalibrationResult::WafPresent,
"425 must not trigger WafPresent — boundary anti-rig"
);
assert_ne!(
analyze_calibration(430, b""),
CalibrationResult::WafPresent,
"430 must not trigger WafPresent — boundary anti-rig"
);
}
}