如何检查内联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时,它没有任何帮助。