问题描述
我试图让用户在找不到404时返回到先前的屏幕,但是我的CSP正在阻止我。
使用nonce似乎是解决问题的方法,但是我无法让事情顺利。
理想情况下,我想将现时数添加到我的href中,但是我不确定这是否可行。另外,我想从404文件中运行一些javascript,但似乎并没有提高我的现时价值。
这是我在头盔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'”。要启用内联执行,要么使用哈希('sha256- + 6WnXIl4mbFTCARd8N3COQmT3bJJmo32N8q8ZSQAIcU ='),要么使用随机数(nonce)。
然后单击href链接可获得以下响应: 拒绝运行JavaScript URL,因为它违反了以下内容安全策略指令:“ script-src'self''nonce-a8ff45c6cc9b12df8111202f13d1c000'”。要启用内联执行,需要使用'unsafe-inline'关键字,哈希('sha256 -...')或随机数('nonce -...')。
有什么想法我要去哪里吗?
解决方法
<a href="javascript:history.go(-1);">
是一个javascript导航,它(以及标记中的内联事件处理程序)需要强制性'unsafe-inline',并且不能通过'nonce -value'令牌。
为此目的提供了'unsafe-hashhes'令牌,但它尚未在浏览器中实现,现已实现!请参阅下面的更新。
您只有一种方法-从代码中删除处理程序:
<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 同时支持inline event handlers和inline styles的'unsafe-hashhes'令牌。