クロスサイトスクリプティングの脅威
実際には、ただクッキーを表示するだけでは別に実害はありません。が、これを更に応用し、他のサイト(攻撃者が用意したサイト)からセキュリティの甘いサイトにこの手法を使って送信をすることで、そのサイトにおけるユーザのクッキー情報を盗み出すことが可能になります。これが一般に「クロスサイトスクリプティング(XSS)」と呼ばれるサイト攻撃です。
「クッキーなんか盗んで、何の得があるの?」と思った人。あるんですよ、大きなメリットが。例えば、先ほどアラートに表示されたクッキーには「JSESSIONID」という見慣れない値が表示されていました。これは、実はJavaサーバが各ユーザの識別(セッションといいます)に使う値なのです。多くのサーバは、このようにしてクッキーを使いアクセスするユーザを識別しています。
ということは、ユーザ識別用のクッキーを盗むことができれば、そのユーザに成りすましてサイトにアクセスすることが可能となるのです。場合によっては、そのユーザのサイトに保管されたユーザ名やパスワード、個人情報などを盗んだり、時にはそのユーザに成りすましてお金を引き出したり買い物をしたり……ということも可能になるでしょう。
では、どうすればXSSによる攻撃を防げるのでしょうか。その第1のステップは「タグを無効化する」ということです。要するに、フォームからタグを送信されたとき、それをタグのまま出力してしまうから問題を起こすのです。タグをタグとして認識されなくしてしまえば、XSSの攻撃の大半は防ぐことができます。
<%
request.setCharacterEncoding("UTF-8");
String s = request.getParameter("text1");
if (s != null){
// タグの処理
s = s.replaceAll("<","<");
s = s.replaceAll(">",">");
out.println("こんにちは、" + s + "さん!<br><br>");
%>
タグの<>記号を置換することでタグを無効化できる。 |
先のソースコード内にあるJSPタグ部分をこのように修正してみましょう。今度は、JavaScriptのタグを使って送信しても、スクリプトは実行されません。ただ、送信されたタグがテキストとして表示されるだけです。ここでは、以下の2行の文を追加しただけです。
s = s.replaceAll("<","<");
s = s.replaceAll(">",">");
replaceAllは、テキスト内から指定の検索語を置換語に置き換えるものですね。これで、<記号と>記号が<と>に置換されます。こうなれば、タグは全く機能しなくなります。実に簡単ですね。
この2行の文は、「XSSのもっとも基本的な対策の第一歩」として覚えておいてください。たったこれだけで多くの攻撃は防ぐことができるのですから。