当我使用随机数时,为什么我的CSP不能在nunjucks中阻止我的javascript代码

问题描述

我试图让用户在找不到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 handlersinline styles的'unsafe-hashhes'令牌。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...