首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SvelteKit异步加载风格的严格CSP (无不安全内联) %sveltekit.nonce%?

SvelteKit异步加载风格的严格CSP (无不安全内联) %sveltekit.nonce%?
EN

Stack Overflow用户
提问于 2022-07-07 17:32:03
回答 2查看 255关注 0票数 1

当使用没有SvelteKit app.html的严格内容安全策略时,可以在unsafe-inline中异步加载样式吗?

假设我使用了一个script-src: 'self'指令,并且我想用该模式异步加载一些样式

代码语言:javascript
复制
<link rel="preload" as="style" href="/styles.css" onload="this.rel='stylesheet'" />

这将产生一个错误。

拒绝执行内联事件处理程序,因为它违反了以下内容安全策略指令:"script-src 'self‘sha256-.’

我的第一个想法是以某种方式抓住它,然后注入它,但是:

  • %sveltekit.nonce%无文件
  • nonce是一个脚本标记属性

似乎我应该在没有onload的情况下重写onload标记,然后分别设置事件侦听器。但当我用一个

代码语言:javascript
复制
<script nonce="%sveltekit.nonce%">console.log("hello")</script>

生成时出现以下错误

如果页面模板包含%sveltekit.nonce%,则无法使用预录制

这是可能的,还是因为我在app.html,这是一种边缘情况?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-08 10:16:52

在我的例子中,由于脚本不会改变,我可以使用散列来白名单它。

所以最后我可以让它像这样工作:

  • onload标记中删除link属性:
代码语言:javascript
复制
<link id="styles" rel="preload" as="style" href="/styles.css" />
  • load侦听器放在app.html中的script标记中
代码语言:javascript
复制
<script>
const styles = document.getElementById('styles');
window.addEventListener('load', (e) => {
    styles.setAttribute('rel', 'stylesheet');
});
</script>
  • 生成上述脚本的散列,例如使用这个工具,并将其添加到白名单中:
代码语言:javascript
复制
kit: {
    ...,
    csp: {
      mode: "auto",
      directives: {
        "script-src": [
          "self",
          "sha256-...",
        ],
      },
    },
  },

这样我就可以获得异步加载的速度和csp的安全性的好处。

票数 1
EN

Stack Overflow用户

发布于 2022-07-08 04:16:49

您有一个内联事件处理程序

代码语言:javascript
复制
onload="this.rel='stylesheet'"

您应该在一个单独的.js文件中用事件侦听器重写它。否则,您将不得不在script-src中添加“不安全-内联”。您也可能允许使用“不安全散列”和散列,但还不是所有浏览器都支持“不安全散列”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72902080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档