【发布时间】:2021-11-22 06:52:19
【问题描述】:
您好,我正在使用 node-oidc-provider 实现 SSO 客户端
背景:
node-oidc-provider 有一个内置的表单提交,要求用户通过单击一个按钮来“确认他想要退出”,该按钮提交一个隐藏的表单,该表单将撤销他的 OAuth 令牌。
我想通过在页面加载时自行提交表单来跳过确认步骤,就像包作者建议的here
问题:
我在脚本和元标记中添加了一个随机数,但浏览器仍然拒绝加载我的脚本
async function getNonce () {
const crypto = require("crypto");
return crypto.randomBytes(16).toString("base64");
}
async function logoutSource (ctx, form) {
// @param ctx - koa request context
const nonce = await getNonce();
ctx.body = `<!DOCTYPE HTML>
<head>
<title>Logout</title>
<meta http-equiv="content-security-policy"
content="
script-src 'nonce-${nonce}' strict-dynamic 'unsafe-inline';
default-src 'self';
">
</head>
<body>
${form}
<script nonce="${nonce}">
var form = document.forms[0];
var input = document.createElement('input');
input.type = 'hidden';
input.name = 'logout';
input.value = 'yes';
form.appendChild(input);
form.submit();
</script>
</body>
</html>`;
但是,当浏览器呈现响应时,nonce 会以违反 CSP 为由被剥离,我猜测元头有问题,但在阅读 CSP 文档后我无法找出错误
火狐:Content Security Policy: The page’s settings blocked the loading of a resource at inline (“script-src”).
【问题讨论】:
-
'strict-dynamic'应该是单引号。现代浏览器从标签中隐藏了'nonce'的值,以避免随机数泄露和重用。而且您没有显示 CSP 违规消息,这有助于找出导致错误的原因。 -
谢谢,我已经添加了缺少的引号并用错误消息更新了帖子,感觉太笼统了,我什至没有考虑在这里添加它
-
inline script可以是<script>标签或<tag onclick=''>或<a href='javascript:...'>。最后两个无法使用nonce解决。您可以通过 CSP 报告找出导致此违规的确切原因(您需要将report-sample令牌添加到script-src指令并使用report-uri指令)。但据推测,违规代码的片段位于第 13 行的 /ads/session/end 文件中。 -
啊我不知道
report-sample一直想知道为什么没有更清晰的错误消息,因为浏览器确切地知道它拒绝运行我的脚本的原因!第 13 行,您可以在上面的网络选项卡图像中看到,它是我的脚本标签的开头 -
我猜错误消息是故意留下的通用
标签: node.js browser content-security-policy