クライアント・サイド・スクリプト : PHP

Pocket

この記事は書かれてから時間が経っています。
新しく記事
スクリプト挿入攻撃のセキュリティメモ : PHP

クライアント・サイド・スクリプト埋め込み攻撃(Script Insersion)の覚書。

クライアント・サイド・スクリプト埋め込み攻撃とは

悪意のある攻撃者が外部リクエストとして不正なクライアントスクリプト(主にJavascript)を送信すること。代表的な例はHTMLフォームの入力データにJavaScriptを埋め込むなど。

クライアント・サイド・スクリプト埋め込み攻撃への対策

外部リクエストに応じた対策が必要になる。

通常の場所

htmlspecialchars関数でHTML出力サニタイズを行う。HTMLの出力時に行うことのが一般的。具体的には外部リクエストの値の中のHTMLのメタ文字(タグの区切り文字など)として特別な意味をもつ<,>などの文字列をhtmlspecialchars関数をつかってHTMLのタグのメタ文字の意味をもたないHTMLエンティティ&gt;や&ltなどに変換する。

$data = $_POST['someone']; // $dataの値は<script> Javascriptコード </script>とする。
$data = htmlspecialchars($data,ENT_QUOTES); // $gt;script&lt ..... $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を無害化する[2],[3]

[1] XSS(クロス・サイト・スクリプティング)のなかには外部データに不正なJavascriptを外部リクエストとして送信させるものがあるが、XSSの場合は何らかの方法で善意の第三者にそれを行わせる
[2] iにより変換対象のjavascriptという文字列は大文字と小文字を区別なく空文字に置き換える。
[3] \x00~\x20は制御コード(\x00はNULL) \x22=>”,\x27=>’

コメント

No comments yet.

コメントの投稿

改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。