在React项目中利用 Symbol 防止 XSS 攻击的小技巧

我们都知道,React 元素是一个 plain object:

js 复制代码
 let el = {
   type: 'marquee',
   props: {
     bgcolor: '#ffa7c4',
     children: 'hi',
   },
   key: null,
   ref: null,
   $$typeof: Symbol.for('react.element'),
 }

如果你的服务器有允许用户存储任意 JSON 对象的漏洞,而前端需要一个字符串,这可能会发生一个问题:导致潜在的安全风险

js 复制代码
 // 服务端允许用户存储 JSON
 let expectedTextButGotJSON = {
   type: 'div',
   props: {
     dangerouslySetInnerHTML: {
       __html: 'dangerous InnerHTML'
     },
   },
   // ...
 };
 let message = { text: expectedTextButGotJSON };

然后在某段 JSX 中使用了它,攻击者就可以运行我们不期望的 html 代码:

js 复制代码
 // React 0.13 中有风险
 <p>
   {message.text}
 </p>

但是 React 在之后的版本中使用了 Symbol 标记 React 元素:

js 复制代码
 let el = {
   type: 'marquee',
   props: {
     bgcolor: '#ffa7c4',
     children: 'hi',
   },
   key: null,
   ref: null,
   $$typeof: Symbol.for('react.element'),
 }

因为 JSON 不支持 Symbol 类型。所以即使服务器存在用 JSON 作为文本返回安全漏洞,JSON 里也不包含 Symbol.for('react.element')。React 会检测 element.$$typeof,如果元素丢失或者无效,会拒绝处理该元素。

相关推荐
helloyangkl40 分钟前
前端——不同环境下配置env
前端·javascript·react.js
竹秋…41 分钟前
webpack搭建react开发环境
前端·react.js·webpack
进阶的鱼2 小时前
关于微前端框架wujie的一次企业级应用实践demo?
前端·vue.js·react.js
凯心2 小时前
React 中没有 v-model,如何优雅地处理表单输入
前端·vue.js·react.js
WYiQIU18 小时前
11月面了7.8家前端岗,兄弟们12月我先躺为敬...
前端·vue.js·react.js·面试·前端框架·飞书
Bigger21 小时前
🎨 用一次就爱上的图标定制体验:CustomIcons 实战
前端·react.js·icon
weixin79893765432...1 天前
React + Fastify + DeepSeek 实现一个简单的对话式 AI 应用
人工智能·react.js·fastify
用户600071819101 天前
【翻译】使用 React 19 操作构建可复用组件
react.js
禁止摆烂_才浅1 天前
Taro 小程序页面返回传参完整示例
react.js·微信小程序·taro
还是大剑师兰特1 天前
React面试题及详细答案150道(51-60)
react.js·react面试题·大剑师