スポンサーサイト
クライアント・サイド・スクリプト埋め込み攻撃
【 クライアント・サイド・スクリプト埋め込み攻撃(Script Insersion) 】
■クライアント・サイド・スクリプト埋め込み攻撃とは
悪意のある攻撃者が外部リクエストの値に不正なクライアントスクリプト(Javascript)を混入させて送信することにより発生する攻撃。代表的な例としてHTMLフォームの入力データにJavaScriptを埋め込む等がある。
※XSS(クロス・サイト・スクリプティング)のなかには外部データに不正なJavascriptを外部リクエストとして送信させるものがあるが、XSSの場合は何らかの方法で善意の第三者にそれを行わせる。
■クライアント・サイド・スクリプト埋め込み攻撃への対策
外部リクエストの値をスクリプトのどこで利用するかで対策が変わってくる。
●通常の場所
htmlspecialchars 関数でHTML出力用サニタイズを行う。HTMLの出力時に行うことに注意する。具体的には外部リクエストとして送信された値のなかでHTMLのタグの区切り文字として特別な意味をもつ<,>などをhtmlspecialchars関数をつかってHTMLのタグの区切り文字としての意味をもたない通常文字として扱われるHTMLエンティティ>や$ltなどに変換する。
$data = $_POST['someone']; // $dataの値は<script> Javascriptコード </script>とする
$data = htmlspecialchars($data,ENT_QUOTES); // $gt;script< ..... $gt;/script$lt;と変換される
print($data);
以上のHTMLサニタイズにより$dataを表示してもJavascriptは実行されない。
htmlspecialcharsでHTMLエンティティへ変換される文字は下記の通りである(PHPマニュアルより )。
'&' (アンパサンド) は '&' になります。
ENT_NOQUOTES が設定されていない場合、 '"' (ダブルクォート) は '"'になります。
ENT_NOQUOTES が設定されている場合のみ、 ''' (シングルクオート) は '''になります。
'<' (小なり) は '<' になります。
'>' (大なり) は '>' になります。
●URLが記述可能な場所
具体的な記述可能な個所
<a href="<?php echo $url ?>">リンク</a>
<form action="<?php echo $url ?>" method="get">.....
<img src="<?php echo $url ?>" />
<meta http-equiv="refresh" content="3; url="<?php echo $url ?>" />
対策
preg_replace関数を使ってHTMLサニタイズを行う。
$url = $_POST['url'];
preg_replace('/javascript/i','',preg_replace('/[\x00-\x20\x22\x27]/','',$url));
<a href="<?php echo $url ?>">リンク</a>
上記コードは最初に外部リクエスト$urlに含まれる制御コード及びシングルクウォート,ダブルクウォートを空文字へ置き換える。さらに変換した値のなかのjavascriptという文字列を空文字へ置き換えることによってJavascriptを無害化する。
※iにより変換対象のjavascriptという文字列は大文字と小文字を区別なく空文字に置き換える。
«SQL Injection | ホーム | PHPのセキュリティ 目次»
コメント
コメントの投稿
トラックバック






