サーバーからAPIを使用してテキストを出力しています。コンテンツの入力を容易にするためのHTMLフィールドを持つ管理者がいます。ここで問題が発生し、テキストがHTMLコードで表示されるようになりました。あの不要なhtmlコードを取り除く方法。 HTMLエンティティデコードを使用する必要があると思いますか?それを反応プロジェクトにどのように実装しますか?以下のテキストは、テキストとhtmlコードだけではないことを示しています。
export class FullInfoMedia extends React.Component {
render() {
const renderHTML = (escapedHTML: string) => React.createElement("div", { dangerouslySetInnerHTML: { __html: escapedHTML } });
return (
<div>
<div className="about-title">
<div className="container">
<div className="row">
<img className="center-block" src={this.props.about.image}/>
<h2>{this.props.about.title}</h2>
{renderHTML(<p>{this.props.about.body}</p>)}
</div>
</div>
</div>
</div>
);
}
}
dangerouslySetInnerHTML
を使用できますが、ユーザーではなく入力のみをレンダリングするようにしてください。 XSSに最適な方法です。
使用例:
const renderHTML = (rawHTML: string) => React.createElement("div", { dangerouslySetInnerHTML: { __html: rawHTML } });
そしてコンポーネントで:
{renderHTML("<p>&nbsp;</p>")}
dangerouslySetInnerHTML
を使用することはできますが、それは実際には良い習慣ではありません。 Marek Dorda で述べられているように、アプリのXSSを脆弱にするのは素晴らしいことです。
より良い解決策は、he
ライブラリを使用することです。 https://github.com/mathiasbynens/he
これは、コンポーネントがどのように見えるかを示す例になります。
import he from 'he'
export class FullInfoMedia extends React.Component {
render() {
const renderHTML = (escapedHTML: string) => React.createElement("div", { dangerouslySetInnerHTML: { __html: escapedHTML } });
return (
<div>
<div className="about-title">
<div className="container">
<div className="row">
<img className="center-block" src={this.props.about.image}/>
<h2>{this.props.about.title}</h2>
{ he.decode(this.props.about.body) }
</div>
</div>
</div>
</div>
);
}
}
また、コードベースの場合は、デコードをAPI呼び出しに移動する可能性が高く、コンポーネントでは、ストアから取得した値を消費するだけです。