图片来源于互联网

当在控制台打印一个 React 组件的时候,能看出组件就是一个对象,也可以说是虚拟 dom,这个对象上面包含了所需要渲染的 dom 节点的标签名称、属性、子节点等信息。同时也有一个 $$typeof 的属性。

$$typeof 是如何添加在 React 对象上的

jsx 语法在被 babel 解析的时候调用 React.createElement 方法,那么我们看一下 createElement 方法的实现

export function createElement(type, config, children) {...return ReactElement(type,key,ref,self,source,ReactCurrentOwner.current,props,)
}
复制代码

createElement 方法返回了 ReactElement 方法的执行结果,那么看一下 ReactElement 方法的实现

const ReactElement = function(type, key, ref, self, source, owner, props) {const element = {$$typeof: REACT_ELEMENT_TYPE,type: type,key: key,ref: ref,props: props,_owner: owner,}...return element;
}
复制代码

从上面的代码中可以看到 $$typeof 属性就是在 ReactElement 方法中添加到 React 对象上的。其值为变量 REACT_ELEMENT_TYPE。

变量 REACT_ELEMENT_TYPE 是如何定义的

在 ReactSymbols.js 文件中可以看到变量 REACT_ELEMENT_TYPE 的定义

const hasSymbol = typeof Symbol === 'function' && Symbol.for;export const REACT_ELEMENT_TYPE = hasSymbol? Symbol.for('react.element'): 0xeac7;...
复制代码

如果当前浏览器支持 Symbol 则 REACT_ELEMENT_TYPE 为 Symbol 类型的变量,否则为 16 进制的数字。

添加 $$typeof 的意义

为了安全

假如前端期望从接口中获取一个字符串渲染在页面中

...render() {<div>{serverData.text}</div>
}
复制代码

然而由于服务端在数据入库时存在漏洞,有用户恶意存入了这样的数据

const text = {key: nulltype: 'script',props: {src: 'http://...'},
}
复制代码

如果这条数据被成功渲染,那么就是一个存在风险的第三方 script 标签入侵到了当前用户的页面,它能做什么完全取决于它想做什么,比如获取并发送用户的 cookie、localStorage,比较可爱的情况是给用户的页面上弹十万个弹窗。

为了防止这种情况的发生,React 0.14 版本加入了 $$typeof

数据库是无法存储 Symbol 类型数据的,所以用户恶意存入的数据是无法带有合法的 $$typeof 字段的。

当 React 在渲染的时候加上对 $$typeof 合法性的验证即可防止恶意代码的插入。低版本不支持 Symbol 的浏览器是没有这个安全特性的。

转载于:https://juejin.im/post/5cecf286f265da1b83336dbe

最新文章

  1. 2021年大数据ZooKeeper(五):ZooKeeper Java API操作
  2. 使用NetBeans IDE开发C程序
  3. java回顾之继承 二
  4. c语言解逻辑问题的一般步骤,C语言面试题---逻辑短路问题
  5. python programming training(二): 排序算法
  6. 53 MM配置-评估和科目设置-定义评估控制
  7. Bootstrapbutton组
  8. HttpReponse
  9. Spring定时任务@Scheduled提前一秒执行
  10. 淘宝api 处理对象和数组用到的自定义函数 以及 开发能用到的方法
  11. QtcpSocket readyRead 粘包解法
  12. mybaties学习笔记
  13. iOS视频播放全屏效果实现
  14. Java高级程序员必备:高性能计数器及Striped64和LongAdder
  15. 单个正态总体均值的置信区间
  16. [校内自测] Incr (LIS+智商)
  17. Java · 认识 String 类(上)· 创建字符串 · 字符串比较相等 · 字符串常量池 · 字符串不可变 · 字符字节与字符串
  18. 超700名研究生被清退,硕博生毕业,更难了
  19. Edge浏览器打开新建标签页速度很慢?如何解决?
  20. 练习6-11 城市:创建一个名为 cities 的字典,其中将三个城市名用作键;对于每座城市,都创建一个字典,并在其中包含该城市所属的国家、人口约数以及一个有关该城市的事实。在表示每座城市的字典中,应

热门文章

  1. 使用links方式安装eclipse插件
  2. 系统服务器端口怎么关闭了,如何关闭云服务器端口号
  3. 正则表达式(RegularExpression)
  4. MobPush精准把握用户的使用时间
  5. 使用ionic cordova build android --release --prod命令打包报错解决方法
  6. JauntVR中文版登陆小米商店,首波内容有《五十度黑》
  7. Linux系统管理基本操作
  8. [Python]架设python虚拟环境以及部署PythonWeb服务
  9. 启用邮箱提示访问特权不够
  10. 引用和const 引用的区别(转自chinaitlab)