「コメント欄にURLを入れられた場合に、リンクを張ってあげてなおかつXSS対策を施す~aタグの許可~」の編集履歴(バックアップ)一覧はこちら
追加された行は緑色になります。
削除された行は赤色になります。
エンドユーザがコメント欄にコメントを入れた際に、scriptタグはエスケープ処理し、URLが張られた場合はリンクを作ってあげる方法について考えていきます。12月5日記事
~
~
目次
#contents
~
~
----
~
*エスケープ処理したいけど、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"];
//以下一行をコメントアウトをすると脆弱性が見られる。
$text1 = nl2br(htmlspecialchars($text, ENT_QUOTES, "UTF-8"));
//表示用
echo preg_replace('/(https?|ftp)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)/', '<a href="\\1\\2">\\1\\2</a>', $text1);
?>
</body>
</html>
~
~
*実行結果
入力
グーグルのURLは
http://www.google.co.jp
です。
ヤフーは
http://www.yahoo.co.jp
です。
<script>alert("XSS")</script>
と入力しました。表示結果は
&image(width=350,urlxss001.png)
となります。
~
~
*まとめ
タイミングとしてはhtmlspecialchars関数でエスケープ処理したあとURLの構造をしていればpreg_replace関数を使って置換してあげます。
データベースに挿入するときは$textの方を挿入してあげてください。
~
~
以上
エンドユーザがコメント欄にコメントを入れた際に、scriptタグはエスケープ処理し、URLが張られた場合はリンクを作ってあげる方法について考えていきます。12月5日記事
~
~
目次
#contents
~
~
----
~
*エスケープ処理したいけど、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>
と入力しました。表示結果は
&image(width=350,urlxss001.png)
となります。
~
~
*まとめ
タイミングとしてはhtmlspecialchars関数でエスケープ処理したあとURLの構造をしていればpreg_replace関数を使って置換してあげます。
データベースに挿入するときは$textの方を挿入してあげてください。
~
~
以上