fix(docs): constrain user runtime links

This commit is contained in:
2026-07-21 18:43:48 +02:00
parent a08bc7c204
commit 2f912ff619
2 changed files with 5 additions and 1 deletions

View File

@@ -681,7 +681,10 @@ def _bounded_string_list(value: object, *, maximum_items: int, maximum_length: i
def _user_link_allowed(link: DocumentationLink) -> bool: def _user_link_allowed(link: DocumentationLink) -> bool:
href = link.href.strip() href = link.href.strip()
if link.kind == "runtime": if link.kind == "runtime":
return href.startswith("/") and not href.startswith("//") if not href.startswith("/") or href.startswith("//") or "\\" in href:
return False
parsed = urlsplit(href)
return not parsed.scheme and not parsed.netloc
if link.kind != "public": if link.kind != "public":
return False return False
parsed = urlsplit(href) parsed = urlsplit(href)

View File

@@ -102,6 +102,7 @@ class DocsContextTests(unittest.TestCase):
links=( links=(
DocumentationLink(label="Open task", href="/example", kind="runtime"), DocumentationLink(label="Open task", href="/example", kind="runtime"),
DocumentationLink(label="Unsafe runtime", href="javascript:alert(1)", kind="runtime"), DocumentationLink(label="Unsafe runtime", href="javascript:alert(1)", kind="runtime"),
DocumentationLink(label="Backslash runtime", href="/\\evil.invalid", kind="runtime"),
DocumentationLink(label="Public help", href="https://example.invalid/help", kind="public"), DocumentationLink(label="Public help", href="https://example.invalid/help", kind="public"),
DocumentationLink(label="Repository", href="example/docs/SECRET.md", kind="repository"), DocumentationLink(label="Repository", href="example/docs/SECRET.md", kind="repository"),
DocumentationLink(label="API", href="/api/v1/example", kind="api"), DocumentationLink(label="API", href="/api/v1/example", kind="api"),