未経験からエンジニアを目指している方やプログラミングを学習中で、いずれはプログラマーとして働きたいという方も少なくありません。
精力的にプログラミングスキルを身に付けている中で、どうしても手を出しづらいのがセキュリティ対策分野ではないでしょうか。確かに、実際に働いてみる機会がなければセキュリティ対策の重要性を感じることができません。
しかし、セキュリティ対策への知見があれば相対的に実務未経験プログラマーとしての市場価値は上がります。特にSQLインジェクション対策に関するスキルがあることが理想的でしょう。
今回の記事では、SQLインジェクションを聞いたことがないという方でも分かりやすいように以下の内容を解説していきます。
- SQLインジェクションとは何か
- SQLインジェクションの具体例
- SQLインジェクションへの対策方法
SQLインジェクションとは
SQLインジェクションとはデータベースを用いたWEBアプリケーションに対する攻撃方法の1つです。名前の通り、SQL文にWEBアプリケーションの脆弱性を狙ったキーワードを混入させて、WEBアプリケーションの誤作動などを引き起こすことが目的の攻撃方法です。
SQL文ってなに?
SQL文とは、データベースに直接命令するための言葉です。データベースを用いたWEBアプリケーションでは、SQL文はさまざまな場面で用いられています。例えば、検索キーワードやメッセージ送信フォームなど、ユーザーが入力できる部分にもSQL文が使用されているので、SQLインジェクション対策は非常に重要です。
上記Q&Aにもあるように、データベースを用いらWEBアプリケーションでは、検索フォーム・メッセージ投稿・ブログ記事削除など、さまざまな場面で管理者以外のユーザーがデータベースにSQL文を発信する機能が実装されることが多いです。
SQLインジェクション対策が不十分のままだと、悪意のあるユーザーがSQLインジェクションを仕掛け、WEBアプリケーションが落ちてしまったり、他ユーザーも含めたデータベースが削除されてしまったりする可能性もあるのです。
SQLインジェクションの例
次にSQLインジェクションが起こりうるコードを実際に見ていきましょう。
SELECT * FROM products WHERE shop = {SHOP_NAME} AND productname = {PRODUCT_NAME};
こちらのSQL文は、入力されたSHOP_NAMEと、PRODUCT_NAMEに合致するレコードをproductsテーブルから引き出そうとしているものです。SQL文に慣れている方であれば、上記のコードがいかにありがちであるか実感することができるでしょう。
しかし、{PRODUCT_NAME}に以下のキーワードを挿入することによってSQLインジェクションを行うことができるのです。
SELECT * FROM products WHERE shop = {SHOP_NAME} AND productname = {PRODUCT_NAME} OR 1 = 1;
お分かりでしょうか。「OR 1=1」というキーワードを挿入することによって、「1が1ならproductsテーブルのレコードを全取得する」というSQL文になってしまうのです。
小規模WEBアプリケーションであれば問題なく取得できるでしょうが、顧客データを何万、何十万と扱う大規模WEBアプリケーションの場合はSQL文の出力結果を処理しきれず、WEBアプリケーション自体が落ちてしまう可能性もあるのです。
SQLインジェクションに関わらずセキュリティ対策を行わないということは、常にWEBアプリケーションの管理者サイドにリスクを負わせるということに直結するのです。セキュリティ対策に対してどれだけの知見を持っているかどうかが、実は実務未経験エンジニアの評価基準だったりするのですよ。
SQLインジェクションへの対策
SQLインジェクションの恐ろしさを感じていただいた上で、こちらではSQLインジェクション対策スキルをご紹介していきましょう。
サニタイジング(エスケープ)処理
一般的なSQLインジェクション対策としては、サニタイジング(エスケープ)処理が有名です。サニタイジングとは、HTMLで用いられる「’」や「;」などといった特殊文字を、別の文字に置き換えたり、受理しないことです。
特殊文字は、SQL文として認識された際に最も誤作動を発生させやすい原因となりかねません。そのため、SQL文が誤作動を起こさないための処理としてサニタイズが必要となります。言語やフレームワークによってサニタイズの方法が異なりますので、自身が使用する言語・フレームワークに従って、適切にサニタイズするようにしましょう。
SQLインジェクション対策スキャナの使用
自動でSQLインジェクション対策を行ってくれる便利なツールSQLインジェクション対策スキャナについても理解を深めておくべきでしょう。このSQLインジェクション対策スキャナについてはいくつかの種類がありますが、それぞれ使用目的が異なるため、目的に合わせて使い分けたり、組み回せて使用したりすることがおすすめです。
Automagic SQL Injector
オートマチックにSQLインジェクションの侵入テストを行ってくれるSQLインジェクション対策スキャナです。MicrosoftのSQLサーバーエラーが返ってくる脆弱性を利用して、SQLインジェクション対策スキャンを行ってくれます。
SQID – SQL Injection digger
WEBアプリケーション上入力フォームを使用して、WEBアプリケーション上のSQLインジェクションが可能な脆弱性を発見してくれるスキャナです。コマンドライン上で動作するタイプになっており、SQLインジェクションが可能な脆弱性だけではなく、SQLのよくあるミスなどを指摘してくれる優れものとなっています。
BobCat
AppSecIncが行っているリサーチをベースに設計されており、SQLインジェクションが可能なWEBアプリケーションの脆弱性を発見してくれるツールとなっています。また、実際にWEBアプリケーションを利用するユーザーが操作可能なテーブル全てを監査してくれるため、こちらのツールのスキャンテストを通過したWEBアプリケーションは非常にセキュアなアプリであると言えるでしょう。
SQLBrute
データベース内にある全てのデータに対してSQLインジェクションを行い、SQLインジェクションが可能なWEBアプリケーションの脆弱性を発見できるというツールです。スキャン対象のWEBアプリケーションに対して実際にSQLインジェクションが行われるため、どのような脆弱性を保有しているのかが分かりやすいです。
まとめ
今回の記事では、SQLインジェクションを聞いたことがないという方でも分かりやすいように、「SQLインジェクションとは何か」・「SQLインジェクションの具体例」・「SQLインジェクションへの対策方法」についてご紹介してきました。
SQLインジェクション対策に限らず、WEBアプリケーションのセキュリティ面の担保は非常に重要。エンジニア必携のスキルであると言えるのです。今回の記事を熟読した上で、まずはご自身の言語やフレームワークに合わせたSQLインジェクションの方法について学習していきましょう。
【関連記事】
▶︎SQLで重複を削除するサンプルコード 最新データを残してdeleteするには?
▶︎SQL if文のサンプルコード集 NULL判定や、Switch文のような分岐をする方法
▶︎sqlコードの意味がわからない…不思議なSQLコードサンプル集
2005年に発生したクラブツーリズムのクレジットカード情報を含む個人情報漏洩事件や、価格.comのウェブサイト改竄事件などはSQLインジェクションが原因だと言われています。中にはSQLインジェクションによって倒産に追い込まれた企業も存在します。SQLインジェクション対策をしっかりと行わなければ、後々、大問題に発展する可能性が大きいのです。