Skip to content

Commit e854193

Browse files
Add files via upload
1 parent a70513d commit e854193

1 file changed

Lines changed: 39 additions & 0 deletions

File tree

tests/test_netshield.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1907,6 +1907,45 @@ def test_rejects_non_dict_entry(self):
19071907
self.assertEqual(accepted, [])
19081908
self.assertEqual(rejected, 4)
19091909

1910+
def test_rejects_url_with_control_chars(self):
1911+
"""URLs mit C0-Controls (\\n, \\r, \\t, NUL, ...) muessen bereits
1912+
im Schema-Validator verworfen werden, nicht erst durch urllib's
1913+
InvalidURL beim Fetch. Defense-in-Depth: falls jemand mal den
1914+
Fetcher tauscht (requests/httpx) ist der CRLF-Schutz von urllib
1915+
nicht garantiert.
1916+
"""
1917+
bad_urls = [
1918+
"https://example.com\nHost: evil.com",
1919+
"https://example.com\r\nX-Injected: 1",
1920+
"https://example.com\twith-tab",
1921+
"https://example.com\x00null-byte",
1922+
"https://example.com\x1bescape",
1923+
"https://example.com\x7fdel",
1924+
]
1925+
for bad in bad_urls:
1926+
data = {"feeds": [{"name": "ctrl", "url": bad}]}
1927+
accepted, rejected = validate_auto_feeds(data)
1928+
self.assertEqual(accepted, [], f"akzeptiert wurde: {bad!r}")
1929+
self.assertEqual(rejected, 1, f"falsche reject-Zahl fuer {bad!r}")
1930+
1931+
def test_accepts_url_with_printable_special_chars(self):
1932+
"""Nicht jedes Sonderzeichen ist Control-Zeichen. Druckbare ASCII-
1933+
Zeichen (Query-Strings, Pfad-Encoding, Fragment) muessen durch
1934+
den Filter unveraendert durchkommen, sonst zerschiessen wir
1935+
legitime Feed-URLs."""
1936+
ok_urls = [
1937+
"https://example.com/path?a=1&b=2",
1938+
"https://example.com/path%20with%20space",
1939+
"https://example.com/path#frag",
1940+
"https://user:pass@example.com/feed", # Auth-Teil ok, fetch_url filtert spaeter
1941+
"https://example.com:8443/secure",
1942+
]
1943+
for good in ok_urls:
1944+
data = {"feeds": [{"name": "ok", "url": good}]}
1945+
accepted, rejected = validate_auto_feeds(data)
1946+
self.assertEqual(len(accepted), 1, f"verworfen wurde: {good!r}")
1947+
self.assertEqual(rejected, 0, f"falsche reject-Zahl fuer {good!r}")
1948+
19101949
def test_mixed_good_and_bad_partial_accept(self):
19111950
"""Bei Mischung: gute Eintraege akzeptieren, schlechte zaehlen."""
19121951
data = {"feeds": [

0 commit comments

Comments
 (0)