我使用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=
时(如错误消息中所建议的(,页面加载上没有任何错误消息,但当我单击按钮时错误仍然存在(并且脚本没有执行(。
我的问题:
- 出了什么问题
- 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=