SQLとは?
SQLとはStructured Query Languageの略でRDBMS(Relational DataBase Management System)を操作するための言語です。なのでCやPythonといったプログラミン言語とは少し違います。
SQL文を書く
大学の授業やProagteなどでSQLを勉強した人は大体RDBMSを使ったアプリケーションを作りたい!となると思います。もちろん私もそうでした。しかしながら、実際の開発の現場でSQL文を直書きしているところはほぼ無いと思います。もちろんSQL文の書き方を理解していることは大切です。SQLを直書きしてしまうと起こることを次の章でお伝えします。
SQLインジェクション
情報系の学生やSQL,RDBMSについて少し深く勉強した方なら聞いたことがあるのでは無いでしょうか。SQLインジェクションのよくある例として以下のようなものが挙げられます。
select * from `users` where userid = ? and password = ?
?にはユーザの入力が入ると思ってください。言語は関係なくjavascript、python、rubyで文字列連結などによってこのようなSQL文を作ったとします。このSQL文が示すことはuseridとpasswordが一致するユーザがいればuser情報を返すというものです。ログイン画面などでこの処理をして返ってきたユーザを表示するといったロジックを組めばログイン機能が実装できそうに思えます。ただこれには大きな落とし穴があります。
上記に以下のような入力があったとしたらSQL文はどうなるでしょう。
userid = shimada
password = '' or 'a' = 'a'
という入力があったとしましょうすると以下のようなSQL文ができてしまいます。
select * from users where id = 'shimada' and password= '' or 'a' = 'a';
このSQLは恐怖のSQLと言ってもいいでしょう。全てのユーザ情報が抜き出されてしまいます。上記で説明したSQLの例は極端な例ですがあなたが作るアプリでも意図しない情報が抜き取られてしまうリスクがあります。
ORM
先ほどの章を読んでSQL書ける!使いたい!と思った人も一瞬躊躇したのでは無いでしょうか。アプリでRDBMSを操作する際はSQL直書きではなく、大体ORM(Object-Relational Mapping)と呼ばれるものを使います。これはObjectとRDBMSを繋ぐ役割をしているのですが、大体の場合SQL文を書くメソッドが存在します。これを適切に使うことで上記のような怖い怖いことは起きなくなります。SQLを学んで使いたいからと言って直書きだけは絶対にやめましょう。
最後に
SQLインジェクション対策はORMだけではありませんし、ORMを使ったから大丈夫!というわけでもありません。しかしながら、とりあえずRDBMS使うという方はORMくらいは使わないとガバガバセキュリティになる可能性が高いです。この記事を機にアプリケーションのセキュリティ対策にも力を入れて見てください。
コメント