エンドユーザがコメント欄にコメントを入れた際に、scriptタグはエスケープ処理し、URLが張られた場合はリンクを作ってあげる方法について考えていきます。12月5日記事
目次
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の方を挿入してあげてください。
以上