- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
用户正在向我们的 React 应用程序提供一个字符串,并且它正在显示给其他用户。我想搜索一些字符,并用一些 HTML 替换它们,就像我要搜索“特殊”这个词一样,我会将其变成:
My <span class="special-formatting">special</span> word in a user string
之前我执行此替换,然后使用angerlySetInnerHTML 将结果插入到DOM 中。这当然给我带来了一个问题,即用户能够直接在应用程序中输入他们喜欢的任何 HTML/Javascript 并将其呈现给每个人都可以看到。
我尝试将 HTML 字符转义为其实体,但危险的SetInnerHTML 似乎正确渲染了 HTML 实体,而不是实际的字符串。 (编辑:见下文,这是实际的解决方案)
有没有办法将他们的消息转换为纯字符串,仍然保留这些特殊字符的显示,但也将我自己的 HTML 插入到字符串中?尝试避免在将每个字符串插入 DOM 后运行脚本。
<小时/>以下是有关当前流程的更多信息。所有示例都经过相当优化,仅显示相关代码。
使用此函数将用户文本提交到数据库:
handleSubmit(event) {
event.preventDefault();
var messageText = this.state.messageValue;
//bold font is missing some common characters, fake way of making the normal font look bold
if (this.state.bold == true) {
messageText = messageText.replace(/\'/g, "<span class='bold-apostrophe'>'</span>");
messageText = messageText.replace(/\"/g, "<span class='bold-quote'>"</span>");
messageText = messageText.replace(/\?/g, "<span class='bold-question'>?</span>");
messageText = messageText.replace(/\*/g, "<span class='bold-asterisk'>*</span>");
messageText = messageText.replace(/\+/g, "<span class='bold-plus'>+</span>");
messageText = messageText.replace(/\./g, "<span class='bold-period'>.</span>");
messageText = messageText.replace(/\,/g, "<span class='bold-comma'>,</span>");
}
Messages.insert({
text: messageText,
createdAt: new Date(),
userId: user._id,
bold: this.state.bold,
});
}
因此,我的替换没有出现任何问题,但是此时,messageText 字符串仍可能包含不需要的用户输入 HTML 代码。
然后,我们的带有消息列表的主应用程序尝试呈现所有用户消息:
render() {
return (
<div ref="messagesList">
{this.renderMessages()}
</div>
);
}
renderMessages() {
return [].concat(this.props.messages).reverse().map((message) => {
return <Message
key={message._id}
message={message} />;
}
});
}
在 Message.jsx 中,我对消息字符串进行最后的修改(我不想将某些更改保存到消息数据库中)并将其插入要返回的元素中:
export default class Message extends React.Component {
render() {
var processedMessageText = this.props.message.text;
//another find and replace to insert images for :image_name: strings, similar to how Discord inputs its emoji
processedMessageText = processedMessageText.replace(/:([\w]+):/g, function (text) {
text = text.replace(/:/g, "");
if (text.indexOf("_s") !== -1) {
text = text.replace(/_s/g, "");
text = "<img class='small-smiley' src='/smileys/small/" + text + ".png'>";
return text;
}
else {
text = "<img class='smiley' src='/smileys/" + text + ".png'>";
return text;
}
});
return (
<div>
<div className='username'>{this.props.message.username}: </div>
<div className='text' dangerouslySetInnerHTML={{ __html: processedMessageText }}></div>
</div>
);
}
}
同样,如果用户在输入字符串中包含恶意 HTML,它将遍历所有这些并将输出输出到消息列表,这非常糟糕。我希望有某种方法可以将这些所需的 HTML 插入到他们的字符串中,同时也不将他们可能输入的 HTML 呈现为实际的 HTML。我还想显示 HTML 中常用的字符,例如尖括号 (<>),因此我想避免彻底删除输入字符串中的常见 HTML 字符。
<小时/>由于接受的答案没有太多细节,我将在这里发布我最终所做的事情。我对 OWASP 建议的字符进行 HTML 编码在添加我自己的 HTML 并将其呈现为 HTML 元素的内容之前。我想避免使用另一个库,所以我这样做了:
messageText = messageText.replace(/\&/g, "&");
messageText = messageText.replace(/</g, "<");
messageText = messageText.replace(/>/g, ">");
messageText = messageText.replace(/\//g, "/");
messageText = messageText.replace(/\'/g, "'");
messageText = messageText.replace(/\"/g, """);
这样做后,我无法再插入任何恶意内容,并且使用 OWASP 中的各种测试字符串进行测试,没有出现任何问题。
最佳答案
当您在将用户的输入文本保存到数据库之前将 HTML 注入(inject)其中时,问题就出现了。这让事情变得很困难,因为现在你必须对其进行 sanitizer ,但不需要那么多。
作为补救措施,您可以使用 dompurify或sanitize-html删除除您注入(inject)的 html 之外的任何 html。这是使用 dompurify 的示例:
import DOMPurify from "dompurify";
const dangerousString =
"<img onError='alert(\"h4ck3r\")' src='will throw error' /><span class='bold-apostrophe'>'</span>";
<div
dangerouslySetInnerHTML={{
__html: DOMPurify.sanitize(dangerousString, {
ALLOWED_TAGS: ["span"],
ALLOWED_ATTR: ["class"]
})
}}
/>
Ferrybig
提出的解决方案,用于动态添加特殊格式,而不是 dangerouslySetInnerHTML
。关于javascript - 将 HTML 插入用户字符串并在 React 中渲染(并避免 XSS 威胁),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58479405/
问题是,当用户回复彼此的帖子时,我必须这样做: margin-left:40px; 对于 1 级深度 react margin-left:80px; 对于 2 层深等 但是我想让 react div
我试图弄清楚如何将 React Router 与 React VR 连接起来。 首先,我应该使用 react-router dom/native ?目前尚不清楚,因为 React VR 构建在 Rea
我是 React 或一般编码背景的新手。我不确定这些陈述之间有什么区别 import * as react from 'react' 和 import react from 'react' 提前致谢!
我正在使用最新的稳定版本的 react、react-native、react-test-renderer、react-dom。 然而,react-native 依赖于 react@16.0.0-alp
是否 react 原生 应用程序开发可以通过软件架构实现,例如 MVC、MVP、MVVM ? 谢谢你。 最佳答案 是的。 React Native 只是你提到的那些软件设计模式中的“V”。如果你考虑其
您好我正在尝试在我的导航器右按钮中绑定(bind)一个功能, 但它给出了错误。 这是我的代码: import React, { Component } from 'react'; import Ico
我使用react native创建了一个应用程序,我正在尝试生成apk。在http://facebook.github.io/react-native/docs/signed-apk-android.
1 [我尝试将分页的 z-index 更改为 0,但没有成功] 这是我的codesandbox的链接:请检查最后一个选择下拉列表,它位于分页后面。 https://codesandbox.io/s/j
我注意到 React 可以这样导入: import * as React from 'react'; ...或者像这样: import React from 'react'; 第一个导入 react
我是 react-native 的新手。我正在使用 React Native Paper 为所有屏幕提供主题。我也在使用 react 导航堆栈导航器和抽屉导航器。首先,对于导航,论文主题在导航组件中不
我有一个使用 Ignite CLI 创建的 React Native 应用程序.我正在尝试将 TabNavigator 与 React Navigation 结合使用,但我似乎无法弄清楚如何将数据从一
我正在尝试在我的 React 应用程序中进行快照测试。我已经在使用 react-testing-library 进行一般的单元测试。然而,对于快照测试,我在网上看到了不同的方法,要么使用 react-
我正在使用 react-native 构建跨平台 native 应用程序,并使用 react-navigation 在屏幕之间导航和使用 redux 管理导航状态。当我嵌套导航器时会出现问题。 例如,
由于分页和 React Native Navigation,我面临着一种复杂的问题。 单击具有类别列表的抽屉,它们都将转到屏幕 问题陈述: 当我随机点击类别时,一切正常。但是,在分页过程中遇到问题。假
这是我的抽屉导航: const DashboardStack = StackNavigator({ Dashboard: { screen: Dashboard
尝试构建 react-native android 应用程序但出现以下错误 info Running jetifier to migrate libraries to AndroidX. You ca
我目前正在一个应用程序中实现 React Router v.4,我也在其中使用 Webpack 进行捆绑。在我的 webpack 配置中,我将 React、ReactDOM 和 React-route
我正在使用 React.children 渲染一些带有 react router 的子路由(对于某个主路由下的所有子路由。 这对我来说一直很好,但是我之前正在解构传递给 children 的 Prop
当我运行 React 应用程序时,它显示 export 'React'(导入为 'React')在 'react' 中找不到。所有页面错误 see image here . 最佳答案 根据图像中的错误
当我使用这个例子在我的应用程序上实现 Image-slider 时,我遇到了这个错误。 import React,{Component} from 'react' import {View,T
我是一名优秀的程序员,十分优秀!