Reactjs 如何将带有文本和链接的变量传递到React元素中
如果我有这样一个React组件:Reactjs 如何将带有文本和链接的变量传递到React元素中,reactjs,hyperlink,xss,Reactjs,Hyperlink,Xss,如果我有这样一个React组件: return ( <p>{obj.text}</p> ) obj = { text: 'This is an example string. I would like a [link here].' } buildLink() { return( <p> {obj.text}. <a href={obj.link}>This is a link</a>
return (
<p>{obj.text}</p>
)
obj = {
text: 'This is an example string. I would like a [link here].'
}
buildLink() {
return(
<p>
{obj.text}. <a href={obj.link}>This is a link</a>
</p>
);
}
render() {
return (this.buildLink());
}
是我使用和传递HTML的唯一途径吗
虽然在这种特殊情况下,这可能不会造成伤害,但随着时间的推移,我可以看到开发人员在obj.text
中引入变量的可能性,用户可能会突然输入恶意代码
有更简洁的解决方案吗?如果你想将某个东西设置为HTML,那么危险的是,HTML就是这样做的方法。如果您正在使用的HTML不是您完全可以控制的东西,而是类似于用户输入的东西,那么您应该始终对其进行解析,以确保它不是恶意的 如果您想创建一个超链接,那么另一种可能是使用一个函数来构建元素并返回该元素。例如:
obj = {
text: 'This is an example string.',
link: 'www.TastyPotatoes.com'
}
渲染函数可以是这样的:
return (
<p>{obj.text}</p>
)
obj = {
text: 'This is an example string. I would like a [link here].'
}
buildLink() {
return(
<p>
{obj.text}. <a href={obj.link}>This is a link</a>
</p>
);
}
render() {
return (this.buildLink());
}
buildLink(){
返回(
{obj.text}。
);
}
render(){
返回(this.buildLink());
}
这样你就不会使用危险的HTML。最后,如果您必须直接将某个内容设置为HTML,请始终首先对其进行解析以确保其安全。如果您希望将某个内容设置为HTML,那么危险的是,HTML是实现此目的的方法。如果您正在使用的HTML不是您完全可以控制的东西,而是类似于用户输入的东西,那么您应该始终对其进行解析,以确保它不是恶意的 如果您想创建一个超链接,那么另一种可能是使用一个函数来构建元素并返回该元素。例如:
obj = {
text: 'This is an example string.',
link: 'www.TastyPotatoes.com'
}
渲染函数可以是这样的:
return (
<p>{obj.text}</p>
)
obj = {
text: 'This is an example string. I would like a [link here].'
}
buildLink() {
return(
<p>
{obj.text}. <a href={obj.link}>This is a link</a>
</p>
);
}
render() {
return (this.buildLink());
}
buildLink(){
返回(
{obj.text}。
);
}
render(){
返回(this.buildLink());
}
这样你就不会使用危险的HTML。最后,如果您必须直接将某些内容设置为HTML,请始终首先对其进行解析以确保其安全。如果您想创建一个专门用于此用例的组件,那么@Jayce444建议的方法是正确的 但如果您想要一种更通用的方法,那么您可以选择像React Linkyfy()这样的库 我在我的一个项目中使用过它,它对我来说非常有用 下面是我正在使用的组件的简单形式
import React, {PropTypes} from 'react';
import Linkify from 'react-linkify';
export default class TextWithLink extends React.Component {
constructor(props) {
super(props);
}
render() {
let text = this.props.text;
if(this.props.showLink) {
text = <Linkify properties={{target: '_blank', rel: "nofollow noopener"}}>{text}</Linkify>
}
return (<div>{text}</div>);
}
}
import React,{PropTypes}来自'React';
从“react Linkify”导入Linkify;
导出默认类TextWithLink扩展React.Component{
建造师(道具){
超级(道具);
}
render(){
让text=this.props.text;
if(this.props.showLink){
text={text}
}
返回({text});
}
}
如果您想为这个用例创建一个组件,那么@Jayce444建议的方法是正确的
但如果您想要一种更通用的方法,那么您可以选择像React Linkyfy()这样的库
我在我的一个项目中使用过它,它对我来说非常有用
下面是我正在使用的组件的简单形式
import React, {PropTypes} from 'react';
import Linkify from 'react-linkify';
export default class TextWithLink extends React.Component {
constructor(props) {
super(props);
}
render() {
let text = this.props.text;
if(this.props.showLink) {
text = <Linkify properties={{target: '_blank', rel: "nofollow noopener"}}>{text}</Linkify>
}
return (<div>{text}</div>);
}
}
import React,{PropTypes}来自'React';
从“react Linkify”导入Linkify;
导出默认类TextWithLink扩展React.Component{
建造师(道具){
超级(道具);
}
render(){
让text=this.props.text;
if(this.props.showLink){
text={text}
}
返回({text});
}
}
Yeah看起来拥有某种基本解析器(有点像你建议的)可能是实现go的唯一途径Yeah看起来拥有某种基本解析器(有点像你建议的)可能是唯一途径