美文网首页
React 虚拟DOM的 $$typeof 属性

React 虚拟DOM的 $$typeof 属性

作者: 隐号骑士 | 来源:发表于2019-11-15 11:22 被阅读0次

研究React虚拟DOM时尝试打印JSX元素,有个属性不太熟悉


capture.png

其它的都可以理解,但是这个 $$typeof 是啥???

在研究了网上的资料后,得出结论,这是用于防止XSS攻击的一种方式。

JSX中插入HTML结构

在传统前端开发中经常使用HTML字符串拼接然后append的方式向页面中引入HTML结构

但这样的写法在React中好像不可以

const html = '<div>123</div>'

function App(props) {
    return (
        <div className="App">
            {html}
        </div>
    );
}
image.png

原因:React等现代前端lib为了防止XSS攻击,对 < > 等符号做了一层转义,称为 escape

如果真的想插入HTML结构而非文本呢?

dangerouslySetInnerHTML

dangerouslySetInnerHTML 是 React 为浏览器 DOM 提供 innerHTML 的替换方案。

const html = '<div>123</div>'

function App(props) {
    return (
        <div
            className="App"
            dangerouslySetInnerHTML={{ __html: html }}
        >
        </div>
    );
}
image.png

风险?

场景:你的服务器存在一个漏洞,使得用户可以存储任意的JSON对象,但客户端却需要一个 string 类型的值。

// 期望该字段为text但是拿到了JSON
let expectedTextButGotJSON = {
  type: 'div',
  props: {
    dangerouslySetInnerHTML: {
      __html: '<img src onerror="alert(document.cookie)"/>'
    },
  },
  // ...
};

// JSX
<p>
  {expectedTextButGotJSON}
</p>

按照Virtual DOM 的渲染机制(学习React VirtualDom),有风险的节点会直接被渲染到DOM树。

$$typeof

React 0.14版本之后,在渲染节点时,新增了一步校验

首先新增一个常量

var REACT_ELEMENT_TYPE =
  (typeof Symbol === 'function' && Symbol.for && Symbol.for('react.element')) ||
  0xeac7;

如果浏览器支持 Symbol:

生成虚拟DOM对象时,自带属性$$typeof : Symbol.for('react.element')

React渲染时,会做校验:

ReactElement.isValidElement = function (object) {
  return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;
};

为什么用 Symbol.for 呢?

1 Symbol属性不可存放于JSON中

2 Symbol('react.element') !== Symbol('react.element') 但 Symbol.for('react.element') === Symbol.for('react.element')

相关文章

  • React 虚拟DOM的 $$typeof 属性

    研究React虚拟DOM时尝试打印JSX元素,有个属性不太熟悉 其它的都可以理解,但是这个 $$typeof 是啥...

  • React之JSX

    什么是JSX React的核心机制之一就是虚拟DOM:可以在内存中创建虚拟的DOM元素。React利用虚拟DOM来...

  • 虚拟DOM/DOM DIFF理解

    因为React、Vue框架的出现,页面渲染采用了更高效的虚拟DOM。 一个dom元素中有许多属性,操作dom是很耗...

  • React 更新机制

    React 的更新流程 React 的渲染流程是: JSX → 虚拟 DOM → 真实 DOM React 的更新...

  • React基础篇之虚拟DOM

    Hello World JS创建虚拟DOM JSX创建虚拟DOM 虚拟DOM与真实DOM 下一篇:React基础篇...

  • React-ref属性使用

    React为我们提供的这个ref属性,可以打破React对虚拟DOM 的限制;对元素真正实例的引用,也就是渲染视图...

  • React element tree 是什么?和 Virtual

    React 术语,React element tree 是什么?和 Virtual DOM(VDOM、虚拟 DOM...

  • React native 常用组件之View

    一、 JSX和组件的概念React的核心机制就是虚拟DOM,可以在内存中创建的虚拟DOM元素,React利用虚拟D...

  • 几种前端框架的选择对比

    react:速度快,虚拟DOM,setState的时候虚拟dom会与实际dom进行比较,有变化再去更新实际dom,...

  • react之虚拟dom和diff算法

    React 虚拟DOM的理解 React框架现在用的人非常多,React为何如此受欢迎?我想原因是引入了虚拟DOM...

网友评论

      本文标题:React 虚拟DOM的 $$typeof 属性

      本文链接:https://www.haomeiwen.com/subject/yapjictx.html