Source code for duck.http.middlewares.security.modules.xss
"""
Module for testing for URL `XSS`.
"""
import re
from urllib.parse import urlparse, parse_qs
# Pre-compile regex patterns for efficiency
XSS_PATTERNS = [re.compile(p, re.IGNORECASE) for p in [
r"<[^>]*script[^>]*>",
r"javascript:",
r"onerror\s*=",
r"onload\s*=",
r"onmouseover\s*=",
r"expression\s*\(",
r"vbscript:",
r"data:",
# Removed r"\(" due to high false positive risk
]]
CONTEXT_PATTERNS = {
"href": [re.compile(r"javascript:", re.IGNORECASE), re.compile(r"data:", re.IGNORECASE)],
"src": [re.compile(r"javascript:", re.IGNORECASE), re.compile(r"data:", re.IGNORECASE)],
"style": [re.compile(r"expression\s*\(", re.IGNORECASE)],
}
[docs]
def check_xss_in_url(url: str) -> (bool, str):
"""Checks a URL for potential XSS vulnerabilities (optimized)."""
# Check whole URL for patterns
for pattern in XSS_PATTERNS:
if pattern.search(url):
return True, f"Potential XSS detected (pattern: {pattern.pattern})"
# Parse URL for parameter-specific context-aware checks
parsed = urlparse(url)
params = parse_qs(parsed.query)
for tag, patterns in CONTEXT_PATTERNS.items():
values = params.get(tag, [])
for value in values:
for pattern in patterns:
if pattern.search(value):
return True, f"Potential XSS detected in {tag} parameter (pattern: {pattern.pattern})"
return False, "No XSS vulnerabilities detected in URL"