スクリプトを実行させるな!


既に、フォームからテキストなどを送信し、それを受け取って処理するというWebのもっとも基本的な処理については説明しました。実際に簡単なWebアプリケーションを作ってみた人もいるかも知れませんね。

しかし、実をいえばまだ「フォームの送信の基本」についての説明は、すべて終わったわけではないのです。入力された情報を送受し処理するということだけができればOKなのではありません。もう1つ、非常に重要なことを知っておく必要があります。それは「セキュリティ」についての知識です。

とりあえず、先に作成した簡単なフォーム送信のJSPプログラムを例にして説明をしましょう。確か、こんなサンプルを作成しましたね?

<%@page contentType="text/html" %>
<%@page pageEncoding="UTF-8" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">

<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>JSP Page</title>
  </head>
  <body>

    <h1>JSP Page</h1>

    <%
      request.setCharacterEncoding("UTF-8");
      String s = request.getParameter("text1");
      if (s != null){
        out.println("こんにちは、" + s + "さん!<br><br>");
      }
    %>
    
    ※送信フォーム<br>
    <form method="post" action="index.jsp">
      <input type="text" name="text1">
      <input type="submit">
    </form>
  </body>
</html>

これは、実をいえばまだ未完成なのです。なぜなら、このプログラムには「でっかい穴」が開いているからです。「どこにそんなものが?」と思うかもしれませんね。では、実際に試してみましょう。WebブラウザでこのJSPページにアクセスし、入力フォームから以下のように入力をして送信してみてください。

<script language=javascript>alert(document.cookie);</script>


JavaScriptのタグを直接送信することで、スクリプトを実行させることができる。

送信すると、なぜか画面にアラートウインドウが現れ、なにやらよくわからないテキストがずらっと表示されたはずです。実は、これはWebブラウザに保管されているこのサイトのクッキー情報なのです。皆さんの中には、こんな感じのテキストが画面に表示された人もいることでしょう。

JSESSIONID=C33089C3BA4F6C440DFA294630229AB0


これは、現在のクッキー情報です。フォームを送信しただけなのに、なぜクッキーの内容が画面に表示されたりしたのでしょう? それは、このプログラムが「送信されたテキストをそのまま出力させる」ようになっていたためです。このため、<script>タグによるJavaScriptのスクリプトを送信すると、それがサーバからクライアントに出力される際に実行され、アラートが表示されたのです。