mirror of
https://github.com/elicpeter/nyx.git
synced 2026-06-09 19:45:13 +02:00
34 lines
885 B
Python
34 lines
885 B
Python
|
|
"""SSRF — negative fixture.
|
||
|
|
|
||
|
|
Safe function: validates URL scheme and host against an allowlist.
|
||
|
|
Expected verdict: NotConfirmed.
|
||
|
|
"""
|
||
|
|
import urllib.request
|
||
|
|
import urllib.parse
|
||
|
|
|
||
|
|
|
||
|
|
ALLOWED_SCHEMES = {"https"}
|
||
|
|
ALLOWED_HOSTS = {"api.example.com", "data.example.com"}
|
||
|
|
|
||
|
|
|
||
|
|
def fetch_url(url):
|
||
|
|
"""Safe: validates URL before fetching."""
|
||
|
|
try:
|
||
|
|
parsed = urllib.parse.urlparse(url)
|
||
|
|
except Exception:
|
||
|
|
print("Invalid URL")
|
||
|
|
return
|
||
|
|
|
||
|
|
if parsed.scheme not in ALLOWED_SCHEMES:
|
||
|
|
print(f"Scheme not allowed: {parsed.scheme}")
|
||
|
|
return
|
||
|
|
if parsed.hostname not in ALLOWED_HOSTS:
|
||
|
|
print(f"Host not allowed: {parsed.hostname}")
|
||
|
|
return
|
||
|
|
|
||
|
|
try:
|
||
|
|
with urllib.request.urlopen(url, timeout=3) as resp:
|
||
|
|
print(resp.read().decode("utf-8", errors="replace"))
|
||
|
|
except Exception as e:
|
||
|
|
print(f"Fetch error: {e}", end="")
|