TOPサーバ構築・運用> データベースにデータを登録しよう
はじめてのサーバサイドJava
はじめてのサーバサイドJava

第10回:データベースとの連携(後編)

著者:山田 祥寛   2006/5/16
前のページ  1  2
データベースにデータを登録しよう

   「第1回:Are you ready for Server Java ?」でも述べたように、サーバサイドアプリケーションの魅力は、与えられたコンテンツを参照するだけではなく、エンドユーザが自らコンテンツを累積していくことができる点にあります。ここでは、データベースへの登録について説明していきます。dbInput.jsp(リスト2)から入力された情報をdbInsert.jsp(リスト3)でデータベースにインサートします(図3)。

リスト2:dbInput.jsp
<%@ page contentType="text/html;charset=Windows-31J" %>
<html>
<head>
<title>データベース登録</title>
</head>
<body>
<form method="POST" action="dbInsert.jsp">
<table border="0">
<tr>
   <th align="right">名前:</th>
   <td><input type="text" name="name" size="15" maxlength="30" /></td>
</tr>
<tr>
   <th align="right">出身国:</th>
   <td><input type="text" name="country" size="15" maxlength="30" /></td>
</tr>
<tr>
   <th align="right">享年:</th>
   <td><input type="text" name="old" size="5" maxlength="3" />歳</td>
</tr>
<tr>
   <th align="right">誕生日:</th>
   <td><input type="text" name="birth" size="15" maxlength="10" /></td>
</tr>
<tr>
   <th align="right">代表作:</th>
   <td><input type="text" name="work" size="20" maxlength="50" /></td>
</tr>
<tr>
   <td colspan="2"><input type="submit" value="登録" /></td>
</tr>
</table>
</form>
</body>
</html>

リスト3:dbInsert.jsp
<%@ page contentType="text/html;charset=Windows-31J" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<fmt:requestEncoding value="Windows-31J" />
<sql:setDataSource var="db" dataSource="jdbc/Marugoto" />
<sql:update dataSource="${db}"> (1)
   INSERT INTO artist(name,country,old,birth,work) VALUE(?,?,?,?,?)
   <sql:param value="${param['name']}" />
   <sql:param value="${param['country']}" />
   <sql:param value="${param['old']}" />
   <sql:param value="${param['birth']}" />
   <sql:param value="${param['work']}" />
</sql:update>

<c:redirect url="dbInput.jsp" />

HTMLフォームからの入力情報をデータベースに登録
図3:HTMLフォームからの入力情報をデータベースに登録


SQLクエリを動的に生成する

   前項でも述べたように、DatabaseタグライブラリでINSERT命令を発行するのは<sql:update>要素の役割です。dataSource属性に<sql:setDataSource>要素で取得したデータソースを、配下のテキストにはSQLクエリを指定します。それぞれ指定するのは<sql:query>要素と同様なので、迷うことはないでしょう。

   ここで注目してほしいのは、SQLクエリに含まれる「?」です(リスト3の1)。「?」は「プレイスホルダ」と呼ばれるもので、<sql:param>要素を使用することで、このプレイスホルダに対して動的にパラメータを埋め込むことができます。ただし、<sql:param>要素の記述順とプレイスホルダの並び順は対応関係になければならない点に注意してください。


SQLインジェクションに注意

   もっとも、プレイスホルダを利用せず、以下のように式言語で動的にSQL命令を生成することも可能です。

INSERT INTO artist(name,country,old,birth,work) VALUE('${param
['name']}','${param['country']}',${param['old']},'${param
['birth']}','${param['work']}')

   しかし、このような式言語を用いたSQL命令の構築には、大きな問題が2つあります。

   まず1つは、SQLクエリと式言語とが複雑に絡み合っているため、コードが読みづらくなることです。可読性が低下することにより、潜在的なバグが混入したり、修正が困難になったりといった問題を伴うので、できるだけ読みやすいコードを記述することが大切です。

   もう1つは、入力文字に「'」や「;」のようなSQLクエリ内で意味を持つ文字が含まれていた場合の問題です。このことは、ユーザによってSQL命令が書き換えられてしまう可能性があることを意味しています。この問題のことをSQLインジェクションといい、重大なセキュリティホールとなる可能性があります。

   その点、プレイスホルダを利用すれば、コードの可読性が向上するだけでなく、プレイスホルダ経由で引き渡されたパラメータは内部的にエスケープ処理されてからクエリに引き渡されるので、SQLクエリが予期しない形で書き換えられることはなくなります。したがって、SQL命令を動的に生成する場合には、必ずプレイスホルダを利用することを強くお勧めします。

前のページ  1  2


WINGSプロジェクト  山田 祥寛
著者プロフィール
有限会社WINGSプロジェクト   山田 祥寛
Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト(http://www.wings.msn.to/)」の代表。主な著書に「10日でおぼえる入門教室シリーズ(Jakarta・JSP/サーブレット・PHP・XML)」(以上、翔泳社)、「書き込み式 SQLのドリル」(ソシム)など。最近ではIT関連技術の取材、講演まで広くを手がける毎日。

INDEX
第10回:データベースとの連携(後編)
  JSPページからデータベースに接続する
データベースにデータを登録しよう