SQLインジェクションの対策法6つ!あなたの会社の脆弱性は大丈夫?

SQLインジェクションは企業のアプリやウェブサイトが抱える脆弱性を狙って、不正にSQLを実行してデータベースを攻撃する手法です。

この攻撃を受けると、企業は意図せず個人情報や取引先の情報を漏洩する可能性があります。また、サービスを一時的に閉鎖を余儀なくされるなどの被害に遭うことも多いです。

さらに、情報流出を起こした企業という悪評が出回ることで企業への信頼が傷ついたり、顧客対応に追われたりするなど二次被害による影響も大きくなります。

SQLインジェクションで企業が被る不利益については「SQLインジェクションの被害事例」で詳しく説明していますが、このような被害に遭わないためには企業側がSQLインジェクションに適切な対応を講じることが必須です。

SQLインジェクションに対して有効な対策をこの記事で紹介しますので、自社で適切な対策を実施できているかどうか、今一度確認しましょう。

 

SQLインジェクションの6つの具体的な対策

SQLインジェクションにはさまざまな対策がありますが、ここでは具体的な6つの方法を紹介します。

 

1.エスケープ処理を行う

エスケープ処理とはプログラム内で特殊な文字として扱われる文字(SQL文内なら「’」シングルクオーテーションや「;」コロン)を人が利用する文字として認識させる手法です。

この処理を行うことによって、攻撃者が不正なSQLの命令を送ってきてもその文字列はSQLの命令文として実行されず、普通の文字列としてデータベースに送られるので、データベース内で意図しないSQL命令が実行されるのを防ぎます。

 

2.プレースホルダを利用する

データベース内に命令を書くときに、プレースホルダを利用するのもSQLインジェクションへの対応として有効です。

プレースホルダを利用すれば、SQLの命令文にユーザー名やパスワードなどの可変値を入れるときに、直接ユーザーが入力したものをSQLの命令文に書き込むのではなく、予め設定した任意の文字列(プレースホルダ)を経由して、ユーザーが入力した文字列をSQL内に入力できます。

そのため、ユーザーが入力した文字列はSQL文として理解できる文字列が入力されていたとしても、その文字列も値として処理されるので不正なSQLの実行が行われません。

 

静的プレースホルダは動的なものに比べてより安全

静的なプレースホルダとは、データベース内で事前に決めた変換処理方法に従って認証などの処理を行う方法です。

静的にユーザー入力の値をデータベース内で変換するため、ユーザーの入力値によってSQL命令文が操作されず安全に処理されます。

これに対し動的なプレースホルダは、ユーザー入力値と事前に設定した構文の変換をアプリケーションの方で実行し、データベースに送信するという手法をとります。

この処理をアプリのライブラリ内で行うので、データベース管理者による静的なプレースホルダの設定ミスなどを防げるというメリットはありますが、ライブラリに脆弱性があるとそこを狙った攻撃に遭う可能性が出てきてしまいます。

よって、静的なプレースホルダは動的なものに比べて安全です。

 

3.入力可能文字に規則を設ける

入力可能文字に規則を設けることも一般的なSQLインジェクション対策として知られています。

これはデータベース管理者が事前にアプリやサイト内で入力できる文字列に規則を設けておくことで、攻撃者がプログラムに必要な文字列の入力をできないようにするものです。

例えば、SQL文では「’」シングルクオーテーションや「;」コロン、「-」ハイフンなどを特殊な文字列として攻撃に利用されます。これらの文字以外の記号と大小英字、数字などを入力可能文字として設定すれば、ユーザーのパスワード強化とサーバーの防御を同時に実現できます。

 

4.WAFを導入する

世の中に存在するサイバー攻撃はSQLインジェクションだけではありません。Web Application Firewall(ウェブ・アプリケーション・ファイアウォール)、通称WAF(ワフ)を導入すればSQLインジェクションだけではなく、多くのサイバー攻撃から自社を守れます。

このWAFはファイアウォールという言葉がつくので、ネットワーク上に設置されるファイアウォールと混同されがちですが、別のものなので注意してください。

一般的にファイアウォールはネットワークの通信を監視しています。通信自体が不正なもの、例えば同じIPから極端に何度もアクセスしてきていたり、普通では考えられない量の通信が行われているときにファイアウォールが通信自体を制御します。

これに対してWAFはアプリケーションの通信内容を監視しています。外部からのリクエストが不正なものではないか、レスポンスの情報の中に誤ったものが含まれていないかなどを監視しているので、攻撃者による不正な命令文の実行や情報の抜き出しを防げます。

しかし、WAFを導入しただけでは安心できません。なぜならサービスに脆弱性がある状態だとWAFが突破されてしまうような巧妙な攻撃を受けたときには、結局サイバー攻撃の餌食になってしまうからです。

このとき非難を受けるのは、サービスの脆弱性を放置していた企業になります。WAFを導入してもサービスの脆弱性に対策を打っておくことは、企業を守るための根本的な対策として必要です。

 

