当我使用随机数时,为什么我不能绕过我的 CSP 阻止我在 nunjucks 中的 javascript 代码
Why can't I get around my CSP blocking my javascript code in nunjucks when I use a nonce
我试图让用户在收到 404 未找到时 return 到他们之前的屏幕,但我的 CSP 阻止了我。
使用 nonce 似乎是绕过它的方法,但我无法让这个幸运的东西起作用。
理想情况下,我想将随机数添加到我的 href,但我不确定是否可行。或者,我想从 404 文件中 运行 一些 javascript,但它似乎没有获取我的随机数的值。
这就是我在 helmet-csp 中设置随机数的方式:
app.locals.nonce = crypto.randomBytes(16).toString("hex");
app.use(csp({
directives: {
defaultSrc: ["'self'"],
styleSrc: ["'self'"],
scriptSrc: ["'self'", `'nonce-${app.locals.nonce}'`],
imgSrc: ["'self'"],
fontSrc: ["'self'"]
}
}));
在 nunjucks 404 页面中,我正在尝试返回上一页:
{% set n = "nonce-"+nonce %}
<a nonce={{n}} href="javascript:history.go(-1);">{{ t('404:goBack')</a>
在底部,我这样设置了我的脚本标签:
<style nonce=app.locals.nonce>
console.log('inside 404')
</style>
登陆我的 404 页面后,Chrome 出现以下错误:
eligibilixxxty-sf-debt:38 拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“script-src 'self' 'nonce-a8ff45c6cc9b12df8111202f13d1c000'”。启用内联执行需要 'unsafe-inline' 关键字、散列 ('sha256-+6WnXIl4mbFTCARd8N3COQmT3bJJmo32N8q8ZSQAIcU=') 或随机数 ('nonce-...')。
然后单击 href link 得到以下响应:
拒绝 运行 JavaScript URL 因为它违反了以下内容安全策略指令:“script-src 'self' 'nonce-a8ff45c6cc9b12df8111202f13d1c000'”。启用内联执行需要 'unsafe-inline' 关键字、散列 ('sha256-...') 或随机数 ('nonce-...')。
有什么地方出错了吗?
<a href="javascript:history.go(-1);">
它是一个 javascript-naviagtion,它(以及标签中的内联事件处理程序)需要强制性的 'unsafe-inline' 并且不能通过 'nonce-value' 令牌允许。
'unsafe-hashes' 为此类目的提供的令牌,但尚未在浏览器中实现现在已实现!请参阅下面的更新。
您只有一种方法 - 从标签中删除处理程序:
<a id="elem" href='#'>go back</a>
<script nonce=app.locals.nonce> // place 'nonce' here
elem.onclick = function() {
history.go(-1);
};
<script>
根据您的喜好,您可以使用带箭头功能的 addEventListener():
<script nonce=app.locals.nonce>
elem.addEventListener( "click" , () => history.go(-1));
</script>
或匿名:
<script nonce=app.locals.nonce>
elem.addEventListener("click", function() { history.go(-1); });
</script>
已更新
Chrome 85 和 Firefox 81 都支持 'unsafe-hashes' 令牌 inline event handlers and for inline styles.
我试图让用户在收到 404 未找到时 return 到他们之前的屏幕,但我的 CSP 阻止了我。
使用 nonce 似乎是绕过它的方法,但我无法让这个幸运的东西起作用。
理想情况下,我想将随机数添加到我的 href,但我不确定是否可行。或者,我想从 404 文件中 运行 一些 javascript,但它似乎没有获取我的随机数的值。
这就是我在 helmet-csp 中设置随机数的方式:
app.locals.nonce = crypto.randomBytes(16).toString("hex");
app.use(csp({
directives: {
defaultSrc: ["'self'"],
styleSrc: ["'self'"],
scriptSrc: ["'self'", `'nonce-${app.locals.nonce}'`],
imgSrc: ["'self'"],
fontSrc: ["'self'"]
}
}));
在 nunjucks 404 页面中,我正在尝试返回上一页:
{% set n = "nonce-"+nonce %}
<a nonce={{n}} href="javascript:history.go(-1);">{{ t('404:goBack')</a>
在底部,我这样设置了我的脚本标签:
<style nonce=app.locals.nonce>
console.log('inside 404')
</style>
登陆我的 404 页面后,Chrome 出现以下错误: eligibilixxxty-sf-debt:38 拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“script-src 'self' 'nonce-a8ff45c6cc9b12df8111202f13d1c000'”。启用内联执行需要 'unsafe-inline' 关键字、散列 ('sha256-+6WnXIl4mbFTCARd8N3COQmT3bJJmo32N8q8ZSQAIcU=') 或随机数 ('nonce-...')。
然后单击 href link 得到以下响应: 拒绝 运行 JavaScript URL 因为它违反了以下内容安全策略指令:“script-src 'self' 'nonce-a8ff45c6cc9b12df8111202f13d1c000'”。启用内联执行需要 'unsafe-inline' 关键字、散列 ('sha256-...') 或随机数 ('nonce-...')。
有什么地方出错了吗?
<a href="javascript:history.go(-1);">
它是一个 javascript-naviagtion,它(以及标签中的内联事件处理程序)需要强制性的 'unsafe-inline' 并且不能通过 'nonce-value' 令牌允许。
'unsafe-hashes' 为此类目的提供的令牌,但尚未在浏览器中实现现在已实现!请参阅下面的更新。
您只有一种方法 - 从标签中删除处理程序:
<a id="elem" href='#'>go back</a>
<script nonce=app.locals.nonce> // place 'nonce' here
elem.onclick = function() {
history.go(-1);
};
<script>
根据您的喜好,您可以使用带箭头功能的 addEventListener():
<script nonce=app.locals.nonce>
elem.addEventListener( "click" , () => history.go(-1));
</script>
或匿名:
<script nonce=app.locals.nonce>
elem.addEventListener("click", function() { history.go(-1); });
</script>
已更新
Chrome 85 和 Firefox 81 都支持 'unsafe-hashes' 令牌 inline event handlers and for inline styles.