icon

Blog

Blog

普通のブログです

thumbNail
Reactで文字列のhtml(UGCなど)をいい感じに扱う
React

2025-06-10

ブログつくるときにちょうどよかったやつです.このブログにも採用しています.※このブログのコードはここにあります概要ユーザがエディタなどで作成したHTMLを画面上に表示することを考えます.入力として,文字列としてのHTMLがstring型で与えられて,それをパースして表示することを考えます.イメージとしては,次のようなコードです.const userContents = () => { const html = "<h1>Hello World</h1><p>こんにちは</p>" return <div> {/* ここにhtmlを展開 */}<div> } いちばん危険で簡単な方法は,divタグ内でdangerouslySetInnerHTMLを用いて,htmlを表示することですが,XSS攻撃のリスクがあり,使うべきではありません.特にUGC(User Generated Content)に対しては,ユーザが入力したコンテンツに対するサニタイズ(無毒化)処理は必須です.実装安全にユーザが入力したHTMLを表示する際は,次の手順を踏みます.ユーザが入力したHTMLをサニタイズ(無毒化)サニタイズしたHTMLをReactで表示(Optional)スタイルを整えるユーザが入力したHTMLをサニタイズサニタイズにはDOMPurifyが利用できます.利用例としては次のとおりです.const sanitizedHtml = DOMPurify.sanitize(html);サニタイズしたHTMLをReactで表示Reactで表示する場合は,先述したdangerouslySetInnerHTMLを利用することができます.なお,必ずサニタイズしていることを確認する必要があります.const userContents = () => { const dangerousHtml = "<h1>Hello World</h1><p>こんにちは</p>" const sanitizedHtml = DOMPurify.sanitize(dangerousHtml); const markup = { __html: sanitizedHtml } return <div dangerouslySetInnerHTML={markup}><div> }もし,dangerouslySetInnerHTMLを利用することに抵抗がある場合は,html-react-parserがおすすめです.html-react-parserを用いると次のように書けます.import DOMPurify from "isomorphic-dompurify"; import parse from "html-react-parser"; function contentsElem() { const dangerousHtml = "<h1>Hello World</h1><p>こんにちは</p>"   const sanitizedHtml = DOMPurify.sanitize(dangeroushtml);   return parse(sanitizedHtml); } const userContents = () => { return <div>{contentsElem}<div> }(Optional) スタイルを整えるtailwindCSSを利用している場合,h1タグやpタグのサイズがだいたい同じくらいのサイズになり,あまりいい感じじゃないです.taiwindlabs/tailwindcss-typographyを利用すると,このへんのデザインがいい感じになります.tailwindCSSはclassNameにclassを書き込むことでスタイルが適用できます.tailwindcss-typographyの恩恵を受ける際はproseクラスを付与します.import DOMPurify from "isomorphic-dompurify"; import parse from "html-react-parser"; function contentsElem() { const dangerousHtml = "<h1>Hello World</h1><p>こんにちは</p>"   const sanitizedHtml = DOMPurify.sanitize(dangeroushtml);   return parse(sanitizedHtml); } const userContents = () => { return <div className="prose">{contentsElem}<div> }だいたいいい感じになると思います.ご指摘などありましたらお気軽にお願いいたします.

うちのカレー

2025-06-08

我が家に伝わるカレーのレシピがかなりおいしいので共有します材料(4人前)玉ねぎ:2玉にんじん:1本じゃがいも:4個豚こま肉:200gカレールー:1.5箱カレー粉(赤い缶):適量ローリエ:2枚塩:少々ブラックペッパー:少々コンソメ:5gインスタントコーヒー:少々トマト缶:1缶鷹の爪:1本にんにく:1かけとんかつソース:適量オリーブオイル赤ワイン作り方鍋にオリーブオイルを入れ,あたためます.みじんぎりにしたにんにく,鷹の爪を入れ,オリーブオイルに香りを移します.くし切りにした玉ねぎを入れ,しんなりするまで炒めます.にんじん,じゃがいもを切り,じゃがいもを水に浸したあと,耐熱容器に入れラップして500W 5分ほど加熱します.玉ねぎがしんなりしたら水を700mlくらい入れ,ローリエ,コンソメ,トマト缶,塩,ブラックペッパーを入れます.ある程度加熱したら味を確かめながら,ちょっと薄いミネストローネのような味になったらOKです.同時に,フライパンにオリーブオイルを熱し,豚こま肉を焼きます.ほどよく焼けてきたら赤ワインを入れ,アルコールを飛ばします.焼くことでアクを減らせます.鍋に肉とにんじん,じゃがいもを加え,煮込みます.とんかつソース,インスタントコーヒー,カレー粉,カレールーを加え,味を整えます.完成

Kanade Blog - Kanade Sisido 2025