Open Source Web Development Tutorials - Dev Shed
MySQL&PHPアプリからSQLインジェクションを防ぐ
(2009/03/26公開)
編集部より
この記事については、セキュリティーの観点から一部問題が指摘されています。参照にあたっては、十分注意していただくことをお勧めします。またDevShedの本サイトに投稿された読者の議論を5ページ目に掲載していますので、あわせて参考にしてください。
SQLインジェクションやHTMLフォームの乱用を防止するPHPプログラム
フォームのセキュリティーがしっかりしていなければ、MySQLのSQLインジェクションにより悪意あるコードが開始され、サイトが攻撃にさらされるということは既に知られています。ドロップダウンメニュー、検索ボックス、チェックボックスなどのHTMLフォームはすべて、この種の乱用のエントリポイントとなる可能性があります。この記事では、この種の攻撃がどのように行われ、どうすれば防止できるかについて説明します。
セキュリティーに関する既知の問題点と背景
SQLインジェクションの目的は、Webサイトのデータベースと管理を乗っ取り、情報を盗むことです。MySQLのような一般的なオープンソースデータベースは、パスワード、クレジットカード、ユーザー名、個人情報、管理情報などの重要な情報を格納するために、多くのWebサイト開発者が使ってきました。
これは深刻なハッキングであり、現在多くのWebサイトを脅かしています。Google検索の結果では、警告マークが表示されるので、このようなサイトはすぐに判別できます。「このサイトはコンピューターに損害を与える可能性があります」と表示されたり、Google ChromeやMozilla Firefoxなどのブラウザを使用していると、サイトを表示するときに「悪意のあるソフトウエアが検出されました」などの警告が表示されたりします。
MySQLが一般的なのは、最も広く使用されているサーバー側スクリプト言語であるPHPと組み合わせて使われているのが理由です。またPHPは、インターネットで圧倒的に多く使われているLinux-Apacheベースのサーバーの主要な言語でもあります。このため、Windowsでのスパイウェアと同じく、PHPはハッカーに簡単に利用される傾向があります。
ハッキングでは最初に、セキュリティーが確保されていないWebサイトのフォームに、(ドロップダウンメニューのフォーム、検索ボックス、連絡フォーム、問い合わせフォーム、チェックボックスなどを経由して)悪意のあるコードを組み込みます。ほかの高度なフォームでも、セッション関連のURL経由でなら挿入が可能ですが、この話題はこの記事の範囲外です(手順の詳細については、次のページにあるフローチャートを参照してください)。
次に、悪意のあるコードはMySQLデータベースに転送され、「挿入」されます。この処理がどのように働くかを理解するため、次に示すような基本的な普通のMySQLのSELECTステートメントクエリーについて、考えてみます。
SELECT * FROM xmen WHERE username = 'wolverine'
このクエリーは、「xmen」テーブルを持つデータベースに問い合わせ、MySQLからユーザー名「wolverine」についての特定のデータを返します。
ユーザーがWebフォームで「wolverine」と入力すると、そのデータがMySQLクエリーに渡され、上のステートメントが生成されます。
入力が検証されない場合、ハッカーが入力を操作して、データベースのコントロールを握ることが可能になります。例えば、ユーザー名を次のように設定します。
' OR ''=''
通常のPHPとMySQL構文を使用して入力を処理すれば、悪意のあるコードが入力されるたびに「不正なクエリー」というメッセージが表示され、安全であると思うかもしれませんが、実際にはこれは成り立ちません。
現実には、熟練したハッカーは多数存在し、簡単にセキュリティーの壁を抜けることができます。一度セキュリティーが破られると、それを修正することは困難になります。データベースのクリーニングを行い、管理アクセスを一新する必要があります。
Copyright © 2008 Ziff Davis Enterprise, Inc.
Originally appearing in the U.S. Edition of Dev Shed. All Rights Reserved.








