Google chrome Chrome扩展-内容安全策略-执行内联代码

Google chrome Chrome扩展-内容安全策略-执行内联代码,google-chrome,google-chrome-extension,content-security-policy,Google Chrome,Google Chrome Extension,Content Security Policy,我在chrome扩展中使用了一个外部JavaScript库。 我有内联执行,所以我得到以下类型的错误 (控制台上出现的错误) 拒绝执行JavaScript URL,因为它违反以下要求 内容安全策略指令:“脚本src'self” chrome扩展名://”。“不安全内联”关键字或哈希 ('sha256-…')或nonce('nonce-…')都需要启用内联 执行 错误信息清楚地表明存在一种可能的解决方法 说不可能。许多相关问题都引用了这个链接 这位博主说这是可能的,但这可能只适用于较旧的chrom

我在chrome扩展中使用了一个外部JavaScript库。 我有内联执行,所以我得到以下类型的错误

(控制台上出现的错误)

拒绝执行JavaScript URL,因为它违反以下要求 内容安全策略指令:“脚本src'self” chrome扩展名://”。“不安全内联”关键字或哈希 ('sha256-…')或nonce('nonce-…')都需要启用内联 执行

错误信息清楚地表明存在一种可能的解决方法

说不可能。许多相关问题都引用了这个链接

这位博主说这是可能的,但这可能只适用于较旧的chrome扩展

有可能的工作吗

附言:不想/不能改变我正在使用的整个图书馆

编辑:如何使用哈希或nonce来启用内联执行。

否,这不可能放宽此策略<代码>不安全内联自清单版本2以来被Chrome扩展特别忽略

(我的重点):

没有任何机制可以放松对执行内联JavaScript的限制特别是,设置包含“不安全内联”的脚本策略将无效

错误消息提到了几种可能的方法,但文档明确指出,没有CSP允许内联脚本,忽略
不安全的内联
只是措施之一

更新 从Chrome 46开始,内联脚本可以通过在策略中指定源代码的base64编码哈希来白名单。此哈希必须以使用的哈希算法(sha256、SH384或SH512)作为前缀。有关示例,请参见元素的哈希用法


有关白名单的详细信息,请参阅。

摘自我对类似问题的回答。对于Chrome(46+)的最新版本,目前的答案不再正确<代码>不安全内联仍然无效(在清单和
标题标记中),但根据,您可以使用描述的技术来放宽限制

元素的哈希用法
scriptsrc
指令允许开发人员通过将特定内联脚本的哈希指定为允许的脚本源,将其列入白名单

用法很简单。服务器计算特定脚本块内容的哈希,并在
内容安全策略
头中包含该值的base64编码:

Content-Security-Policy: default-src 'self';
                     script-src 'self' https://example.com 'sha256-base64 encoded hash'
例如,考虑:

manifest.json

{
“清单版本”:2,
“名称”:“csp测试”,
“版本”:“1.0.0”,
“最低chrome版本”:“46”,
“内容安全策略”:“脚本src'self'”sha256-WOdSzz11/3CPQODRM89LBL2UPFEU9EHBDTMY2OCIEHS=”,
“背景”:{
“页面”:“background.html”
}
}
background.html


警报(“foo”);
结果

我还测试了将适用的指令放在
meta
标记中,而不是清单中。虽然控制台消息中指示的CSP确实包含标记的内容,但它不会执行内联脚本(在Chrome53中)

新建background.html


警报(“foo”);
结果

我在登录页面上添加了一个用于切换密码可见性的按钮后遇到了这个问题,下面是我如何解决问题的,希望能有所帮助

  • 我已停止使用复选框的onclick事件,这导致 这个问题是在chrome的匿名模式下解决的,而是给了一个id 我的复选框
之前

<div class="form__row">
        <div class="form__controls">
            <label class="checkbox"><input type="checkbox" onclick="togglePasswordVisibility()"> Show password</label>
        </div>
    </div>
修正前的错误


您的代码中有如下内容:

<button onclick="myFunction()"> Show password</button>
显示密码
简而言之,这在chrome应用程序和扩展中是不允许的

将此更改为以下内容,它将起作用:

html:

显示密码
script.js:

document.getElementById(“myButton”).addEventListener(“单击”,myFunction);
函数myFunction(){
console.log('asd');
}

长话短说:

在chrome应用程序中,内容安全策略不允许内联javascript。因此,您必须将javascript放在.js文件中,并将其包含在HTML中


进一步阅读:

您可以像这样配置
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">

内容安全策略:脚本src'nonce-xyz123';样式src‘nonce-xyz123’;

Chrome扩展特别忽略了nonce,认为它不安全。截至2020年9月(第85节),只有“sha256..”选项有效。但是由于每次html文件更新时哈希值都会发生变化,这很不方便。

也有人问过类似的问题,但我想遗漏了一些内容。请给我们创建错误+1的代码;为了澄清OP:CSP规范允许放宽此限制(因此建议添加
不安全评估
),但CSP中Chrome扩展允许的范围比一般CSP规范窄。@Xan-同意“不安全内联”将无效。但我相信还有其他方法-散列/nonce,正如错误消息所指出的那样。@AmitG如果您坚持不同意文档,这是您的选择。这个答案不再适用,请查看我的答案和更新状态。@ChrisHunt感谢您更新了这个问题的答案,我在回答中包含了新的信息。如何使用锚href(如
)内联执行JS呢。我尝试了
rRMdkshZyJlCmDX27XnL7g3zXaxv7ei6Sg+yt4R3svU=
97l24HYIWEdSIQ8PoMHzpxiGCZuyBDXtN19RPKFsOgk=
,但运气不好;元标记版本不起作用。我得到了一个“内容安全策略”:忽略了不安全的CSP值“sha256-TTV2e1hDY8O7+uUJbANScTuJ3ibjGZ9SqN6LdxfzDCs=”在指令“script src”中。当我尝试此操作时,清单中的每隔一个.js文件都会拒绝加载,因为它违反了此po
$(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";
    }
}
<button onclick="myFunction()"> Show password</button>
<button id="myButton"> Show password</button>
<script src="script.js"></script>

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">