お知らせ
2023.12.5(Tue)
目次
こんにちは、堀部です。
クロスサイトスクリプティング(以下:XSS)の対応で、タグを無効化するのはよく行われることですが、テキストエリアに入力された内容を表示する際に、改行コードだけは有効にしたい場合があります。
そんな時に役立つ方法をご紹介します。
改行コードで、splitしてforEachでループしながら出力しています。改行以外のタグはc:outで無効化されます。
split関数の第2引数での改行は、置換するためにあえてしています。
<c:forEach var="str" items="${fn:split(str,' ')}" ><c:out value="${str}" /><br /></c:forEach>
.textでタグを無効化して、javascriptのreplace関数で改行コードを<br>に変換しています。replaceは最初の1つの一致文字しか置換してくれないため、正規表現を使うようにしています。
$('#hoge').text(str).html().replace(/\r?\n/g,'<br>');
htmlspecialchars関数で、変換された改行コードをstr_replace関数で<br>に変換しています。
str_replace('<br>', '<br>', htmlspecialchars( $string , ENT_QUOTES) );
いかがでしたでしょうか。
Webアプリケーションを構築するうえでXSS対策は必ず行わなければいけませんが、有効にしたいコードまでエスケープしてしまうとユーザビリティの低下につながります。
今回ご紹介した言語での対応以外にも、方法はあると思いますので機会があればまたご紹介したいと思います。