csp 设置 nonce

简单记录一下 需求,严格csp,渲染google地图

1.首先服务端生成nonce值,然后!!需要获取html文件,并且把里面的nonce值替换。 这样客户端style标签里面的内容就可以使用了

google地图就是自己去获取了style标签里面的nonce值!!!!

javascript 复制代码
import express from 'express'
import { fileURLToPath } from 'url'
import { dirname, join } from 'path'
import { randomBytes } from 'crypto'
import fs from 'fs'

// 获取当前文件路径
const __filename = fileURLToPath(import.meta.url)
const __dirname = dirname(__filename)

const app = express()
const PORT = 3000

// 生成 nonce 值
function generateNonce() {
  return randomBytes(16).toString('base64')
}

// 静态文件服务(先于 CSP 中间件)

app.use(
  express.static(join(__dirname, '../dist'), {
    index: false, // 正确禁用自动返回 index.html
  }),
)
// CSP 中间件
app.use((req, res, next) => {
  const nonce = generateNonce()
  res.locals.nonce = nonce

  res.setHeader(
    'Content-Security-Policy',
    `default-src 'self';style-src 'self' 'nonce-${nonce}' https://maps.gstatic.com https://fonts.googleapis.com;font-src 'self' https://fonts.gstatic.com;script-src 'self'  https://www.gstatic.cn/recaptcha/ https://www.gstatic.com/recaptcha/ https://maps.googleapis.com ;img-src 'self' data: https://maps.googleapis.com https://maps.gstatic.com https://*.googleapis.com https://*.gstatic.com *.google.com *.googleusercontent.com;frame-src 'self' ;connect-src 'self' https://maps.googleapis.com;`,
  )
  next()
})

// HTML 路由处理
app.get('*', (req, res) => {
  const nonce = res.locals.nonce
  const htmlPath = join(__dirname, '../dist/index.html')

  try {
    let html = fs.readFileSync(htmlPath, 'utf8')

    // 调试:检查替换前内容
    console.log('替换前是否包含 csp_nonce:', html.includes('csp_nonce'))

    // 多种替换方式确保覆盖
    html = html
      .replace(/nonce="[^"]*"/g, `nonce="${nonce}"`) // 替换所有现有 nonce
      .replace(/__CSP_NONCE__/g, nonce) // 备用占位符格式

    // 调试:检查替换结果
    console.log('替换后 nonce 值:', html.match(/nonce="([^"]*)"/)?.[1])

    res.send(html)
  } catch (err) {
    console.error('读取 HTML 文件失败:', err)
    res.status(500).send('Server Error')
  }
})

app.listen(PORT, () => {
  console.log(`Server running on http://localhost:${PORT}`)
})

vue-html文件设置一个style标签,让服务器端去替换

google 地图自己会去找到并动态生成style标签,就不会行内样式报错啦!

相关推荐
锋行天下1 小时前
DeepSeek写Langgraph就是个大傻逼,一本正经胡说八道
前端·人工智能·后端
jktantan1 小时前
每个节点 41 字节:把一棵百万节点树拆进 14 个 typed array
前端·javascript·vue.js·算法·typescript
计算机魔术师1 小时前
Anthropic官方插件被「寄生」,背后是同一类攻击又来了
前端
我命由我123452 小时前
访客系统形式(有用户概念、无用户概念)
java·开发语言·前端·javascript·python·产品运营·产品经理
key_3_feng2 小时前
评估与对齐:Agent 自我进化的护栏
前端·数据库·agent
LaughingZhu3 小时前
Product Hunt 热榜 2026-10-30:Empacer、Scape、Floot in ChatGPT
java·前端·数据库·人工智能·chatgpt·notion
Lank_M3 小时前
抠图结果缩放后边缘发脏,该怪的不是插值
前端
jerrywus3 小时前
Skill、MCP、Workflow、Rules、Memory 有什么区别?拿几次真实开发任务讲清楚
前端·agent·claude
补码缩写3 小时前
canvas 与 sharp 缩放透明图:默认预乘,非预乘得拆通道
前端
静默回滚3 小时前
抠图 PNG 缩小再放大,边缘又糊又白是两件事
前端