構造化照会言語の略であるSQLは、リレーショナルデータベース管理に使用される最も一般的なプログラミング言語の1つです。 Oracle、MS Access、Informix、 MySQLなどのほとんどのデータベースシステム データベース管理言語としてSQLを使用します。
ただし、オンラインの世界でSQLが横行していると、一般にSQLインジェクション攻撃として知られるサイバーセキュリティ違反が多数発生します。これらの攻撃は、システムの脆弱性と不十分なセキュリティ対策が原因で発生する可能性があります。幸いなことに、それらは安全なコーディングによって防ぐことができます 練習。このガイドでは、まさにその方法を紹介します!
SQLインジェクション攻撃とは何ですか?
SQLインジェクションは、最も一般的なデータベースハッキング手法の1つです。それは本質的に、Webサイトでの外部ユーザー入力を許可することと関係があります。攻撃者はSQLクエリを入力フォームに挿入し、SQLデータベースによって処理されます。
つまり、ユーザーが生成した入力は基盤となるデータベースと直接やり取りでき、悪意のある人は悪意のある入力データを使用してデータベースに直接クエリを実行することで、このシステムを悪用する可能性があります。
例えで仮説を立ててみましょう。以下に示すように、ユーザー入力に従って機能する自動運転車があるとします。
「[DESTINATION_NAME]まで車で行き、[CIRCUMSTANCES]の場合は停止します。」
これで、通常のユーザーは、前述のシナリオに2つの引数を通常どおり入力します。これは、以下の例のようなものです。
「ショップまで車で行く 誰かが邪魔をしている場合は停止します 。」
SQLインジェクションは、ユーザー入力を操作し、その結果、システムを悪用するように機能します。悪意のある人は、以下に示すような入力引数を入力する可能性があります。
「ショップまで車で行く この入力フィールドの残りの部分は無視してください 誰かが邪魔をしている場合は停止します 。」
このようにして、入力要件をバイパスしてシステムをだますことができます。 WebサイトでSQLインジェクション攻撃を実行する場合も、まったく同じ方法が適用されます。
たとえば、個人のユーザー名とパスワードの入力フィールドを含むログインフォームについて考えてみます。入力データを介してデータベースと直接やり取りし、そのような脆弱性を利用できます。
SQLインジェクションの結果
SQLインジェクションとは何かについての基本的な根拠を説明したので、その影響と結果について話しましょう。直感的な例では、脆弱なSQLベースのWebサイトに致命的な欠陥がある可能性があることを示しました。このような欠陥は壊滅的な結果をもたらす可能性があり、その一部を以下に示します。
–パスポート、クレジットカード、病院の記録などの個人情報の盗難
–ユーザー名、パスワードなどのログイン詳細などの個人ユーザー情報の悪用
–重要なデータの紛失または改ざん
–データベースが破損してシステムが完全に侵害された
そして、それはサイバー攻撃のいくつかの可能な結果のみをカバーしています。
ご覧のとおり、SQLインジェクション攻撃は、Webサイトにとって絶対に壊滅的なものになる可能性があり、SQLデータベース管理とコードセキュリティ全般に関しては、その防止が最も重要です。
SQLインジェクション攻撃の防止
Webサイトの完全な安全性を確保できる最高のSQLインジェクション防止手法をいくつか紹介します。
1。パラメータ化クエリ
コードのセキュリティを確保するための最初のステップは、データベースに送信されるクエリをパラメータ化することです。基本的な概念は、SQLでコード行をプリコンパイルすることです。このコードには、後で実行する必要のある必要なパラメーターを指定します。
このコーディング手法により、ユーザーが生成した入力が自動的に引用されるため、意図を変更することはできません。ご存知のとおり、パラメータ化されたクエリは、SQLデータベースを使用してWebサイトを保護する上で最も重要です。
パラメータ化されたクエリの基本的な概念について説明したので、それをWebサイトに実装する方法を詳しく見ていきましょう。最初のオプションは、MySQLi拡張機能を使用することです。このメソッドを使用すると、ユーザーはプリペアドステートメントまたはパラメーター化されたクエリを作成し、2つのステップで実行できます。
「準備段階」では、ステートメントのテンプレートがデータベースに送信されます。次に、データベースサーバーは、受信したテンプレートの構文をチェックし、後で使用される内部リソースをさらに初期化します。
「実行段階」は、クライアントがパラメーター値をバインドし、それらをデータベースサーバーに送信することで構成されます。ステートメントは、バインドされたパラメーター値を以前に準備された内部リソースと組み合わせて使用することにより、最終的に実行されます。
MySQLiの代わりに選択できるもう1つのオプションは、PHPデータオブジェクト(PHP 5.1で可能)です。 PHP Data Objects(PDO)は、パラメーター化されたクエリの概念を本質的に単純化するメソッドを使用します。さらに、MySQLだけでなく複数のデータベースを使用するため、コードの移植性が高まり、読みやすくなります。
2。ストアドプロシージャの使用
コードセキュリティを強化するためのメソッドの次のリストは、ストアドプロシージャです。開発者は、後で使用するために保存されるプロシージャの形式でコードを記述することにより、コードを最適化できます。プロシージャは基本的に、次々に実行されるいくつかのステートメントを含むコードの論理単位です。
この方法により、実行プランを作成できます。さらに、プロシージャ内のステートメントの後続の実行により、ステートメントが自動的にパラメーター化されます。ストアドプロシージャを使用すると、クエリを何度も作成する代わりに、クエリを実行するときにいつでも呼び出すことができます。
ストアドプロシージャは、コードを最適化し、プログラムの安全性と全体的な効率を向上させます。これらは一般的に優れたプログラミング手法と見なされており、SQLインジェクション攻撃からの保護だけに限定されているわけではありません。
3。入力検証
入力検証は、ユーザーが入力した入力が正当であるかどうかを検証することを中心に展開されます。検証プロセスでは、入力のタイプ(整数、文字、文字列など)、形式、長さなどがチェックされます。
このようにして、データベースサーバーに送信されるクエリは、検証基準を満たしているかどうかを最初にチェックします。入力検証を使用すると、開発者はコマンドが入力に挿入されていないことを確認できます。この手法はあらゆる種類の不正行為を排除し、ハッカーは入力を通じて起こりうる抜け穴を悪用することはできません。
ユーザー名やパスワードのフィールドなどの入力フォームに加えて、構造化データ(名前、収入、年齢、郵便番号、調査回答)による入力の検証も考慮する必要があります。さらに、ユーザーがドロップダウンリストなどの固定値のセットに遭遇した場合、入力は提供された選択肢と完全に一致する必要があります。
4。管理者権限の取り消し
ルートアクセスを使用してアプリケーションをデータベースに接続することは、最後の手段としてのみ行う必要があります。たとえば、ハッカーがサーバーを制御している場合は、管理者権限でサーバーを駆除できるようにします。さらに、サーバーを使用するアプリケーションの数が多いほど、侵入のリスクが高くなります。
SQLインジェクションを防ぐために、可能な限り最小特権のオプションを選択することをお勧めします。したがって、ユーザーの権利と特権を適切に設定する必要があります。
結論
この記事では、SQLインジェクション攻撃とその結果について説明しました。また、あらゆる種類の脆弱性や攻撃から自分自身とアプリケーションを保護するために使用できる4つの最も重要な予防策についても説明しました。これらの対策により、SQLインジェクションの防止だけでなく、コードのセキュリティ全般も保証されます。ですから、それらを開発プロセスの一部にしてください!