dangerouslySetInnerHTML React 会对默认的数据绑定({})进行自动转义来防止 XSS 攻击,所有数据都会认为是 textContent: 但是为了保障开发的灵活性,它也给我们提供了一些直接渲染 HTML 的方法,比如 dangerouslySetInnerHTML: 在把数据传入 dangerouslySetInnerHTML 之前,一定要确保数据是经过过滤或转义的,比如可以通过 dompurify.sanitize const code = "<input onfocus=alert(1) autofocus />"; return (
='rlayer-msg__group'> { opt.title && <div className='rlayer-msg__title' dangerouslySetInnerHTML <div className='rlayer-msg__content' dangerouslySetInnerHTML={{__html: opt.content}}>
=== 'object' && props.dangerouslySetInnerHTML ! == null && props.dangerouslySetInnerHTML.__html ! = null) ); } type应该表示html里的标签,如<textarea>、<option>、noscript props.children指节点里的内容是否是字符串还是数字 dangerouslySetInnerHTML 即innerHTML,里面内容也是字符串 关于dangerouslySetInnerHTML的介绍与使用,请参考: https://zh-hans.reactjs.org/docs/dom-elements.html #dangerouslysetinnerhtml 也就是说,一旦shouldSetTextContent()判断为true,就确定该节点为文本节点 (4) 如果isDirectTextChild为true
在 React 中可引起漏洞的一些写法 使用 dangerouslySetInnerHTML dangerouslySetInnerHTML 是 React 为浏览器 DOM 提供 innerHTML 通常来讲,使用代码直接设置 HTML 存在风险,因为很容易使用户暴露在 XSS 攻击下,因为当使用 dangerouslySetInnerHTML 时,React 将不会对输入进行任何处理并直接渲染到 HTML 中,如果攻击者在 dangerouslySetInnerHTML 传入了恶意代码,那么浏览器将会运行恶意代码。 看下源码: function getNonChildrenInnerMarkup(props) { const innerHTML = props.dangerouslySetInnerHTML; // 有dangerouslySetInnerHTML属性,会不经转义就渲染__html的内容 if (innerHTML !
js换行符转换html换行 在标签中加入: dangerouslySetInnerHTML={ { __html: 有换行符的数据?. div style={ { float: 'right', width: 316, fontSize: 14 }} dangerouslySetInnerHTML
9、使用
代替回车符↵,并且使用dangerouslySetInnerHTML使 react 的 DOM 元素可以读取字符串中的标签
dangerouslySetInnerHTML相当于 innerHtml let str=comment.split(/\r\n|\r|\n/g).join('
')
<div dangerouslySetInnerHTML={{__html:str}} />
span className="span-list_order">{role.list_order}
> { document.body.appendChild(canvas); }); }; return (
通过谷歌搜索react xss, 发现如下文章 https://www.stackhawk.com/blog/react-xss-guide-examples-and-prevention/ 文章提到dangerouslySetInnerHTML 为危险的功能 直接在js中里面搜索dangerouslySetInnerHTML,可以发现name以危险的方式直接输出到页面 image.png 继续搜索buildItem函数,需要确定具体被调用的位置 name进行结合在一起即可,最后搜索一下bugc即可显示最后效果 image.png 因预输入的原因,网站会将用户输入的东西进行联想并输出到页面,其中包括了名字,而某些的名字带有XSS荷载,正好 是用dangerouslySetInnerHTML
return (
name}; || 比较运算符;左边的值真,返回左边的值,假返回右边的值; 万能的函数表达式: 如果不使用以上的四种表达式,可以使用(function(){})(this) 非 DOM 属性介绍 dangerouslySetInnerHTML 、ref、key dangerouslySetInnerHTML写html代码:在jsx中直接插入html代码; ref:父组件引用子组件; key:提高渲染性能;(使用react diff算法
//https://zh-hans.reactjs.org/docs/dom-elements.html#dangerouslysetinnerhtml else if (propKey voidElementTags[tag]) { //不能包含子标签,报出 error invariant( props.children == null && props.dangerouslySetInnerHTML == null, '%s is a void element tag and must neither have `children` nor ' + 'use `dangerouslySetInnerHTML ', ); invariant( typeof props.dangerouslySetInnerHTML === 'object' && HTML in props.dangerouslySetInnerHTML , '`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. ' + 'Please visit
html字符串解析成真正的html标签 />
dangerouslySetInnerHTML 属性是 React 在浏览器 DOM 中使用 innerHTML 的替代品。 在这个例子中,MyComponent 使用 dangerouslySetInnerHTML 属性来设置 HTML 标记: function createMarkup() { return { __html : 'First · Second' }; } function MyComponent() { return <div dangerouslySetInnerHTML={createMarkup
html字符串解析成真正的html标签 />
当然,React也提供了另一种方式来将用户输入的内容当成html来渲染: <div dangerouslySetInnerHTML={{ __html: message }}>
为了可以插入 html,需要用到 dangerouslySetInnerHTML 这个属性来设置 innerHTML,并通过 onInput 来执行 onChange 回调。 <div ref={this.ref} contentEditable onInput={this.emitEvent} dangerouslySetInnerHTML this.props.onKeyUp || this.emitEvent} onKeyDown={this.props.onKeyDown || this.emitEvent} dangerouslySetInnerHTML this.props.onKeyUp || this.emitEvent, onKeyDown: this.props.onKeyDown || this.emitEvent, dangerouslySetInnerHTML
render () { return ( <div className='editor-wrapper' dangerouslySetInnerHTML
dangerouslySetInnerHTML 接下来,主持人对 dangerouslySetInnerHTML 这个 API 的使用时机提出了疑问。 最后,主持人说他决定雇佣 Dan 了,当他在回答 let vs const、redux、dangerouslySetInnerHTML 的问题时,展现出的思考过程就已经足够打动他了。
React.Component {
render() {
return (