PR

クロスサイト・スクリプティングへの対処方法を説明します。

 フォームを利用してクライアントから送られてきたデータを利用するときには,クロスサイト・スクリプティング(XSS)の問題に注意が必要です。XSSは,悪意のあるスクリプトを書き込むことで,個人ユーザーの情報を奪い取る攻撃のことです。例えば,Webブラウザに保存してある個人のCookie情報を奪い取り,その情報を使って他人になりすましてオンライン・ショッピングを行うなどの不正利用のきっかけとなります。

 XSSを引き起こす原因は主に,ユーザーの入力内容をそのまま出力として利用することにあります。例えば,悪意のあるJavaScript を直接書き込める掲示板があったとしましょう。書き込まれた内容を他のユーザーがWebブラウザで実行して,Cookie情報を奪い取られてしまうということが起こります。

 危険を身近に感じるために,具体例を示しましょう。図1の「xss_test.cgi」というスクリプトを利用して簡単なテストができます。xss_test.cgiはテキスト・エリアに入力した内容をそのまま表示するスクリプトです。

<script>
<!--
    alert('スクリプトを実行!');
-->
</script>
図1●XSSのテスト
xss_test.cgiでテキスト・エリアに上記の内容を入力 して,投稿ボタンを押す。

写真1●XSSによる攻撃
写真1●XSSによる攻撃
入力したJavaScriptが実行されてしまった。

 xss_test.cgiを読み出し,テキスト・エリアに図1のような内容を書き込んで,投稿します。すると,結果の画面が表示された際に,入力したJavaScriptが実行され,警告ダイアログが表示されてしまいます(写真1)。

 XSS攻撃を防ぐには,CGI プログラム内などでJavaScript などを無効にする仕組み(サニタイジングという)を設けておく必要があります。

 より簡単な防御方法は,クライアントから入力したデータをHTMLに出力する場合は,タグなどの特殊記号をブラウザで強制的に文字として扱うように変換してしまうことです。タグは必ず「<」と「>」でくくられます。このタグを無効にするには,「<」を「<」,「>」を「>」に置換します。これで,「<」と「>」にはタグとしての意味が失われ,Web ブラウザ上では文字として「<」および「>」が表示されるようになります。同様に置換しておいた方がよい文字列を表1に示します*1

表1●置換を行うべき文字
XSSを防止するために変換をしておくべき文字とその対応文字列。
表1●置換を行うべき文字

 実際に,Perlを使って文字を置換する場合は,

$置換を行う変数 =~ s/対象の文字列/置き換える文字列/g;

と記述します。例えば,「<」を「&lt;」に置き換えるには,

$VALUE =~ s/</&lt;/g;

と記述します。同様に表1で示した文字についても置換します。これで,XSSの影響を受けなくなります。