0

私はdocument-startで動作するTampermonkeyのuserscriptを持っています。
インラインJavaScriptが無効になっているかどうかを確認するにはどうすればよいですか?インラインJavaScriptが無効になっているかどうかを確認する方法(Tampermonkeyで)

+0

メッセージを返信するページコンテキストにコードを挿入します。メッセージ( 'postMessage'/customイベント)を受け取らない場合、それは実行されていません。ただし、JavaScriptの一部が無効になっているわけではありません。さまざまな基準に基づいてJavaScriptを選択的に無効にする拡張機能がいくつかあります。あなたはそのタイプが無効になっているか、あるいはすべてのJavaScriptが無効になっているかどうかテストしたいですか? – Makyen

+0

私は特に、ページ上のすべてのインラインJavaScriptが無効になっているかどうか(Tampermonkeyのuserscriptから)を調べることを検討しています。 '* $ inline-script、domain = stackoverflow.com'のようなuBlock Originフィルタを使用します。 Brock Adamsが述べたように、CSP指令 'script-src 'unsafe-eval' *'を使用しているようです。 – Six

答えて

0

これは、インラインJSをブロックする特定の(ほとんどの)方法が問題である:(a)unsafeWindow opsをブロックせず、そして、(b)Tampermonkeyスクリプトのtry ... catchブロックによってキャッチされない例外をスローする。

したがって、次の作品が、インラインJSが無効になっている場合は、次のようなエラーが表示されます。「スクリプト-SRC「安全ではない-EVAL:それは、次のコンテンツセキュリティポリシーの指示に違反しているため

がインラインスクリプトを実行するために拒否'*'。インライン実行を有効にするには、 'unsafe-inline'キーワード、ハッシュ( 'sha256-6BrJXtaiqFeKY4qCquiR3JgWK2KweFWHCvhZWr4tkxA =')、またはnonce( '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

一つの方法は、ページのヘッダにアクセスすることです。あなたはまた、これらのソリューションHow to detect Content Security Policy (CSP)

のいくつかを見ることができるHTTPリクエストAccessing the web page's HTTP Headers in JavaScript

を発行しなければならないことを行うには - 更新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拡張機能)を使用してインラインJavaScriptを '* $ inline-script、domain = stackoverflow.com'のようなフィルタでブロックすると、それは役に立ちません。 – Six

関連する問題