Chromium不接受CSP脚本src SHA-256哈希



我使用Chromium 89.0.4389.90版本来进行以下简单的HTML片段。

<!DOCTYPE html>
<html>
<head>
<title>Test CSP</title>
<meta http-equiv="Content-Security-Policy"
content="script-src 'sha256-OteiSfjK+c1oXLotC4Jj4bJn8pdo6N4nWk8uRVTM6ys='">
</head>
<body>
<script type="text/javascript">function test() { alert('Hello'); }</script>
<button onclick="test();">Click me</button>
</body>
</html>

使用创建Base64编码的哈希

$ echo -n 'function test() { alert('Hello'); }' | openssl sha256 -binary | openssl base64
OteiSfjK+c1oXLotC4Jj4bJn8pdo6N4nWk8uRVTM6ys=

加载时,Chromium控制台会打印。。。

Refused to execute inline script because it violates the following Content Security Policy directive: "script-src 'sha256-OteiSfjK+c1oXLotC4Jj4bJn8pdo6N4nWk8uRVTM6ys='".
Either the 'unsafe-inline' keyword, a hash ('sha256-r+abGbElv1ENxT5+LrplDxvxZl4w3iy17u48CbdgB8g='), or a nonce ('nonce-...') is required to enable inline execution.

如果我点击按钮,会打印另一条错误消息:

Refused to execute inline event handler because it violates the following Content Security Policy directive: "script-src 'sha256-OteiSfjK+c1oXLotC4Jj4bJn8pdo6N4nWk8uRVTM6ys='".
Either the 'unsafe-inline' keyword, a hash ('sha256-...'), or a nonce ('nonce-...') is required to enable inline execution.

当我用r+abGbElv1ENxT5+LrplDxvxZl4w3iy17u48CbdgB8g=替换OteiSfjK+c1oXLotC4Jj4bJn8pdo6N4nWk8uRVTM6ys=时(如错误消息中所建议的(,页面加载上没有任何错误消息,但当我单击按钮时错误仍然存在(并且脚本没有执行(。

我的问题:

  1. 出了什么问题
  2. Chromium使用了哪些数据来计算建议的Base64编码的SHA-256哈希r+abGbElv1ENxT5+LrplDxvxZl4w3iy17u48CbdgB8g=

我不确定散列OteiSfjK+c1oXLotC4Jj4bJn8pdo6N4nWk8uRVTM6ys=来自哪里。

要验证Chromium输出的内容,请使用在线工具手动生成Base64输出(并在C#中再次验证(:

SHA256: function test() { alert('Hello'); }
= afe69b19b125bf510dc53e7e2eba650f1bf1665e30de2cb5eeee3c09b76007c8
Base64: afe69b19b125bf510dc53e7e2eba650f1bf1665e30de2cb5eeee3c09b76007c8
= r+abGbElv1ENxT5+LrplDxvxZl4w3iy17u48CbdgB8g=

这与Chromium所说的完全匹配。我猜你使用的方法存在编码/哈希问题。

错误哈希是如何产生的

您已经获得了OteiSfjK+c1oXLotC4Jj4bJn8pdo6N4nWk8uRVTM6ys=的Base64输出。

这是从SHA-256散列产生的文本:

function test() { alert(Hello); }

请注意Hello周围缺少引号@connexo对这个问题的评论提供了一条缺失的线索,可以弄清楚为什么会产生错误的散列。

重现错误散列(Hello周围缺少引号(的步骤:

SHA256: function test() { alert(Hello); }
= 3ad7a249f8caf9cd685cba2d0b8263e1b267f29768e8de275a4f2e4554cceb2b
Base64: 3ad7a249f8caf9cd685cba2d0b8263e1b267f29768e8de275a4f2e4554cceb2b
= OteiSfjK+c1oXLotC4Jj4bJn8pdo6N4nWk8uRVTM6ys=

最新更新