2008年10月15日

NO31.SQLインジェクション

塾長いっぷく
またまた、塾長の『ヤミカラス』であ〜る
最近めっきりワシばかりで飽きているものもおるじゃろうが辛抱せい
エンジニアにはこういう我慢も必要じゃ

さてさて今回は、「SQLインジェクション」についてじゃ
USER_TABLEというテーブルがあって、USER_NAMEとPASSWORD列を持っておるとしよう。
SELECT *
FROM USER_TABLE
WHERE USER_NAME = 'XXX' AND PASSWORD = 'XXX' ;

というようなSQLを書けば、ユーザ名が'XXX'でパスワードが'XXX'のデータを
とってくることが可能じゃな。
これをユーザーごとに'XXX'部分を変えて、データを取得するプログラムをJavaで書くとすると、
----------------------------
String userName ;
String password ;

ユーザーからの入力値をuserNameとpasswordに設定

"SELECT * FROM USER_TABLE WHERE USER_NAME = '"
+ userName + "' AND PASSWORD = '" + password + "'" ;

SQL実行
----------------------------
といったような感じになる。
userNameが"YAMI"、passwordが"KARASU"であれば、実行されるSQLは

SELECT *
FROM USER
WHERE USER_NAME = 'YAMI' AND PASSWORD = 'KARASU' ;

となるんじゃな。

ところが、ここでpasswordが"' OR 1 = 1 --"であったとしよう。
userNameはなんでもよい。"XXX"としておこうかの。

この場合実行されるSQLは

SELECT *
FROM USER
WHERE USER_NAME = 'XXX' AND PASSWORD = '' OR 1 = 1 --' ;

となる。

このSQLは、USER_NAMEが'XXX'でPASSWORDが''の場合、
もしくは1 = 1の場合にデータを取得してね、という意味になってしまっておる。
1 = 1は常に正しいので、すべてのデータを選択するSQLとなるのじゃ。

もし、このJavaプログラムで、ユーザーが入力したユーザー名とパスワードで
データが取れてきたらログイン可能、などとしておくと、
ユーザーとして登録されていないものでも、パスワードに"' OR 1 = 1 --"を
入力するだけでログインができてしまうとんでもないアプリケーションとなってしまうのじゃ。

このように、SQLとして正しく機能する文字列を入力して実行させることを
SQLインジェクション」と呼ぶのじゃ。
Javaには、その「SQLインジェクション」を防ぐための専用のクラス
PreparedStatement」が用意されておる。

このクラスでは、SQLの条件式の部分を

"SELECT * FROM HOGE_TABLE WHERE COL1 = ?"

のように「?」で記述しておいて、その部分に
ユーザーから受け取った値を後から設定することが可能なんじゃが、
「?」に設定する値を単なる文字列として扱ってくれるので
SQLインジェクション」を防ぐことができるようになっとる。
さきほどの例で言えば、パスワードが"' OR 1 = 1 --"という文字列
のユーザーのデータを取ってくる、ということになるのじゃな。

ところが、そんな便利な機能があるにも関わらず最初の例のように
SQLを組み立てて「PreparedStatement」を使っておったりすると
せっかくの「SQLインジェクション」防止機能も力を発揮することができんのじゃ。

研修生の中には、「?」の使い方がよく分からなかったというような理由で
安易に最初の例のような書き方をしてしまうものがおる。
とりあえず動くものを作ってしまおうと考えてしまうんじゃな。
しかし、そうして作られたアプリケーションは、悪意のあるユーザーから
簡単にデータベースを操られてしまうのじゃ。
研修生には、こういったセキュリティの意識も持ったエンジニアとして
巣立っていって欲しいものじゃ

javakoushi at 15:07|Permalinkこの記事をクリップ!

2008年10月10日

NO30.データベース3

塾長わしが塾長の『ヤミカラス』であ〜る。
さてさて今回の第30羽(話)は、「データベース」について語ろう
今日もちょっとJavaから離れるぞい。Javaエンジニアたるもの、データベースの知識も必要じゃからのぉ

Javaエンジニアとして現場で活躍しておっても、『データベースについてはすでに設定されたものを使っている』というものも結構多かったりするようじゃ。
開発の現場では、開発者やデータベース管理者というように現場では、役割分担されておるものじゃからのう。

わしの知っておる、現場で活躍しておるエンジニアの中にも、データベースの中身がブラックボックスで、何をしてるかよく分からなかったので、扱うのが怖くて苦手だった、という者もおる
もちろん我が塾生では、そんな事が無いようきっちり指導しておるがの

