【问题标题】:NextJS Content Security Policy (CSP)NextJS 内容安全策略 (CSP)
【发布时间】:2021-12-26 06:59:02
【问题描述】:

我目前正在为使用 Next.js 制作的生产应用程序制定内容安全策略 (CSP)。虽然我找到了使用该框架实现 CSP 的可靠文档,但我希望确保正确解决几个问题。

问题 #1: 我已经读到 HTTP 标头中设置的安全策略更可取。但是,我找不到使用这种方法在生产中为内联样式传递“nonce”属性的方法。 https://nextjs.org/docs/advanced-features/security-headers

问题 #2: 我见过其他示例,其中开发人员将 CSP 注入自定义文档(“./pages/_document.js”)。我对使用这种方法犹豫不决,因为我听说元标记 CSP 很容易绕过。 https://github.com/vercel/next.js/tree/canary/examples/with-strict-csp

我的问题:

  1. 有没有办法在“next.config.js”中使用带有标头配置的“nonce”?如果有,怎么做?
  2. 如果 Next.js 自动清理用户输入,是否为生产中的样式指定“unsafe-inline”是否存在安全问题?我还应该提到,我还清理了我的 API 中的所有 mongo 数据库查询。
  3. 问题 #2 中描述的元标记方法是否与 HTTP 标头方法一样安全?
  4. 您建议我采取什么方法来使我的 CSP 对于我的网络应用程序尽可能强大?

一切顺利, -山姆

【问题讨论】:

    标签: next.js xss content-security-policy


    【解决方案1】:

    NextJS 有两种预渲染模式:静态站点生成(SSG)和服务器端渲染(SSR)。第一个无法更新 HTML 代码中的 nonce='value',但是当 SSG 时,您可以使用 ./pages/_document.tsx 为内联样式和脚本传递 'nonce' 属性。

    查看example for CSP headermeta tag CSP example

    关于问题

    1. 我认为使用next.config.js 是可能的,例如next-safe 包在这个文件中添加了一个nextSafe() 函数来设置很多标题:

    .

    const nextSafe = require('next-safe')
    const isDev = process.env.NODE_ENV !== 'production'
    module.exports = {
      async headers () {
        return [
        {
          source: '/:path*',
          headers: nextSafe({ isDev }),
        },
          ]
      },
    }
    

    要将“nonce”设置为 CSP 标头,您可以通过这种方式制作自己的函数。要将“nonce”属性设置为样式,您可以使用 _document.tsx 渲染器。

    1. 在生产环境中为 styles 指定 'unsafe-inline' 不是安全问题。例如https://accounts.google.com 页面允许内联样式(它甚至没有style-src/default-src 指令,但它仔细控制脚本)。

    2. 在 HTTP 标头中设置 CSP 是可取的,但这并不意味着元标记中的 CSP 很容易被绕过。只是元标记中的 CSP 有一些 restrictions,如果您不使用受限制的功能,您可以安全地使用元标记来传递 CSP。

    3. 您可以无限期地加强保护,花费大量时间和资源。只需遵循主要原则“保护不应该比受保护对象更昂贵”

    【讨论】:

    • 感谢您的回复。我应该提到我正在使用“next-secure-headers”。我不清楚你对我的第一个问题的回答。你说,“要在 CSP 标头中设置‘nonce’,你可以用这种方式制作你自己的函数。”您是说可以通过“_document.tsx”中可访问的“next.config.js”传递函数吗?另外,我知道“不安全内联”不像脚本那样是安全问题。但是,我想确保任何人都不可能将自己的 CSS 注入页面。使用 Next.js 指定“unsafe-inline”是否会使我容易受到此攻击?
    • (1) 我想说next.config.js 看起来可以从全局命名空间调用函数。在这种情况下,此函数将有权访问 'nonce' 值。您可以在next-safe 包代码中查看它。 (2) 当然,style-src 中的'unsafe-inline' 在技术上允许注入内联 CSS。但是如果没有脚本注入,基于 CSS 的无脚本 XSS 的圈子就很窄了。因此,更多地关注脚本而不是样式。
    • 我会试一试,让你知道它是怎么回事。再次感谢您。
    • 我可以看到你可以在“nextSafe”函数中添加一个“nonce”值。但是,由于控制台中存在违规错误,因此似乎没有任何 html 元素接收到 nonce。您愿意向我展示一些示例代码,展示您如何将它们组合在一起吗?非常感谢。
    • 官方代码示例的链接在答案中:example for CSP headermeta tag CSP example。你读过这些吗?
    猜你喜欢
    • 2023-01-07
    • 2016-03-25
    • 2013-10-09
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多