我有一个在javadoc -tag pre -tag post -tag invariant
运行的Tampermonkey用户脚本
如何检查内联JavaScript是否已禁用?
答案 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逻辑相似。