Revision c9c13120
Added by koszko over 1 year ago
| content/policy_enforcing.js | ||
|---|---|---|
| 271 | 271 |
} |
| 272 | 272 |
|
| 273 | 273 |
MOSanitizer.prototype.observe = function() {
|
| 274 |
this.mo.disconnect(); |
|
| 275 |
|
|
| 274 | 276 |
let elem = this.root; |
| 275 | 277 |
while (elem && !elem.haketilo_trusted_node) {
|
| 276 | 278 |
this.mo.observe(elem, {childList: true});
|
| ... | ... | |
| 284 | 286 |
this.recursively_sanitize(new_node); |
| 285 | 287 |
} |
| 286 | 288 |
|
| 287 |
this.mo.disconnect(); |
|
| 288 | 289 |
this.observe(); |
| 289 | 290 |
} |
| 290 | 291 |
|
| ... | ... | |
| 355 | 356 |
substitute_doc.addEventListener(...listener_args); |
| 356 | 357 |
|
| 357 | 358 |
wait_loaded(doc).then(() => doc.removeEventListener(...listener_args)); |
| 358 |
|
|
| 359 |
sanitize_tree_urls(doc.documentElement); |
|
| 360 |
sanitize_tree_onevent(doc.documentElement); |
|
| 361 | 359 |
#ENDIF |
| 362 | 360 |
|
| 363 |
if (!doc.content_loaded) {
|
|
| 364 |
const sanitizer = new MOSanitizer(doc.documentElement); |
|
| 365 |
sanitizer.start(); |
|
| 366 |
wait_loaded(doc).then(() => sanitizer.stop()); |
|
| 367 |
} |
|
| 368 |
|
|
| 369 | 361 |
/* |
| 370 | 362 |
* Ensure our CSP rules are employed from the beginning. This CSP injection |
| 371 | 363 |
* method is, when possible, going to be applied together with CSP rules |
| ... | ... | |
| 399 | 391 |
substitute_doc.documentElement.replaceWith(root); |
| 400 | 392 |
#ENDIF |
| 401 | 393 |
|
| 394 |
const sanitizer = new MOSanitizer(root); |
|
| 395 |
sanitizer.start(); |
|
| 396 |
wait_loaded(doc).then(() => sanitizer.stop()); |
|
| 397 |
|
|
| 402 | 398 |
/* |
| 403 | 399 |
* When we don't inject payload, we neither block document's CSP `<meta>' |
| 404 | 400 |
* tags nor wait for `<head>' to be parsed. |
| 405 | 401 |
*/ |
| 406 | 402 |
if (policy.payload) {
|
| 407 |
await wait_for_head(doc, root); |
|
| 403 |
if (doc instanceof HTMLDocument) |
|
| 404 |
await wait_for_head(doc, root); |
|
| 408 | 405 |
|
| 409 | 406 |
root.querySelectorAll("head meta")
|
| 410 | 407 |
.forEach(m => sanitize_meta(m, policy)); |
| test/haketilo_test/data/pages/scripts_to_block_2.xml | ||
|---|---|---|
| 30 | 30 |
|
| 31 | 31 |
<html:img xmlns:html="http://www.w3.org/1999/xhtml" |
| 32 | 32 |
src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==" |
| 33 |
onload="window.__run = [...(window.__run || []), 'melon'];console.log('delme melon')">
|
|
| 33 |
onload="window.__run = [...(window.__run || []), 'melon'];"> |
|
| 34 | 34 |
</html:img> |
| 35 | 35 |
|
| 36 | 36 |
<!-- Will execute --> |
| test/haketilo_test/unit/test_policy_enforcing.py | ||
|---|---|---|
| 144 | 144 |
def assert_properly_blocked(): |
| 145 | 145 |
click_all() |
| 146 | 146 |
|
| 147 |
try: |
|
| 148 |
assert set(driver.execute_script('return window.__run || [];')) == set()
|
|
| 149 |
except: |
|
| 150 |
from time import sleep |
|
| 151 |
sleep(100000) |
|
| 147 |
assert set(driver.execute_script('return window.__run || [];')) == set()
|
|
| 152 | 148 |
assert bool(csp_off_setting) == are_scripts_allowed(driver) |
| 153 | 149 |
|
| 154 | 150 |
# First, see if scripts run when not blocked. |
Also available in: Unified diff
improvement to also properly sanitize intrinsics in XML documents under older browsers (IceCat 60)