タイトル
 メニューにないコーナーはTopからいけます
TOP覚え書きWebAppSecurity → This Page
ウェブアプリケーション作成時のセキュリティ注意点

クロスサイトスクリプティングとサニタイジング

クロスサイトスクリプティング(Cross Site Scripting)とは

あるサイトに記述されたスクリプトが別のサイトに跨って実行されてしまうものです。
悪意あるサイトへアクセスした際、そこに埋め込まれたスクリプトが
標的となる(脆弱性がある)サイトへ転送され、そのサイト経由でクライアントのブラウザ上で
スクリプトが実行されてしまいます。
余談ですが、クロスサイトスクリプティングは略すと CSS になりますが、
Cascading Style Sheets と間違えやすいため XSS と記載されることが多いです。

以下は簡易掲示板です。
入力画面で名前と内容を入力して「書き込む」ボタンを押すと入力データが登録され、
閲覧画面で参照可能になります。
他のユーザが書き込んだ内容も閲覧可能です。
図:画面例1
図:画面例2
入力画面では、必須チェックと最大バイト数チェックを行っています(サーバ側も)。
閲覧画面では、新着順に登録内容を「そのまま」表示しています。

上記例の問題点

入力画面の名前欄に以下の内容を入力して登録するとどうなるでしょうか?
<script>alert('どーも');</script>

登録内容を「そのまま」表示している閲覧画面を開くと
「どーも」というアラートメッセージが表示されてしまう。
なぜなら閲覧画面の名前部分の HTML が以下のようになるからです。
<tr>
	<td>名前</td>
	<td><script>alert('どーも');</script></td>
</tr>

この例では単にアラートメッセージを表示させるだけになっていますが、
場合によってはユーザが Cookie 情報を盗まれたり、サイトのページ改竄をさせられたりします。

対応策

1.入力値チェックの強化
 入力値に特殊な文字列が含まれている場合はエラー扱いにする。
2.サニタイジング(sanitizing)(無害化)
 有害となる文字そのものを無害な文字に変換する。
 ・<→&lt;
 ・>→&gt;
 ・&→&amp;
 ・"→&quot;
 ・'→&#39;
3.言語に用意されている関数を使う
 ASP の場合、Server.HTMLEncode() を使って出力
 PHP の場合、htmlspecialchars() を使って出力

TOP覚え書きWebAppSecurity → This Page
Valid CSS!