データベースは、仕組みが分かってないとちょっとした操作で大事なデータを消して
しまいやせんかと、不安になったりするものなんじゃな。まだまだ青いのう
データベースと言っても、実体はファイルそのものじゃ。
ファイルで、管理するデータやデータの構造なんかを保持しているに過ぎん。データベースのバックアップも必要なファイルをコピーして取っておくだけでOKだったりするのじゃよ。
Windows版のOracleなんかじゃと、右クリックしてドラッグ&ドロップくらいでもバックアップ可能じゃ。

もちろん本番環境で試してみるわけにはいかんが、自分のPC環境にデータベースを作成して、データなりテーブルなりを思う存分削除しまくって、コピーファイルからのリカバリを試してみるのもよいじゃろう。
そうしておくだけでも、変に怖がって苦手意識を持つということもなくなるはずじゃ。

こんな風に、知識だけでなく、実際の仕組みがどうなっているかを確認しておくのもエンジニアとして活躍するためには必要なことなんじゃな(・◇・)ゞ

javakoushi at 14:19|Permalinkこの記事をクリップ!

2008年10月06日

NO29.O/Rマッピング3

キョウ狐こんにちは。本日はキョウ狐がお話いたします
今回の第29羽(話)は、「O/Rマッピング」についてです。

今日はちょっとJavaから離れて、データベースのお話になります。
Javaエンジニアは、データベースの知識も必要ですから

データベースと言えば、研修中に狐太ろっちによく教えてあげたのを思い出すホントお調子者で、『できるっ・やれるっ・理解してまっ』とか言って、塾長の目を盗んでは、私に聞いてきてたのようふふ

それでは、最近の開発現場で使われているデータベースと言えばリレーショナル型のデータを扱うリレーショナルデータベースがほとんどなのよ。略して、『RDB』なんて呼ぶこともあるのよ。

このRDBは、関係モデルという概念にもとづいて設計されておるので簡単に言ってしまえば、
どんな項目を扱うかを表す「列」
それぞれの列に実際の値を設定した「行」
からなる表形式のデータを扱うデータベースのこと
このRDBのお世話にならない開発の現場はほとんどないので、Javaエンジニアも当然Java言語を駆使して、RDBを扱う必要があるの

ところでJava言語の特徴と言ったら、オブジェクト指向でのプログラミングができることですよ
カプセル化とか継承、ポリモーフィズムといった概念のことよ
ここで気になってくるのが、JavaとRDBでのデータの扱い方の違いよ
Javaではデータをオブジェクトとして扱うのに対して、RDBでは表としてデータを扱うから、同じデータがまったく異なる形式で表現されているの

例えば、「社員」という抽象クラスがあるとして、「正社員」クラスと「派遣社員」クラスで継承して実装されていたとしましょう。Java側では、正社員というデータと派遣社員というデータを異なるオブジェクトとして認識するのよ。しかし、RDB側では、どちらも同じ一つの「社員」テーブルにデータを格納するでしょう。つまり、RDBからデータを取得してくる際に正社員データなのか派遣社員データなのかを判断して、受け取るクラスを変える必要があるということ

こういったJavaとRDBの異なるデータ表現の紐付けを行う処理を、オブジェクト型のデータとリレーショナル型のデータのマッピングという意味で「O/Rマッピング」と呼んでいるの

このようにちょっと考えてみるだけでも、JavaとRDBのデータの扱い方の違いがあることで、データベースを処理が必要な開発者は結構面倒なことをしないといけないんだなぁと想像がつくでしょ(*゚∀゚)っ

という訳で、オブジェクトとリレーショナルという異なった概念を超えてJava開発者がストレスを感じることなくデータベースを扱えるようにJavaで扱うオブジェクト型のデータとRDBで扱うリレーショナル型のデータを相互に変換してくれるO/Rマッピングフレームワークというものが登場してきたの。有名なところでは、「Hibernate」とか「iBATIS」などといったものがあるの

自分が普段から使っているJavaの技術がどういった理由で使われるようになったのか。こういったところにも注意を向けながら、Javaのエンジニアとして育って欲しいものよ

ところで、ここまで読んで、データベースもオブジェクト指向の概念で扱えれば、O/Rマッピングは必要なくなるんじゃないの?と、思われた方はなかなかするどいわ

そう、今のところ実際の開発現場で目にする機会はあまりないけど、オブジェクトデータベースという、オブジェクト指向データベースもあるのキョウ狐ミニキャラ

これに関しては、また別に機会に狐太ろっちから聞いてみて。たぶん、もう理解してると思うから。。。( -д-)ノ

javakoushi at 16:50|Permalinkこの記事をクリップ!

2008年09月26日

No28.暗黙の型変換5

塾長いっぷくわしが塾長の『ヤミカラス』であ〜る。

最近は、すっかり秋になってきたの〜
秋といえば食欲の秋じゃな。わしの大好物はホルモンじゃ
塾が休みのときはたいてい最寄の王子あたりで七輪を囲んでおる

