この記事では主にphpのSQLインジェクションの脆弱性の例を紹介しますので、開発時に皆さんも注意してください
Web サイトを開発する場合、セキュリティ上の理由から、ページから渡される文字をフィルタリングする必要があります。通常、ユーザーは、URL アドレス バー、ログイン インターフェイス、メッセージ ボード、検索ボックスなどのインターフェイスを通じてデータベースのコンテンツを呼び出すことができます。これにより、ハッカーが悪用する機会が多くなります。最悪の場合、データが漏洩したり、サーバーがダウンしたりする可能性があります。 1. SQLインジェクションの手順 a) インジェクションポイントを見つける (ログインインターフェイス、メッセージボードなど) b) ユーザーが自分で SQL ステートメントを構築します (例: ' または 1=1#。これについては後で説明します)。 c) SQL ステートメントをデータベース管理システム (DBMS) に送信します。 d) DBMS はリクエストを受信し、リクエストをマシンコード命令に解釈し、必要なアクセス操作を実行します。 e) DBMS は返された結果を受け取り、処理してユーザーに返します。 ユーザーは特別な SQL ステートメントを作成するため、(SQL ステートメントが十分に柔軟である限り) 特別な結果が返される必要があります。 以下では、例を通して SQL インジェクションを説明します。 2. SQL インジェクション例の詳細な説明 (上記のテストは、サーバー上で magic_quote_gpc が有効になっていないことを前提としています) 1) 準備作業 まず、SQL インジェクションの脆弱性を利用してバックエンド管理者インターフェイスにログインする方法を示します。 まず、テスト用のデータ テーブルを作成します。 コードは以下のように表示されます。 作成可能な `users` ( `id`int(11) NOT NULL AUTO_INCREMENT、 `ユーザー名`varchar(64) NOT NULL、 `password`varchar(64) NOT NULL、 `email`varchar(64) NOT NULL、 主キー (`id`)、 UNIQUEKEY `ユーザー名` (`ユーザー名`) )ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1; テスト用のレコードを追加します。 コードは以下のように表示されます。 INSERTINTO ユーザー (ユーザー名、パスワード、電子メール) VALUES('MarcoFly',md5('test'),'marcofly@test.com'); 次に、ログイン インターフェイスのソース コードを貼り付けます。 コードは以下のように表示されます。