SQL
Security
ORM
2
どのような問題がありますか?

投稿日

更新日

SQL直書き✖️ORM◎

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くらいは使わないとガバガバセキュリティになる可能性が高いです。この記事を機にアプリケーションのセキュリティ対策にも力を入れて見てください。

新規登録して、もっと便利にQiitaを使ってみよう

  1. ユーザーやタグをフォローできます
  2. 便利な情報をストックできます
  3. 記事の編集提案をすることができます
ログインすると使える機能について

コメント

この記事にコメントはありません。
あなたもコメントしてみませんか :)
新規登録
すでにアカウントを持っている方はログイン
記事投稿イベント開催中
PHP強化月間~開発する上で知っておくべき知見を共有しよう~
~
フロントエンドの開発効率を向上するヒントを教え合おう!
~
2
どのような問題がありますか?
新規登録して、Qiitaをもっと便利に使ってみませんか

この機能を利用するにはログインする必要があります。ログインするとさらに下記の機能が使えます。

  1. ユーザーやタグのフォロー機能であなたにマッチした記事をお届け
  2. ストック機能で便利な情報を後から効率的に読み返せる
新規登録ログイン
ストックするカテゴリー