アプリケーションを制作する上で忘れてはならないのがセキュリティ面の担保です。悪意のあるSQLインジェクション攻撃によって、ユーザーの個人情報が漏洩したり、アプリが思わぬ動作をしたりしてしまう可能性があるからです。
プログラミング初学者であっても、インターネット上にアプリを公開するのであれば怠ってはいけないSQLのインジェクション対策。今回の記事では、SQLインジェクション対策とは何かについてご説明しつつ、SQLインジェクション対策の具体的な方法をご紹介していきましょう。
- SQLインジェクションの概要
- SQLインジェクションの対策方法
SQLインジェクションとは?
対策方法の前に、まずはSQLインジェクションという言葉について詳しくご説明をしていきましょう。
SQLインジェクションとは、アプリケーション開発時に意図していなかったSQL文を強制的に実行させることです。SQLは、アプリケーションで使用しているデータベースを操作することができるため、データベースに格納されているデータが悪用される可能性があります。
SQLインジェクションの具体例
例えば、データベースのusersテーブルに、数万件の氏名・住所・電話番号が収録されているとしましょう。
usersテーブル
+------+---------+-------------+ | name | adress | telnumber | +------+---------+-------------+ | Tom | America | 0000000000 | | Bob | Canada | 11111111111 | . . .
この中から該当のデータを取得するSQLのSELECTステートメントは、以下の通りです。
SELECT * FROM users WHERE name = ‘Tom’;
しかし、このSELECTステートメントのWHERE以降にある条件を与えると、全てのレコードを取得できてしまうのです。
SELECT * FROM users WHERE name = ‘Tom’ OR 1 = 1;
WHERE以降の条件は、「nameカラムがTomのレコードを取得。もしくは1が1なら全てのレコードを取得」という意味になってしまいます。このようなSQL文を同時に何回も問い合わせられた場合、サーバに大きな負担がかかり、アプリケーションが応答できなくなる可能性があります。
SQLインジェクションが行われた事件
SQLインジェクション対策が万全でなかったために、これまで数多くの被害が発生してきました。以下はその一例です。
- 「釣りビジョン」にて64,000件の個人情報が漏洩(2019/01)
- アメリカの「PlayStation」Webサイトの内容が改竄(2008/7)
- 「エクスコムグローバル」にて109,112件のクレジットカード情報が漏洩(2013/4)
他にも数え切れないほど、SQLインジェクション被害が溢れています。アプリケーションを開発する上で、切っても切り離せないのがSQLインジェクション対策なのです。
SQLインジェクション対策に不備があった際の判例
「東京地判平成26年1月23日判時2221号71頁」において、SQLインジェクションによる個人情報漏洩事件を巡り、開発会社に対して3,232万円の損害賠償請求が行われたという記録が残っています。結果として裁判所側も原告の要求を一部認める形として、2,262万円の賠償を被告側に負わせています。
この判決に限らず、SQLインジェクション対策の不備によって生まれた損害は、賠償請求という形で開発者に求められることになるのです。
SQLインジェクション対策の具体的な方法
さて、ここまでSQLインジェクションの脅威について詳しく解説をしてきました。ここからはSQLインジェクションの具体的な対策方法について解説をしていきましょう。
エスケープ処理
SQLインジェクション対策の中でも最も基本的なものがエスケープ処理と呼ばれるものです。コードの一部として認識されてしまう文字を、認識されないように処理することをエスケープ処理と言います。
「コードの一部として認識されてしまう文字」としては、以下のようなものが挙げられます。
- 「’」
- 「¥」
- 「\」
これらの文字はSQLに影響を与えうる文字のため、他の文字に置き換える処理が必要となります。言語ごとにエスケープ処理を行う関数などが用意されている場合がありますので、自分が使用する言語で調べてみましょう。以下は、エスケープ処理を行う関数の一例です。
phpのエスケープ処理を行う関数
mysqli::escape_string ( string $escapestr ) : string mysqli::real_escape_string ( string $escapestr ) : string
Web Application Firewallの導入
Web Application Firewallとは、アプリケーションにアクセスしたユーザーが、不正な動きをしていないかどうか監視するセキュリティ対策の1つです。アプリケーションの管理者がWeb Application Firewallに検出パターンを設定することによって、SQLインジェクションなどを含む不正な動きをキャッチしてくれます。
ただし、Web Application FirewallはSQLインジェクションへの根本的な対策というよりは、広く浅くアプリケーションを守るためのものであると考えた方が良いでしょう。先ほどご紹介したエスケープ処理で根本的な脆弱性を無くしていきつつ、未知なる不正アクセスに対しての防衛策として考えましょう。
近年では、オープンソース型のWeb Application Firewallも増え、その代表として「ModSecurity」や「WebKnight」が挙げられます。
セキュリティ(脆弱性)診断サービスの利用
セキュリティ診断サービスとは、アプリケーションに関わるシステムなどをチェックし、SQLインジェクションを含む、アプリの脆弱性を利用した攻撃を受ける可能性がないかどうかを診断してくれるサービスです。
エスケープ処理やWeb Application Firewallと異なるのは、セキュリティ診断サービス側が攻撃者の視点から、アプリケーションの脆弱性を事前に探してくれるという点。SQLインジェクションなどによる被害が起きてからでは遅いので、本格的にアプリケーションをリリースする前段階に、セキュリティ診断サービスを受けておくことが重要です。
まとめ
今回の記事では、SQLインジェクション対策とは何かについてご説明しつつ、SQLインジェクション対策の具体的な方法をご紹介していきました。
本記事でご紹介したように、SQLインジェクション対策は比較的簡単に導入することができます。アプリケーション開発においてSQLを組み込むのであれば、忘れずにSQLインジェクションの対策をしましょう。
セキュリティ診断サービスは、無料のものと有料のものがあります。個人でプログラミングを勉強して開発した小規模アプリケーションであれば、まずは無料のものを試してみると良いでしょう。特に初心者でも気軽に使用できるセキュリティ診断サービスとしては「OWASP ZAP」が有名です。