SQLインジェクション防止





SQLインジェクション(「SQLクエリの構造の整合性の違反」とも呼ばれます)は、セキュリティ問題で最も一般的で最も危険な脆弱性の1つです。 SQLインジェクションは、Webインターフェースを介してシステムへのハッカーの扉を開き、無制限のアクセス(たとえば、テーブルの削除、データベースの変更、社内ネットワークへのアクセスなど)を許可するため、非常に危険です。 SQLインジェクションは純粋にソフトウェアのバグであり、ホストプロバイダーとは関係ありません。 したがって、安全なJSPホスティング、PHPホスティング、またはその他を探していましたが、SQLインジェクションの防止はホストプロバイダーではなく開発者のみが担当することに注意してください。



SQLインジェクションが発生するのはなぜですか?



SQLインジェクションは非常に一般的な問題ですが、皮肉なことに、SQLインジェクションも簡単に防ぐことができます。 SQLインジェクションは非常に広範です。脆弱性が存在する可能性のある場所が非常に多いためです。インジェクションが成功すると、ハッカーは良い報酬を得ることができます(たとえば、データベース内のデータへのフルアクセス)。



SQLインジェクションのリスクは、プログラマがユーザー入力を含むデータベースへの動的クエリを作成するたびに発生します。 これは、SQLインジェクションを防ぐ2つの方法があることを意味します。



•動的データベースクエリを使用しないでください。

•クエリでユーザーデータを使用しないでください。



すべてが単純に思えますが、これらは理論です;実際には、動的クエリを拒否したり、ユーザーデータ入力を除外したりすることは不可能です。 しかし、これは注射を避けることが不可能であることを意味しません。 SQLインジェクションの防止に役立つ、プログラミング言語のトリックと技術的機能がいくつかあります。



SQLインジェクションを防ぐためにできること



決定は特定のプログラミング言語に大きく依存しますが、SQLインジェクションを防ぐための一般的な原則は似ています。 これを行う方法の例を次に示します。



•動的なクエリは、どうしても必要な場合にのみ使用してください。



動的クエリは、ほとんどの場合、準備済みステートメント、パラメーター化されたクエリ、またはストアドプロシージャに置き換えることができます。 たとえば、動的SQLの代わりに、JavaではPreparedStatement()をバインドパラメーターとともに使用でき、.NETではSqlCommand()やOleDbCommand()などのパラメーター化クエリをバインドパラメーターとともに使用でき、PHPでは厳密に型指定されたPDOを使用できますパラメータ化されたクエリ(bindParam()を使用)。



準備済みステートメントに加えて、ストアドプロシージャを使用できます。 準備済みステートメントとは異なり、ストアドプロシージャはデータベースに格納されますが、どちらの場合も、SQLクエリが最初に決定され、パラメーターが渡されます。



•クエリに入力されたデータの検証。



データ入力の検証は、パラメーター化されたクエリとストアドプロシージャよりも効率が低くなりますが、パラメーター化されたクエリとストアドプロシージャを使用する方法がない場合は、入力されたデータを確認することをお勧めします。 入力検証を使用するための正確な構文はデータベースに大きく依存しているため、特定のデータベースのドックを読んでください。



•マジッククオートに依存しないでください。



magic_quotes_gpcパラメーターを有効にすると、一部の(すべてではない)SQLインジェクションを防ぐことができます。 マジッククオートは最後の防御ではなく、さらに悪いことに、時々消されて、あなたはそれを知らないか、それをオンにする能力がありません。 そのため、引用符をエスケープするコードを使用する必要があります。 ジョンリーが提案したコードは次のとおりです。

$username = $_POST['username'];

$password = $_POST['password'];

if (!get_magic_quotes_gpc()) {

$username = addslashes($username);

$password = addslashes($password);

}








•パッチの定期的かつタイムリーなインストール。



コードに脆弱性がない場合でも、データベースサーバー、サーバーオペレーティングシステム、または開発者ユーティリティに脆弱性がある可能性があります。 そのため、特にSQLインジェクションの修正である場合は、常にパッチが表示された直後にインストールする必要があります。



•使用していない機能をすべて削除します。



データベースサーバーは複雑な作成であり、必要以上に多くの機能を備えています。 そして、セキュリティに関する限り、ここでは「より良い」という原則は機能しません。 たとえば、MS SQLの拡張システムプロシージャxp_cmdshellはオペレーティングシステムへのアクセスを提供しますが、これはハッカーにとって単なる夢です。 このため、他の機能と同様に、この機能を無効にする必要があり、機能を簡単に悪用することができます。



•SQLインジェクションを見つけるための自動化ツールの使用。



開発者が上記のすべてのルールに従って、未検証のユーザーデータの動的なクエリを回避したとしても、テストとチェックでこれを確認する必要があります。 SQLインジェクションを検出するための自動テストツールがあり、これらのツールを使用して手順とクエリを検証しない人には言い訳はありません。

SQLインジェクションを検出するためのシンプルなツールの1つ(および多少信頼できるものの1つ)は、 SQL Inject MEと呼ばれるFirefoxの拡張機能です。 この拡張機能をインストールした後、コンテキストメニューで右クリックするか、メニューの[ツール]→[オプション]からツールを使用できます。 SQL Inject MEワークスペースは次のスクリーンショットに示されており、実行できるテストの種類を確認できます。











実行するテストとパラメーターを選択できます。 テストの終了時に、テスト結果に関するレポートが表示されます。



SQL Inject ME拡張機能に設定できる多くのパラメーターは、次の2つのスクリーンショットに示されています。











ご覧のように、SQLインジェクションの潜在的な脆弱性のコードをクリアするために取ることができる多くのソリューション(とりわけ、すべて単純なもの)があります。 これらの単純なことを無視しないでください。 セキュリティだけでなく、ホストプロバイダーでホストされているすべてのサイトが危険にさらされます。



All Articles