それがたたって、昨今流行のメタボってやつじゃな。嫁さんには、ミシュランって言われてるぞィ。ぐわっはっはっ

さてさて今回の第28羽(話)は、暗黙の型変換についてじゃな。

ちょっとJavaから離れて、データベースの話になるぞぃ。
Javaエンジニアたるもの、データベースの知識も必要じゃからのぉ。

データベースのパフォーマンスチューニングと言えば、 エンジニアなら誰でも知っていて当然、まっさきに思いつくのがインデックスじゃな。
要は索引のことじゃ。

ほれ、分厚いマニュアルなんかを読む時にわざわざ1ページ目から目を通していくばか者などおらんじゃろう。
そう、索引で目的のページの場所を調べてから該当ページを見るのが普通じゃな。

OracleなんかのDBMSでもこの仕組みが使われておって、一度インデックスで該当データがハードディスクのどこら辺にあるのか確認してから、実際に読みに行くのじゃ。

データの取得は、SQLで
SELECT * FROM HOGE_TBL WHERE HOGE_CHAR = '1' ;
などと書く。これくらいは説明もいらんじゃろう。
HOGE_CHAR列はCHAR型でインデックスを設定してあるという想定じゃが、ここで、
SELECT * FROM HOGE_TBL WHERE HOGE_CHAR = 1 ;
などというSQLを書く研修生が意外に多くてまいる。

な〜にぃ〜
「'1'」と「1」の違いくらい大目に見てよじゃと
確かにどちらのSQLでも正しく動いて、正しいデータを取って来てくれるが、'1'と1では大違いじゃ

インデックスの使用という観点からすると 、では使われるがでは使ってくれんのじゃ

なぜならインデックスには 、インデックスを設定してある列に計算とか関数処理をすると、その列のインデックスは使用されなくなる、という性質がある。

上の二つのSQLの場合、「'1'」はCHAR型で、「1」は数値としてHOGE_CHAR列との比較が行われるが、のSQLではHOGE_CHAR列を数値に変換するという関数処理が入ってしまうので、インデックスが使用されなくなってしまうのじゃな。
こういった型変換処理を暗黙の型変換と呼ぶのじゃ。

Javaに限らず、こういった細かい点まで意識して開発できるエンジニアとなってもらわんと困る。
こんなSQLを書く研修生にはまだまだ喝〜っが必要じゃな。

今回は、Oracleを前提とした話じゃったが、他のデータベースを扱う場合にも知っておくべき知識は山とある。
ゆめゆめ勉強を怠ることのないようにのいっぷく〜ゆるカラス

javakoushi at 16:25|Permalinkこの記事をクリップ!

2008年09月11日

No27.XMLとは(その1)

いっぷくカラスちゅ〜っ狐太郎っすよ〜。
さて本日のお題は「XML」についてっ

このXMLは、われわれJavaエンジニアとって非常に重要なものであるから、ヤミカラス塾の研修でも、もちろん扱ってるっているっ
それはそうと、XMLってなんだろう・・・XMLはメタ言語といわれ、規則や言語を記述するための言語という意味っよ〜。。。とはいっても、チンプンカンプンの読者のために、まずはおいらから詳細を説明するっよ〜

【以下XMLのサンプル<employees><br> <employee id="000400"><br> <name>ヤミカラス塾長</name><br> <address>青山</address><br> <character>Java研修の鬼。</character><br> </employee><br> <employee id="000401"><br> <name>キョウ狐</name><br> <address>青山</address><br> <character>ヤミカラス塾長の一番弟子</character><br> </employee><br> </employees>ご覧のようにタグを使用して、ヤミカラス塾長キョウ姉など従業員のリストを表現さているのがわかるっ

タグを使用してホームページのデータが表現できるHTMLとは異なり、タグを自由に定義してデータや規則を何でも作っていけるのがXMLの特徴っ

ただ、自由に定義するっていっても使用の認識があってないと困るので、文書の構造の定義も大事っ

これはスキーマ定義言語といわれるっ。それについては、また今度の機会に説明するっね〜

あとはXMLがどこで使われているのだろうか。。。。って事っが、Javaエンジニアになじみの深いところでいうと、
Webアプリケーションのデプロイメントデスクリプタ (web.xml)
antやMavem2などのビルドツールなどっ
実はJaveエンジニアのおなじみのEclipse(統合開発環境)のプロジェクト設定ファイルである.projectというファイルもXMLだったりもするっ

以上のようにいろいろなところで使われているので、たかがXMLといって勉強をおろそかにしてはいけないっよ〜キョウ狐ミニキャラ


       『もう狐太ろっちったら〜
       なにドサクサにまぎれてキョウ姉なんて使ってるの・・・
       ホント、おバカなんだから。。。

javakoushi at 15:37|Permalinkこの記事をクリップ!