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.データベース
わしが塾長の『ヤミカラス』であ〜る。さてさて今回の第30羽(話)は、「データベース」について語ろう

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

Javaエンジニアとして現場で活躍しておっても、『データベースについてはすでに設定されたものを使っている』というものも結構多かったりするようじゃ。
開発の現場では、開発者やデータベース管理者というように現場では、役割分担されておるものじゃからのう。
わしの知っておる、現場で活躍しておるエンジニアの中にも、データベースの中身がブラックボックスで、何をしてるかよく分からなかったので、扱うのが怖くて苦手だった、という者もおる

もちろん我が塾生では、そんな事が無いようきっちり指導しておるがの

データベースは、仕組みが分かってないとちょっとした操作で大事なデータを消して
しまいやせんかと、不安になったりするものなんじゃな。まだまだ青いのう

データベースと言っても、実体はファイルそのものじゃ。
ファイルで、管理するデータやデータの構造なんかを保持しているに過ぎん。データベースのバックアップも必要なファイルをコピーして取っておくだけでOK
だったりするのじゃよ。Windows版のOracleなんかじゃと、右クリックしてドラッグ&ドロップくらいでもバックアップ可能じゃ。
もちろん本番環境で試してみるわけにはいかんが、自分のPC環境にデータベースを作成して、データなりテーブルなりを思う存分削除しまくって、コピーファイルからのリカバリを試してみるのもよいじゃろう。
そうしておくだけでも、変に怖がって苦手意識を持つということもなくなるはずじゃ。
こんな風に、知識だけでなく、実際の仕組みがどうなっているかを確認しておくのもエンジニアとして活躍するためには必要なことなんじゃな(・◇・)ゞ
javakoushi at 14:19|Permalink│
2008年10月06日
NO29.O/Rマッピング
こんにちは。本日はキョウ狐がお話いたしますね
今回の第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.暗黙の型変換
わしが塾長の『ヤミカラス』であ〜る。最近は、すっかり秋になってきたの〜

秋といえば食欲の秋じゃな。わしの大好物はホルモンじゃ

塾が休みのときはたいてい最寄の王子あたりで七輪を囲んでおる

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

さてさて今回の第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のサンプル
】青山
青山
など従業員のリストを表現さているのがわかるっスタグを使用してホームページのデータが表現できるHTMLとは異なり、タグを自由に定義してデータや規則を何でも作っていけるのがXMLの特徴っス

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

これはスキーマ定義言語といわれるっス。それについては、また今度の機会に説明するっス
ね〜あとはXMLがどこで使われているのだろうか。。。。って事っスが、Javaエンジニアになじみの深いところでいうと、
Webアプリケーションのデプロイメントデスクリプタ (web.xml)
antやMavem2などのビルドツールなどっスね実はJaveエンジニアのおなじみのEclipse(統合開発環境)のプロジェクト設定ファイルである.projectというファイルもXMLだったりもするっス
以上のようにいろいろなところで使われているので、たかがXMLといって勉強をおろそかにしてはいけないっスよ〜


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