TEDIA会員に登録したメールアドレスとパスワードを入力してください

メールアドレス:

     パスワード:


パスワードを忘れた方はパスワードの確認を行ってください。

TEDIA会員へのご登録がお済みで無い方はこちらで登録ができます


>> テクノロジーポータル TEDIA トップページへ戻る <<

Think IT Software Developer's Think IT Find-IT 失敗しないソフト選び Find-IT TEDIA テクノロジーポータル TEDIA インストールマニアックス2008 インストールマニアックス2008

TEDIA SponsorsOpen Source Web Development Tutorials - Dev Shed

MySQL&PHPアプリからSQLインジェクションを防ぐ
(2009/03/26公開)

ユーザー入力のフロー(検証のない場合)

 ユーザー情報のフローを図示すると、MySQLとPHPの初心者にも理解しやすくなります。ユーザー入力が検証されない場合に何が起きるかを、次の画面ショットに示します。

 データベースからマルウエアが削除された後でも、Webサイトの入力フォームが検証されなければ、Webサイトがまた攻撃されてしまいます。SQLインジェクション攻撃に関する一般的な誤解として、次の2つがあります。

1.Webマスターは、「アンチウイルスやアンチスパイウェアを使えば、挿入されたマルウエアを消去できる」と考えています。実際には、期待するような消去はできません。この種の感染がMySQLデータベースの弱点を利用しているためです。これは、アンチウイルスやアンチスパイウェアのプログラムによって単純に削除できません。

2.「SQLインジェクションは、感染したファイルを別のサーバーや外部のソースからコピーすることによって起きるウイルスへの感染だ」と思われています。実際には、そうではありません。この種の感染は、誰かがWebサイトの保護されていないフォームに悪意のあるコードを入力し、その後データベースへのアクセスを許可された結果として起きるものです。SQLインジェクションの結果として起きるウイルスへの感染を消去するには、アンチウイルスプログラムを使うのではなく、悪意のあるスクリプトを削除しなければなりません。

ユーザー入力のフロー(検証のある場合)

 クリーンなデータベースをバックアップし、サーバーの外部に保管することが非常に重要です。例えば、MySQLテーブルのセットをエクスポートし、デスクトップに保存するのはごく簡単です。そのデータベースが、目的のエントリを正確に含み、クリーンであることを十分に確認してください。

 次に、サーバーに移動して、フォーム入力を一時的に停止します。これは、フォームがデータを受け付けて処理できなくなることを意味するので、Webサイトもシャットダウンする必要があります。

 次に、クリーンアップ処理を開始します。まずサーバーで、SQLインジェクションによって引き起こされた、正常でない部分をクリーンアップします。データベース、FTP、Webサイトのパスワードをすべて変更します。

 最悪のシナリオでは、クリーンアップが遅かった場合、サーバー上でバックドアとなるプログラムが実行されていないかどうかも十分にチェックする必要があります。これらのバックドアプログラムは、ハッカーによりインストールされた、何らかの形のトロイの木馬です。これらを完全に削除し、すべてのFTPアクセス許可を、ハッカーがどのディレクトリにも簡単にファイルを書き込めないように変更します。サーバーにトロイの木馬や、ほかのマルウエアがインストールされていないかをチェックするためのスキャンを行います。特に最悪のケースのシナリオでは、これらは隠されていることがあります。

 この場合、フォームのデータを処理するPHPスクリプトを変更します。MYSQLのSQLインジェクションを防止するための適切な方針は、「ユーザーのデータを絶対に信用しない」ことです。インターネットは公共の場所であり、フォームは善意悪意を問わずあらゆる種類の人々に公開されることを思い出してください。フォームは家のドアのようなもので、犯罪者が入り込むことを避けるため、家にいないときは鍵をかけておく必要があります。

 SQLインジェクションを防止し、データベースに送られるすべての入力が正当なもので、データベースにエラーや感染を引き起こさないことを保証するためにも、ユーザー入力の認証が重要です。

 ユーザー入力の検証で行われる処理を次に示します。

 上の例では、ユーザー入力が正当なものであることが検証されるまで、データはMySQLデータベースに送られません。ユーザー入力に適用するフィルターの設計方法はアプリケーションによって異なりますが、役に立つヒントの概要を以下に示します。

1.フォームへの入力が数値の場合、その値が0.001以上かどうかをテストするだけで、数値かどうかを検証できます(0を受け付けない場合)。

2.入力が電子メールアドレスの場合、許容される文字、つまり@、A~Z、a~z、または数字のみが含まれていることで検証できます。引用符は電子メールアドレスに使用できません。

3.入力が個人の名前やユーザー名の場合、‘ ’や*などの不正な文字が含まれていないことを検証します。これらの文字は、悪意のあるコードがSQLインジェクションを行うために使われます。


前のページ     1    2    3    4    5    次のページ

Copyright © 2008 Ziff Davis Enterprise, Inc.
Originally appearing in the U.S. Edition of Dev Shed. All Rights Reserved.