Reject protocol-relative URLs in next redirect validation
This commit is contained in:
@@ -168,6 +168,24 @@ def test_unassign_battery(seeded_client):
|
||||
assert b"available" in resp2.data.lower()
|
||||
|
||||
|
||||
def test_unassign_next_honors_local_path(seeded_client):
|
||||
seeded_client.post("/battery/1/assign", data={"device_id": "1"})
|
||||
resp = seeded_client.post("/battery/1/unassign", data={"next": "/device/1"})
|
||||
assert get_location(resp) == "/device/1"
|
||||
|
||||
|
||||
def test_unassign_next_rejects_external_redirect(seeded_client):
|
||||
seeded_client.post("/battery/1/assign", data={"device_id": "1"})
|
||||
resp = seeded_client.post("/battery/1/unassign", data={"next": "//evil.com/phish"})
|
||||
assert resp.headers["Location"] == "/"
|
||||
|
||||
|
||||
def test_unassign_all_next_rejects_external_redirect(seeded_client):
|
||||
seeded_client.post("/battery/1/assign", data={"device_id": "1"})
|
||||
resp = seeded_client.post("/device/1/unassign-all", data={"next": "//evil.com"})
|
||||
assert resp.headers["Location"] == "/device/"
|
||||
|
||||
|
||||
# ------------------------------------------------------------------ #
|
||||
# Battery — retire
|
||||
# ------------------------------------------------------------------ #
|
||||
|
||||
Reference in New Issue
Block a user