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

1"""HTTP header sanitization helpers. 

2 

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

7 

8from __future__ import annotations 

9 

10import re 

11 

12from lexigram.logging import get_logger 

13 

14logger = get_logger(__name__) 

15 

16 

17class HeaderSanitizer: 

18 """Sanitizer that strips CRLF characters from header values.""" 

19 

20 _CRLF_RE = re.compile(r"[\r\n]") 

21 

22 def sanitize_header_value(self, value: str) -> str: 

23 """Replace CRLF characters with a space. 

24 

25 Args: 

26 value: The raw header value to sanitize. 

27 

28 Returns: 

29 The sanitized header value with CR/LF replaced by spaces. 

30 """ 

31 if not value: 

32 return value 

33 

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 

42 

43 

44__all__ = ["HeaderSanitizer"]