回る男の備忘録

どこかでプログラム書いてシャニマスして野球見てTwitterやってる人間の駄文

SQLインジェクション、知ってますか?

エンジニアの皆さんは知ってますよね?
私はSQLインジェクション対策されていない現場で開発していました。

SQLインジェクションとは

wikipediaから引用

SQLインジェクション(英: SQL Injection)とは、アプリケーションのセキュリティ上の不備を意図的に利用し、アプリケーションが想定しないSQL文を実行させることにより、データベースシステムを不正に操作する攻撃方法のこと。また、その攻撃を可能とする脆弱性のことである。

ざっくり言えばSQLに変な文字列を突っ込んで想定外のSQLを実行させる方法です。

以下のSQLを例に見ていきましょう。

SELECT * FROM customer WHERE name = '入力値';

customerテーブルからデータを取得するSQLです。
条件として'name'に一致するものを取得するという形になっています。
一見するとごく普通のSQLですが、このままアプリケーションに導入すると大変。
SQLインジェクションの温床です。

SQLインジェクションを発生させる

例えば、Webアプリケーションからの入力値をnameに設定するとしましょう。
そのときの入力値は以下とします。

a' OR 'a' = 'a

これをSQLに結合します。

SELECT * FROM customer WHERE name = 'a' OR 'a' = 'a'

これ、ORの右側で'a'='a'が一致してるのでcustomerテーブルのレコードが抽出できます。
直接入力値をSQLに結合する形だとこういった危険性があります。

対策

  1. バインド機構を利用する
    プログラミング言語にはバインド機構が用意されているのでそちらを利用します。
    バインド機構を利用することで安全にSQLを発行することができます。
  2. エスケープ処理を実装する SQLにとって意味がある文字を弾くようなエスケープ処理を実装することが効果的です。
    これはSQL以外にもHTML等意味がある文字を弾くことが大切なので合わせて実装しましょう。
  3. WAFの導入 企業でサービス展開しているのであれば当然導入しているはずです。

まとめ

当たり前ですけどいいサービス作ったところで脆弱性が発生したら全て台無しです。
特に個人情報を扱うのが当たり前になってきているのでせめてものセキュリティの知識は必要です。