CSS样式中的expression()如何绕过事件属性过滤导致XSS? 打工人尚勤 提问于 2026-02-12 21:11:25 阅读 19 安全 我在开发评论系统时发现,即使过滤了所有on开头的事件属性,用户提交的CSS代码还是能触发XSS。比如有人写了个这样的样式: div { width: expression(alert('XSS')); } 测试时发现这段代码在兼容模式下会弹出窗口。之前都是直接过滤onerror/onload等属性,但expression()这种CSS表达式完全没考虑到。现在该怎么修改过滤规则才能同时拦截事件属性和这种危险的CSS特性呢? XSS防护输入过滤 我来解答 赞 4 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 2 条解答 程序员朝炜 Lv1 这个问题确实挺棘手的,我之前也碰到过类似的场景。expression() 是 IE 时代的一个老旧特性,虽然现代浏览器基本都废弃了它,但如果你的系统需要兼容旧版 IE,那就得特别小心。 要解决这个问题,我的建议是直接禁用 expression 这个关键字。你可以在过滤规则里加上对它的检测,比如在处理用户提交的 CSS 时,检查是否存在类似 expression 的字符串。如果发现就直接拒绝保存或者移除相关代码。 具体实现的话,可以写一个正则表达式来匹配 expression 和它的内容。比如这样: function sanitizeCss(css) { // 匹配 expression(...) 并移除 return css.replace(/expressions*(.*?)/gi, ''); } 这个函数会找到所有形如 expression(...) 的内容并把它清空。不过要注意,正则表达式虽然能解决大部分情况,但它不是万能的。如果你的系统允许更复杂的 CSS 输入,最好还是结合专门的 CSS 解析库来做进一步的安全处理。 另外,我还建议你在服务端和客户端同时做校验。服务端用来拦截恶意输入,客户端用来实时提醒用户哪些内容不被允许。双重保险总归更靠谱一些。 最后再说一句,其实最好的办法是完全禁止用户提交自定义 CSS。如果你的需求允许,可以改成让用户选择预定义的样式模板,这样既安全又省心。毕竟,开放 CSS 输入的风险实在太大了,防不胜防啊! 回复 点赞 1 2026-02-18 16:17 极客慧利 Lv1 expression() 是 IE 特有的 CSS 表达式功能,能在样式里执行 JS,确实是个经典的 XSS 向量。你只过滤 on 开头的事件属性是不够的,因为这玩意根本不在 HTML 属性里触发,而是藏在 CSS 里面。 要彻底堵住,得从两头下手:一是输入时过滤或移除 expression,二是避免使用不安全的内联样式处理。 最直接的办法是在过滤 CSS 时正则干掉 expression(不区分大小写): cssText = cssText.replace(/expressions*([^)]*)/gi, ''); 但注意别漏了换行或空格绕过的情况,比如 expre ssion(alert()) 这种拆分写法。建议先压缩空白再匹配: cssText = cssText.replace(/s+/g, ' ').replace(/expressions*(.*?)/gi, ''); 更稳一点的做法是直接禁止用户提交完整 CSS,改用白名单字段控制样式,比如只允许 { color: #xxx } 这种基础属性。 另外别忘了 -moz-binding、behavior:url() 这些也能触发 XSS,一并过滤掉。 最后建议把 user-content 的 style 标签全干掉,或者用 CSP 做兜底,style-src 'unsafe-inline' 能不用就别用。这波优化一下,基本就能封死了。 回复 点赞 2 2026-02-12 21:12 加载更多 相关推荐 2 回答 34 浏览 设置了X-XSS-Protection后CSS样式被过滤导致页面错乱怎么办? 我在开发页面时启用了X-XSS-Protection: 1; mode=block头,但发现动态生成的用户提交内容里的CSS样式被过滤了。比如用户输入的标签带内联样式时,浏览器直接移除了style属性... 程序员亚美 安全 2026-01-29 16:50:32 1 回答 34 浏览 Taro页面跳转后样式被重置,如何保持原页面CSS? 在Taro项目里用了navigator标签跳转页面,发现目标页面的CSS样式全被重置了。比如这个按钮样式: .button { background: linear-gradient(to right... 轩辕文茹 框架 2026-02-06 16:52:33 1 回答 44 浏览 Material-UI按钮样式覆盖不了自定义的CSS如何解决? 我在用Vue和Material-UI做按钮组件时遇到问题,想给按钮加个悬停效果,但自定义的CSS样式完全没生效... 代码是这样的: 点击我 .custom-btn { background: #4C... IT人凡敬 组件 2026-01-28 11:07:26 1 回答 91 浏览 前端应急响应时如何快速定位XSS漏洞的攻击入口? 最近在处理一个紧急安全事件,发现有人利用表单提交功能注入了XSS脚本。我们用了OWASP ZAP扫描,但始终找不到具体漏洞点。前端代码里有个动态渲染的评论区,像这样: <div id="comm... 慕容昕彤 安全 2026-02-19 09:06:33 1 回答 27 浏览 合并CSS后部分页面样式错乱怎么办? 我在合并项目中的两个CSS文件时,发现登录页的按钮样式突然变成默认样式了。之前分别引入时没问题,合并后其他页面正常,就登录页出问题。试过调整合并顺序、检查选择器权重,都没解决。 合并前的HTML是这样... 琪帆酱~ 优化 2026-02-18 15:53:26 1 回答 15 浏览 启用HTTPS后CSS样式加载失败怎么办? 我最近给项目配置了HTTPS,但页面样式突然全乱了。检查发现CSS文件加载失败,控制台提示“Mixed Content错误”。我用了绝对路径引用CSS: /* style.css */ body { ... シ静静 前端 2026-02-18 12:05:25 2 回答 10 浏览 使用cssnano压缩后样式错乱,如何排查配置问题? 我在项目里用PostCSS配合cssnano压缩CSS时,压缩后的文件导致按钮hover效果消失了。尝试过把preset设为"default"和"advanced"都没解决,控制台没报错但样式就是不对... UX-巧丽 工具 2026-02-16 23:19:25 2 回答 11 浏览 VSCode Live Share共享CSS时同事端样式不生效怎么办? 今天用Live Share和同事协作时,我写了一段CSS边框样式,自己这边正常显示,但他那边完全没效果。试过清除缓存、检查文件路径都没用,控制台还报了一个404错误。 这是我的CSS代码: .butt... Designer°自娴 工具 2026-02-15 20:18:24 1 回答 18 浏览 Postman发送JSON请求包含CSS样式字符串时返回400错误怎么办? 我在Postman里测试API时,发送POST请求的JSON数据里有一个字段需要包含CSS样式字符串,比如: body { background-color: #f0f0f0; font-family... 闲人俊蓓 前端 2026-02-14 20:28:06 1 回答 41 浏览 HTTPS启用后CSS样式失效,服务器返回403错误怎么办? 我最近给网站配置了HTTPS,但发现CSS样式加载失败了。浏览器控制台提示: GET https://example.com/styles/main.css net::ERR_ABORTED 403 ... IT人俊凤 前端 2026-02-14 12:55:28
expression()是 IE 时代的一个老旧特性,虽然现代浏览器基本都废弃了它,但如果你的系统需要兼容旧版 IE,那就得特别小心。要解决这个问题,我的建议是直接禁用
expression这个关键字。你可以在过滤规则里加上对它的检测,比如在处理用户提交的 CSS 时,检查是否存在类似expression的字符串。如果发现就直接拒绝保存或者移除相关代码。具体实现的话,可以写一个正则表达式来匹配
expression和它的内容。比如这样:这个函数会找到所有形如
expression(...)的内容并把它清空。不过要注意,正则表达式虽然能解决大部分情况,但它不是万能的。如果你的系统允许更复杂的 CSS 输入,最好还是结合专门的 CSS 解析库来做进一步的安全处理。另外,我还建议你在服务端和客户端同时做校验。服务端用来拦截恶意输入,客户端用来实时提醒用户哪些内容不被允许。双重保险总归更靠谱一些。
最后再说一句,其实最好的办法是完全禁止用户提交自定义 CSS。如果你的需求允许,可以改成让用户选择预定义的样式模板,这样既安全又省心。毕竟,开放 CSS 输入的风险实在太大了,防不胜防啊!
要彻底堵住,得从两头下手:一是输入时过滤或移除 expression,二是避免使用不安全的内联样式处理。
最直接的办法是在过滤 CSS 时正则干掉 expression(不区分大小写):
但注意别漏了换行或空格绕过的情况,比如 expre ssion(alert()) 这种拆分写法。建议先压缩空白再匹配:
更稳一点的做法是直接禁止用户提交完整 CSS,改用白名单字段控制样式,比如只允许 { color: #xxx } 这种基础属性。
另外别忘了 -moz-binding、behavior:url() 这些也能触发 XSS,一并过滤掉。
最后建议把 user-content 的 style 标签全干掉,或者用 CSP 做兜底,style-src 'unsafe-inline' 能不用就别用。这波优化一下,基本就能封死了。