我在chrome扩展程序中使用外部JavaScript库。 我有内联执行,所以我得到了一些错误
(我在控制台上得到的错误)
拒绝执行JavaScript网址,因为它违反了以下规定 内容安全政策指令:" script-src' self' 铬 - 延伸://&#34 ;. “不安全 - 内联”和“不安全”。关键字,哈希 (' sha256 -...')或nonce(' nonce -...')需要启用内联 执行。
错误消息清楚地表明可以解决这个问题。
Chrome-Content Security Policy说不可能。许多相关问题引用了这个链接。
Blog这位博主说这是可能的,但这可能仅适用于较旧的Chrome扩展程序。
任何可行的工作?
PS:不想/不能改变我正在使用的整个图书馆。
编辑:如何使用散列或随机数启用内联执行。
答案 0 :(得分:15)
不,这是不可能放宽此政策。 unsafe-inline
被Chrome Extensions特别忽略,因为清单版本为2。
Documentation(强调我的):
没有放松对执行内联JavaScript的限制的机制。 特别是,设置包含“unsafe-inline”的脚本策略将无效。
错误消息提到了几种可能的方法,但文档清楚地表明没有CSP允许内联脚本,而忽略unsafe-inline
只是其中一种措施。
从Chrome 46开始,可以通过在策略中指定源代码的base64编码哈希来将内联脚本列入白名单。此哈希必须以使用的哈希算法(sha256,sha384或sha512)作为前缀。有关示例,请参阅元素的哈希用法。
有关白名单的详细信息,请参阅this answer。
答案 1 :(得分:10)
从我对类似问题here的回答中复制。对于最新版本的Chrome(46+),目前的答案已不再适用。 unsafe-inline
仍然没有效果(在清单和meta
标头标记中),但根据documentation,您可以使用here所述的技术来放宽限制。
<script>
元素的哈希用法
script-src
指令允许开发人员将其哈希指定为允许的脚本源,从而将特定内联脚本列入白名单。用法很简单。服务器计算特定脚本块内容的哈希值,并在
Content-Security-Policy
头中包含该值的base64编码:Content-Security-Policy: default-src 'self'; script-src 'self' https://example.com 'sha256-base64 encoded hash'
举个例子,考虑一下:
manifest.json :
{
"manifest_version": 2,
"name": "csp test",
"version": "1.0.0",
"minimum_chrome_version": "46",
"content_security_policy": "script-src 'self' 'sha256-WOdSzz11/3cpqOdrm89LBL2UPwEU9EhbDtMy2OciEhs='",
"background": {
"page": "background.html"
}
}
background.html :
<!DOCTYPE html>
<html>
<head></head>
<body>
<script>alert('foo');</script>
</body>
</html>
我还测试了将适用的指令放在meta
标记而不是清单中。虽然控制台消息中指示的CSP确实包含了标记的内容,但它不会执行内联脚本(在Chrome 53中)。
新 background.html :
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'sha256-WOdSzz11/3cpqOdrm89LBL2UPwEU9EhbDtMy2OciEhs='">
</head>
<body>
<script>alert('foo');</script>
</body>
</html>
答案 2 :(得分:1)
您的代码中包含以下内容:
<button onclick="myFunction()"> Show password</button>
简而言之,Chrome应用和扩展程序不允许这样做。
将此更改为以下内容,它将起作用:
html:
<button id="myButton"> Show password</button>
<script src="script.js"></script>
script.js:
document.getElementById("myButton").addEventListener("click", myFunction);
function myFunction(){
console.log('asd');
}
长话短说
在Chrome应用中,内容安全策略不允许使用内联JavaScript。因此,您必须将javascript放在.js文件中,并将其包含在HTML中。
进一步阅读:https://developer.chrome.com/extensions/contentSecurityPolicy
答案 3 :(得分:1)
nonce 是不安全的。从2020年9月(v.85)开始,只有' sha256 .. '选项有效。但是很不方便,因为哈希随着每次html文件更新而更改。
答案 4 :(得分:0)
在登录页面上添加simple checkbox以切换密码可见性后,我遇到了这个问题,这是我解决问题的方式,希望对您有所帮助;
之前
<div class="form__row">
<div class="form__controls">
<label class="checkbox"><input type="checkbox" onclick="togglePasswordVisibility()"> Show password</label>
</div>
</div>
之后
<div class="form__row">
<div class="form__controls">
<label class="checkbox"><input type="checkbox" id="checkboxTogglePasswordVisibility"> Show password</label>
</div>
</div>
请记住要引用您的js文件。您可以像这样简单地引用它。
<script src="../Scripts/Script.js"></script>
这是我添加到Script.js中的事件侦听器。
$(document).ready(function () {
addEventListenerForCheckboxTogglePasswordVisibility()
});
function addEventListenerForCheckboxTogglePasswordVisibility() {
var checkbox = document.getElementById("checkboxTogglePasswordVisibility");
if (checkbox !== null) {
checkbox.addEventListener('click', togglePasswordVisibility);
}
}
function togglePasswordVisibility() {
var passwordElement = document.getElementById("password");
if (passwordElement.type === "password") {
passwordElement.type = "text";
} else {
passwordElement.type = "password";
}
}
修复前出现错误;
答案 5 :(得分:0)
您可以像这样配置csp nonce
Content-Security-Policy: script-src 'nonce-xyz123'; style-src 'nonce-xyz123';
<script src="https://www.paypal.com/sdk/js?client-id=sb" data-csp-nonce="xyz-123">
https://developer.paypal.com/docs/checkout/troubleshoot/support/#mobile