Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查内联JavaScript是否已禁用(使用Tampermonkey)_Javascript_Google Chrome_Google Chrome Extension_Tampermonkey - Fatal编程技术网

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

如何检查内联JavaScript是否已禁用(使用Tampermonkey),javascript,google-chrome,google-chrome-extension,tampermonkey,Javascript,Google Chrome,Google Chrome Extension,Tampermonkey,我有一个在文档开始处运行的用户脚本 如何检查内联JavaScript是否已禁用?这是一个问题,因为阻止内联JS的某些(?大多数?)方法:(a)不阻止unsafeWindowops,以及(b)抛出try未捕获的异常。。。捕获脚本中的块 因此,以下方法可以工作,但如果禁用了内联JS,您将看到如下错误: 拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“script src'safe eval'*”。启用内联执行需要'unsafe inline'关键字、哈希('sha256-6BRJXTAIQFE

我有一个在
文档开始处运行的用户脚本


如何检查内联JavaScript是否已禁用?

这是一个问题,因为阻止内联JS的某些(?大多数?)方法:(a)不阻止
unsafeWindow
ops,以及(b)抛出
try未捕获的异常。。。捕获脚本中的

因此,以下方法可以工作,但如果禁用了内联JS,您将看到如下错误:

拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“script src'safe eval'*”。启用内联执行需要'unsafe inline'关键字、哈希('sha256-6BRJXTAIQFEKY4QCQUIR3JGWK2KWEFWHCHZWR4TKXA=')或nonce('nonce-…')

在控制台中。这样的错误很烦人,但它们不会阻止脚本

工作演示代码:

// ==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."}`);

这是有问题的,因为某些(?大多数?)阻止内联JS的方法:(a)不阻止
unsafeWindow
ops,以及(b)抛出
try未捕获的异常。。。捕获脚本中的

因此,以下方法可以工作,但如果禁用了内联JS,您将看到如下错误:

拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“script src'safe eval'*”。启用内联执行需要'unsafe inline'关键字、哈希('sha256-6BRJXTAIQFEKY4QCQUIR3JGWK2KWEFWHCHZWR4TKXA=')或nonce('nonce-…')

在控制台中。这样的错误很烦人,但它们不会阻止脚本

工作演示代码:

// ==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."}`);

一种方法是访问页面的标题。要做到这一点,您必须发出http请求

您还可以看看其中的一些解决方案

--更新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());

您还应该搜索文档中的元标记,如下所述。逻辑将类似。

一种方法是访问页面的标题。要做到这一点,您必须发出http请求

您还可以看看其中的一些解决方案

--更新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());

您还应该搜索文档中的元标记,如下所述。逻辑将类似。

在页面上下文中插入一些代码,这些代码将向您发送回消息。如果没有收到消息(
postMessage
/custom event),则它不会运行。然而,这并不意味着某些JavaScript被禁用。有一些扩展将根据不同的标准选择性地禁用JavaScript。你是想测试这种类型的被禁用,还是只是所有的JavaScript都被禁用?我特别想测试(从Tampermonkey用户脚本)页面上的所有内联JavaScript是否都被禁用,例如使用诸如
*$inline script,domain=stackoverflow.com
之类的uBlock源过滤器。正如Brock Adams所提到的,它似乎是使用CSP指令
script src'safe eval'*
来实现的。在页面上下文中插入一些代码,这些代码应该会给您回信息。如果没有收到消息(
postMessage
/custom event),则它不会运行。然而,这并不意味着某些JavaScript被禁用。有一些扩展将根据不同的标准选择性地禁用JavaScript。你是想测试这种类型的被禁用,还是只是所有的JavaScript都被禁用?我特别想测试(从Tampermonkey用户脚本)页面上的所有内联JavaScript是否都被禁用,例如使用诸如
*$inline script,domain=stackoverflow.com
之类的uBlock源过滤器。正如Brock Adams所提到的,它似乎是使用CSP指令
脚本src'safe eval'*
来实现的。您能否提供一个通过页面的HTTP头进行CSP检测的工作示例?使用第一页上的解决方案,我看不到任何内容安全策略标题(或类似的内容,例如X-Content-Security-Policy)。这似乎只告诉我站点本身是否配置了CSP标题。当我使用uBlock Origin(Chrome扩展)来阻止带有过滤器的内联JavaScript时,它没有任何帮助,比如
*$inline script,domain=stackoverflow.com
。你能提供一个通过页面的HTTP头进行CSP检测的工作示例吗?使用第一页上的解决方案,我看不到任何内容安全策略标题(或类似的内容,例如X-Content-Security-Policy)。这似乎只告诉我站点本身是否配置了CSP标题。当我使用uBlock Origin(Chrome扩展)来阻止带有类似
*$inline script,domain=stackoverflow.com
的过滤器的内联JavaScript时,它没有任何帮助。