如何检查是否禁用了内联JavaScript(使用Tampermonkey)

时间:2017-03-11 02:49:09

标签: javascript google-chrome google-chrome-extension tampermonkey

我有一个在javadoc -tag pre -tag post -tag invariant运行的Tampermonkey用户脚本 如何检查内联JavaScript是否已禁用?

2 个答案:

答案 0 :(得分:0)

这是有问题的,因为某些(大多数?)阻塞内联JS的方法:(a)不阻止unsafeWindow操作和(b)抛出未被try ... catch块捕获的异常在Tampermonkey脚本中。

因此以下工作原理但如果内联JS被禁用,您将看到如下错误:

  

拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“script-src'nickafe-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."}`);

答案 1 :(得分: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逻辑相似。