PHPでReferer(リファラー)を残さないリンクを作る2

前回のReferer(リファラー)を残さないリンクを少しカスタマイズしてみたいと思います。
自動で移動するのでは無くて、リンク先のアドレスを表示させてクリックさせる方式にしてみます。
以下のPHPでよさそうですがこれはXSS【クロスサイトスクリプティング】の脆弱性があり危険です。

<?php
$link = htmlspecialchars($_GET['link'], ENT_QUOTES);
if(!empty($link)){
header("Refresh: 15; URL= $link");
}
?>
<html>
<head>
<title>のサイトから外部サイトへ移動します。</title>
</head>
<body>
ここから先は外部のサイトに移動します。<br />
<a href="<?= $link ?>"><?= $link ?>を開く</a> //XSSの脆弱性があり危険
</body>
</html>


外部からの入力をhtmlspecialcharsでエスケープ処理しているようですが、

 <a href="<?= $link ?>"><?= $link ?>を開く</a>

にjavascript:alert(‘XSS’);など「javascript:」で始まる入力をされるとJavaScriptが実行されXSSの危険性があり、htmlspecialcharsだけではXSS対策は不十分です。

例えばこのようなリンクでJavaScriptが実行可能です。
http://blog.tasdesign.jp/direct_link.php?link=javascript:alert(‘XSS’);

ではこのようなXSSの脆弱性を無くす為にどうするかと言うと、$linkで入力された値を検証して「javascript:」など危険なものが含まれている場合、エスケープ処理または処理をしないような対策を考えなくてはなりません。

しかも、「javascript:」以外にもエスケープ処理しなければならない項目が多数あります。
それらははてなダイアリーXSS対策に色々載ってました。

とてもこれらの処理を自前で作るのは無理だと思っていたら「HTML Purifier」という便利なものがありました。これを使ってXSS対策をすることが出来たので次回「HTML Purifier」の使い方をまとめてみます。
PHPライブラリ「HTML Purifier」でXSS対策をする方法

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です