クロスサイトスクリプティング対策で改行のみ有効にしたいときの対応方法まとめ

こんにちは、堀部です。
 
クロスサイトスクリプティング(以下:XSS)の対応で、タグを無効化するのはよく行われることですが、テキストエリアに入力された内容を表示する際に、改行コードだけは有効にしたい場合があります。
 
そんな時に役立つ方法をご紹介します。

JSTLを使った方法

改行コードで、splitしてforEachでループしながら出力しています。改行以外のタグはc:outで無効化されます。
 
split関数の第2引数での改行は、置換するためにあえてしています。

	<c:forEach var="str" items="${fn:split(str,'
')}" ><c:out value="${str}" /><br /></c:forEach>

jQueryを使った方法

.textでタグを無効化して、javascriptのreplace関数で改行コードを<br>に変換しています。replaceは最初の1つの一致文字しか置換してくれないため、正規表現を使うようにしています。

	$('#hoge').text(str).html().replace(/\r?\n/g,'<br>');

PHPを使った方法

htmlspecialchars関数で、変換された改行コードをstr_replace関数で<br>に変換しています。

	str_replace('<br>', '<br>', htmlspecialchars( $string , ENT_QUOTES) ); 

まとめ

いかがでしたでしょうか。
 
Webアプリケーションを構築するうえでXSS対策は必ず行わなければいけませんが、有効にしたいコードまでエスケープしてしまうとユーザビリティの低下につながります。
 
今回ご紹介した言語での対応以外にも、方法はあると思いますので機会があればまたご紹介したいと思います。

記事をシェア
MOST VIEWED ARTICLES