Coverage for src/lexigram/web/security/sanitization/header.py: 57%
14 statements
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-25 04:37 +0800
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-25 04:37 +0800
1"""HTTP header sanitization helpers.
3Prevents CRLF injection attacks in HTTP response headers.
4This is HTTP-specific sanitization; transport-agnostic sanitizers
5(HTML, URL, filename) live in ``lexigram.security.sanitization``.
6"""
8from __future__ import annotations
10import re
12from lexigram.logging import get_logger
14logger = get_logger(__name__)
17class HeaderSanitizer:
18 """Sanitizer that strips CRLF characters from header values."""
20 _CRLF_RE = re.compile(r"[\r\n]")
22 def sanitize_header_value(self, value: str) -> str:
23 """Replace CRLF characters with a space.
25 Args:
26 value: The raw header value to sanitize.
28 Returns:
29 The sanitized header value with CR/LF replaced by spaces.
30 """
31 if not value:
32 return value
34 sanitized = self._CRLF_RE.sub(" ", value)
35 if sanitized != value:
36 logger.warning(
37 "security.crlf_injection_detected",
38 original_length=len(value),
39 sanitized_length=len(sanitized),
40 )
41 return sanitized
44__all__ = ["HeaderSanitizer"]