0

我有一個Tampermonkey腳本,運行在document-start
如何檢查內聯JavaScript是否被禁用?如何檢查內聯JavaScript是否被禁用(使用Tampermonkey)

+0

在頁面上下文中插入一些代碼,該代碼應該回傳給您。如果你沒有收到消息('postMessage' /自定義事件),那麼它沒有運行。但是,這並不意味着某些JavaScript被禁用。有一些擴展可以根據不同的標準選擇性地禁用JavaScript。您是否正在測試被禁用的那種類型,或只是禁用了所有的JavaScript? – Makyen

+0

我特別希望測試(來自Tampermonkey userscript)頁面上的所有內聯JavaScript是否已被禁用,例如,使用uBlock Origin過濾器,如'* $ inline-script,domain = stackoverflow.com'。正如Brock Adams提到的那樣,它似乎是使用CSP指令'script-src'unsafe-eval'*'來實現的。 – Six

回答

0

這是有問題的,因爲阻塞內聯JS的某些(最?)方法:(a)不會阻止unsafeWindow操作並且(b)拋出Tampermonkey腳本中沒有被try ... catch塊捕獲的異常。

所以下面的工作,但如果內聯JS被禁用,你會看到這樣的錯誤:

拒絕,因爲它違反了以下內容安全策略指令執行內嵌腳本:「劇本-SRC「不安全-EVAL '*'。 「內聯不安全」關鍵字,散列('sha256-6BrJXtaiqFeKY4qCquiR3JgWK2KweFWHCvhZWr4tkxA =')或一個隨機數('nonce -...')是啓用內聯執行所必需的。

在控制檯中。這樣的錯誤令人討厭,但他們不會阻止Tampermonkey腳本。

工作演示代碼:

// ==UserScript== 
// @name  Test local JS 
// @match  *://stackoverflow.com/questions/* 
// @run-at  document-start 
// @grant  unsafeWindow 
// ==/UserScript== 

let gbl_InlineJS_Works = true; 
try { 
    unsafeWindow.TM_youAliveCanary = true; 
} 
catch (zError) { 
    console.log ("Local JS fails: " + zError); 
    gbl_InlineJS_Works = false; 
} 

if (gbl_InlineJS_Works) { 
    var tstScript = document.createElement ('script'); 
    tstScript.textContent = "TM_canaryIsAlive = true;"; 
    try { 
     document.documentElement.appendChild (tstScript); 
    } 
    catch (zError) { 
     console.log ("Local JS fails: " + zError); 
     gbl_InlineJS_Works = false; 
    } 
    if (gbl_InlineJS_Works) { 
     if (! unsafeWindow.TM_canaryIsAlive) { 
      gbl_InlineJS_Works = false; 
     } 
    } 
} 

console.log (`Inline javascript ${gbl_InlineJS_Works ? "works!" : "is blocked."}`); 
0

一種方式是訪問頁面的標題。要做到這一點,你必須發出一個http請求Accessing the web page's HTTP Headers in JavaScript

你也可以考慮一下這些解決方案How to detect Content Security Policy (CSP)

的 - 更新1

這基本上是未經檢驗的。我跑它對facebook.com

function inlineScriptEnabled() { 
    let req = new XMLHttpRequest(); 
    req.open('GET', document.location, false); 
    req.send(null); 
    let header = req.getResponseHeader('content-security-policy'); 
    if (!header) 
    return true; 
    let regex = /(^|\s)'unsafe-inline'(;|\s|$)/i; 
    return !!header.match(regex); 
} 
console.log(inlineScriptEnabled()); 

您還應該搜索文檔的元標記如下所述。 https://developers.google.com/web/fundamentals/security/csp/#the_meta_tag邏輯將類似。

+0

您能否通過頁面的HTTP頭提供CSP檢測的工作示例?使用第一頁上的解決方案,我看不到Content-Security-Policy頭(或任何類別的內容,例如X-Content-Security-Policy)。 – Six

+1

這似乎只告訴我該網站本身是否配置了CSP頭。當我使用uBlock Origin(Chrome擴展)來阻止帶有像* * inline-script,domain = stackoverflow.com這樣的過濾器的內聯JavaScript時,它沒有任何幫助。 – Six

相關問題