エンドユーザがコメント欄にコメントを入れた際に、scriptタグはエスケープ処理し、URLが張られた場合はリンクを作ってあげる方法について考えていきます。12月5日記事

目次





エスケープ処理したいけど、URLだけはリンクを張ってあげたい。

XSS対策のためにhtmlspecialchars関数を利用しますが、リンクのためのaタグのみは許可させたい場合はhtmlspecialchars関数を利用したあとに、URLの形をしていればpreg_replace関数を使ってaタグを作ってあげる必要があります。

コード

index.php

<!DOCTYPE HTML>
<html>

<head>
	<meta charset="utf-8">
	<title>XSS対策かつaタグ許可</title>
</head>

<body>
	<form action="confirm.php" method="post">
		<textarea name="text"></textarea>
		<input type="submit" name="submit" value="送信">
	</form>
</body>

</html>

confirm.php

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>表示</title>
</head>
<body>
<?php
$text = $_POST["text"];
//以下一行をコメントアウトをすると脆弱性が見られる。
$text = nl2br(htmlspecialchars($text, ENT_QUOTES, "UTF-8"));
//表示用
echo preg_replace('/(https?|ftp)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)/', '<a href="\\1\\2">\\1\\2</a>', $text);
?>
</body>
</html>



実行結果

入力

グーグルのURLは
http://www.google.co.jp
です。
ヤフーは
http://www.yahoo.co.jp
です。
<script>alert("XSS")</script>

と入力しました。表示結果は

となります。

まとめ

タイミングとしてはhtmlspecialchars関数でエスケープ処理したあとURLの構造をしていればpreg_replace関数を使って置換してあげます。 データベースに挿入するときは$textの方を挿入してあげてください。

以上

最終更新:2015年12月06日 09:56
添付ファイル