5.サーバーログを常時監視する

サーバーログを常時監視することは 攻撃の早期発見に役立ちます。直接的にSQLインジェクションの被害を受けないための対策にはなりませんが、被害の拡大を未然に防げます。

SQLインジェクションの被害事例」で紹介している決済代行企業から情報が流出してしまった攻撃事例では、実に半年にもわたって攻撃が継続していました。

この事例では以下のようなことが問題として取り上げられました。

 

  • 被害規模が大きかったこと
  • 被害の内容がクレジットカード番号を含む決済情報が流出したこと
  • 攻撃の検知と対応が遅れ、被害を継続的に受けていたこと

 

これらが複合的な問題となり、代表取締役の異動や経済産業省からの行政指導が行われてしまう事態に発展しました。

このような事態を防ぐためには常時サーバーログを監視し、不正な通信や攻撃と思われるアクセスを早期に検知できるシステムを企業内に持っておくことが重要です。

 

6.発見された脆弱性に常に最新の対応をとる

日々新しいプログラムやサービスの機能が開発されると同時に、常に脆弱性が潜む可能性があります。攻撃者はこの隙をいつも狙っているので、脆弱性が見つかり次第すぐに対応することが企業として望ましい姿勢です。

しかし、攻撃も巧妙化しているのでセキュリティを専門としていない企業が常に最新の脆弱性を発見し対処することは非常に難しくなっています。

結果、脆弱性に気づかず放置してしまっている企業が多く、サイバー攻撃の標的になる可能性を秘めています。

サイバー攻撃の標的になる可能性を少しでも小さくするためには、企業は自社が抱える脆弱性を認知して、迅速な脆弱性への対処が必要です。

これを実現するには、まず自社サービスに脆弱性が存在することを定期的に確認する必要があります。

当社の提供するサービス「secuas」では、無料で脆弱性の診断が可能です。URLや企業名など簡単な情報を1分程度入力するだけで、あなたのWebサービスに脆弱性がどのくらいあるか数分で確認できます。

自社のウェブサービスが危険にさらされているかわからない方はぜひご利用ください。

プログラミング言語ごとのプレースホルダ仕様例

プログラミング言語とデータベースの組み合わせの中でもよく利用される2パターンについて、SQLインジェクション対策として非常に有効なプレースホルダがどのような仕様になっているか簡単に確認します。※本項の内容は独立情勢法人情報処理機構(IPA)の「安全なSQLの呼び出し方」を参考にしています。

 

PHPとPostgreSQL

PHPとPostgreSQL、PEAR::MDB2のライブラリの組み合わせでは静的なプレースホルダを利用できます。動的プレースホルダは提供されていないため、動的プレースホルダのエスケープ処理ができません。

つまり、PHPとPostgreSQL、PEAR::MDB2のライブラリの組み合わせであればプレースホルダを利用していれば常に静的になるので、特別な注意点はありません。

 

JAVAとOracle

JAVAとOracleを組み合わせた場合も、PHPとPostgreSQLを組み合わせたときとほとんど同様です。静的なプレースホルダの利用は可能ですが、動的なプレースホルダは提供されておらず動的プレースホルダによるエスケープ処理は行えません。

JAVAとOracleについても、Oracle 社が提供する ojdbc6.jarと組み合わせてプレースホルダを利用していれば静的になるので、プレースホルダの利用に関していえば注意点はありません。

 

企業の信頼を守るための第一歩は脆弱性の把握

企業は常に悪意を持った攻撃者のサイバー攻撃の脅威にさらされており、攻撃を必ず受けないサービスやウェブサイトを作ることは不可能です。そのため、いかに攻撃を受けにくくするか、攻撃を受けてしまったときに被害を最小限に留めるかを考えることが企業の責務です。

仮にサイバー攻撃を受けてしまうと売上やサービスへの影響だけではなく、企業の信頼が傷ついてしまい今後の企業活動に甚大な被害を受ける可能性があります。

こういった被害を受けないためにも、SQLインジェクションだけではなく全てのサイバー攻撃から情報を守る体制を整えておくことが重要です。

そのための第一歩として自社の脆弱性を把握し、脆弱性に対して適切な対応を取ることが有効です。

いくらセキュリティ対策を行っていても、Webサービスの進化と共に必ず新しい脆弱性が生まれます。

過去にセキュリティ対策をしていても、最新の脆弱性に対応していなければ意味がありません。

このように最新の脆弱性に対して正しく対応できているか不安な方は、当社で提供している「secuas」をご利用ください。無料であなたのWebサービスに最新の脆弱性があるかを把握できます。

1分程度の簡単な情報を入力していただければ、数分でWebサービスの脆弱性を発見できるので、企業の信頼を失いたくない方は確認しておいて損はありません。

攻撃者は脆弱性が放置されている企業を常に探しています。危険で悪意のある攻撃から企業情報を守るためにも、ぜひ当社の脆弱性診断「secures」をお気軽にご活用ください。