ホームページ > テクノロジー周辺機器 > IT業界 > SQLインジェクション攻撃からウェブサイトを保護する方法

SQLインジェクション攻撃からウェブサイトを保護する方法

Lisa Kudrow
リリース: 2025-02-18 09:09:09
オリジナル
885 人が閲覧しました

How to Protect Your Website Against SQL Injection Attacks

sqlインジェクション攻撃:キーポイント

SQLインジェクション攻撃は、ウェブサイトのセキュリティ脅威です。攻撃者は、データベースを攻撃するために脆弱性を活用します。

SQLインジェクション攻撃を防ぐために、ユーザーの入力を信頼しないでください。潜在的な攻撃パターンがあるかどうかを常に確認してください。これには、テキスト入力だけでなく、非表示の入力、クエリ文字列パラメーター、Cookie、およびファイルアップロードも含まれます。

ユーザー入力は、サーバー側で検証して、そのタイプが正しいことを確認し、潜在的な悪意のあるコマンドを排除する必要があります。これは、SQLコマンドを変更する可能性のある入力にエスケープ文字を追加したり、SQLコマンドのユーザー入力をコマンドパラメーターに置き換える可能性のある入力に入力を追加するなど、さまざまな方法で達成できます。

潜在的な脆弱性についてウェブサイトコードを定期的に確認することが重要であり、SQLインジェクション攻撃の準備も重要です。潜在的な損害を制限するための手段には、管理者の権利の使用を避け、機密データの暗号化、絶対に必要な場合に備えて機密データを保存しないことが含まれます。

その他の保護対策には、読み取りおよび書き込みデータベース操作に個別の接続を使用し、特定のIPアドレスへのユーザーアカウントアクセスの制限、MS SQLサーバーのWindows認証モデルの使用、SHA-2パスワードハッシュなどの強力なアルゴリズムを使用します。

How to Protect Your Website Against SQL Injection Attacks

この記事をレビューしてくれたChris LienertとGuido Tonnaerに感謝します。

Webサイトに対するすべての攻撃の中で、SQL注入は最も危険で一般的なものであり、過去1年間に企業や組織に実際の損害を引き起こすために使用されています。このプログラムは、TalkTalk、VTech、The Wall Street Journal、米国政府など、有名な組織や企業を攻撃するために使用されています。

要するに、SQLインジェクション(SQLIとも呼ばれる)は、Webサイト入力チャネルの脆弱性を悪用して、最も敏感で価値のある情報を保存するWebアプリケーションバックエンドのデータベースを攻撃します。攻撃者は、このスキームを使用して、データを盗んだり改ざんしたり、アプリケーション機能を妨げたり、最悪の場合にデータベースサーバーへの管理アクセスを取得したりできます。

ここに、SQLインジェクションとその攻撃からウェブサイトを保護する方法について知っておくべきことがあります。

sql噴射攻撃はどのように機能しますか

SQLインジェクション攻撃は、Webリクエストを介して悪意のあるSQLコマンドをデータベースサーバーに送信することにより実行されます。入力チャネルは、フォーム要素、クエリ文字列、Cookie、ファイルなどの悪意のあるコマンドを送信するために使用できます。

それがどのように機能するかを理解するには、ユーザー名とパスワードを受け入れるログインフォームがあるとします:

How to Protect Your Website Against SQL Injection Attacks

ユーザーが資格情報を入力して「ログイン」ボタンを押すと、情報はWebサーバーに公開され、SQLコマンドと組み合わされます。たとえば、PHPでは、コードは次のようになります。

$sql_command = "select * from users where username = '" . $_POST['username']; 
$sql_command .= "' AND password = '" . $_POST['password'] . "'"; 
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
コマンドはデータベースサーバーに送信され、生成されたデータセットは、ユーザー名とパスワードが有効なユーザーアカウントに対応するかどうかを判断します。ユーザー名としての平均ユーザー入力「John」、パスワードとしての「123456」は(ちなみに、そのパスワードを使用しないでください)次のコマンドに変換されます。

しかし、ユーザーが次のような他の何かを試すことを決定した場合:
SELECT * FROM users WHERE username='john' AND password='123456' 
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

生成されたコマンドは次のようになり、常に空でないデータセットを返します:How to Protect Your Website Against SQL Injection Attacks

このコードスニペットにより、ユーザーは正しい資格情報を持たずにログイン画面をバイパスできる場合があります。

SELECT * FROM users WHERE username='john' OR 1=1; -- ' AND password='123456' 
ログイン後にコピー
これは、SQL注入の最も簡単な形態の1つです。もう少しの労力で、同じユーザーが新しいユーザーアカウントを挿入したり、既存のユーザーアカウントを削除または変更できます。結果が表示されているページでは、同じスキームを使用して、元々は通常の訪問者による視界に限定されていたレコードや情報を表示したり、レコードの内容を変更したりすることができます。

より深刻な場合、攻撃者は、管理者アカウントを介してデータベースサーバーに接続すると、サーバーのオペレーティングシステムを完全に破壊することさえできます(MySQLの「ルート」やMS SQLサーバーの「SA」など)。 Windowsサーバーでは、XP_CMDSHELLなどの拡張ストアドプロシージャを実行する攻撃者として現れることがあります。あるケースでは、攻撃者はSQLインジェクションの脆弱性を悪用して、感染したサーバーでユーザーアカウントを作成し、リモートデスクトップ機能を有効にし、SMB共有フォルダーを設定し、マルウェアをアップロードします。実際、データベースに保存されているすべてを台無しにします。

ユーザー入力チャネルはSQLインジェクション攻撃の主要な媒体であるため、ほとんどの防御には、攻撃パターンのユーザー入力の制御と検閲が含まれます。

以下は、ユーザーの入力が安全であることを保証できるいくつかの測定値です。 ユーザーの入力を信用しないでください

ユーザー入力に関する主要なルールは「不信と検証」です。つまり、これが当てはまらないことが証明されていない限り、あらゆる形態のユーザー入力は悪意があると見なされるべきです。これは、テキスト領域やテキストボックスなどの単純な入力ボックスだけでなく、隠れ入力、文字列パラメーターのクエリ、Cookie、ファイルのアップロードなど、他のすべてのものでも機能します。

ブラウザのユーザーインターフェイスがユーザーが入力を操作できないからといって、改ざんできないという意味ではありません。 Burp Suiteなどのシンプルなツールにより、ユーザーはHTTP要求をキャプチャして、サーバーに送信する前に非表示のフォーム値を含むものを変更できます。 Base64を介してデータをエンコードするのに十分賢いと思われる場合、悪意のあるユーザーは簡単にデコード、変更、およびリコードできます。

サーバー側の入力文字列を確認します

検証とは、ユーザーが正しいタイプの入力を提供し、入力文字列に埋め込まれている可能性のある悪意のあるコマンドを排除することを確認するプロセスです。たとえば、PHPでは、mysql_real_escape_string()を使用して、SQLコマンドの性質を変更する可能性のある文字を逃れることができます。

上記のログインコードの変更されたバージョンは次のとおりです。

$sql_command = "select * from users where username = '" . $_POST['username']; 
$sql_command .= "' AND password = '" . $_POST['password'] . "'"; 
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
この単純な変更により、悪意のあるユーザーが意図的に追加した単一の引用符の前にEscape Charales()を追加することにより、コードを攻撃から保護します。

検証に関する少しのメモ:クライアント検証関数を追加すると、素晴らしい仕事ができます。ただし、SQLインジェクション攻撃に対する防御として依存しないでください。クライアント関数は、サーバーへの悪意のある入力をより難しくする可能性がありますが、前述のブラウザの調整やツールを使用すると簡単に回避できます。そのため、サーバー側の検証で補完する必要があります。

いくつかのプログラミングプラットフォーム(ASP.NETなど)には、ページのポストバック時に悪意のあるコンテンツのユーザー入力を自動的に評価する組み込み機能が含まれています。しかし、ハッカーは十分なスキルと綿密さでそれらを回避できるため、独自のセキュリティチェッカーを介してユーザーの入力を実行する必要があります。あなたは決して慎重になることはありません。

コマンドパラメーターを使用

>を使用します

エスケープよりも優れた代替手段は、コマンドパラメーターを使用することです。コマンドパラメーターは、SQLコマンドにプレースホルダー名を追加することによって定義されます。これは、後でユーザー入力によって置き換えられます。 ASP.NETは、この目的のために非常に直感的で使いやすいAPIのセットを提供します。

以下は、コマンドパラメーターを使用してWebサイトをSQLインジェクション攻撃から保護する方法を示すC#に記述されたコードです。

最初にSQLCommandオブジェクトを作成し、@Parameter_Nameパラダイムをコマンド文字列に使用します。この文字列には、ユーザー入力を挿入する必要があります。
SELECT * FROM users WHERE username='john' AND password='123456' 
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

次に、コマンド文字列と直接連結するのではなく、SQLParameterオブジェクトのインスタンスを作成し、ユーザー入力を挿入します。

最後に、SQLParameterオブジェクトをSQLCommandオブジェクトのパラメーターコレクションに追加します。これにより、パラメーターを提供された入力に置き換えます。 ADO.NETは、残りの作業を担当しています。

PHPでは、同等のものは前処理ステートメントであり、ASP.NETのカウンターパートよりも複雑です。ここで探索できます。

入力の説明的変換

このトリックは、PHPのような弱いタイプの言語で機能します。つまり、通常、変数のデータ型を定義しないことを意味し、言語は異なるデータ型の変換を互いに自動的に処理します。

説明変換は、非弦の型が関与しているときに入力を逃れるためのショートカットとして使用できます。したがって、ユーザーにAGEパラメーターのINTを入力する場合は、PHPで次のコードを使用して、入力が安全であることを確認できます。

このコードスニペットは、入力のタイプのみを検証し、その範囲ではないことに注意してください。したがって、ユーザーが負の年齢、または1300などの非現実的な年齢を入力しないことを確認するために、他のコードを実行する必要があります。

さらに、別のベストプラクティスは、非ストリング入力を含むSQLコマンドで単一の引用符を使用しないことです。したがって、次のコードを使用しないでください...

$sql_command = "select * from users where username = '" . $_POST['username']; 
$sql_command .= "' AND password = '" . $_POST['password'] . "'"; 
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

…次のコードを使用する方が安全です。

SELECT * FROM users WHERE username='john' AND password='123456' 
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

一般的なプラクティスとして、各ページのコードをチェックして、ページのコンテンツ、コマンド、文字列などをユーザーから来る可能性のあるソースと組み合わせた場所を確認する必要があります。ソースコードを脆弱性とセキュリティの脆弱性を確認することは、ソフトウェア開発プロセスに固有の部分である必要があります。

あなたの最後の防衛線 Webサイトのセキュリティをどのように強化しても、SQL注入が発生した日に備えなければなりません。結局のところ、サイバーセキュリティ業界でよく知られているように、ディフェンダーはすべての戦いに勝つ必要がありますが、ハッカーは一度だけ勝つ必要があります。

SQL注射の犠牲者になったときの損傷を最小限に抑えるためのヒントをいくつか紹介します。 管理者の権限を避けます

「ルート」または「sa」アカウントを使用してWebアプリケーションをデータベースサーバーに接続することは、最も深刻な間違いの1つです。すでに述べたように、妥協した管理者アカウントは、ハッカーにシステム全体にアクセスできるようになります。 ADMIN以外のアカウントでさえ損傷を引き起こす可能性があります。これは、特にデータベースサーバーが異なるアプリケーションとデータベース間で共有されている場合、サーバー内のすべてのデータベースにアクセスできます。

したがって、ウェブサイトのバックエンドにある特定のデータベースに簡単な読み取りおよび書き込みアクセス許可を持つアカウントを使用する方が良いため、WebサイトがSQLインジェクションでハッキングされている場合、損傷の範囲はそれに限定されます。範囲内の単一のデータベース。

より高度なアプローチは、データベースから読み取りまたは書き込み、各セグメントの権限と役割をさらに削減するコードセグメントに個別の接続を使用することです。たとえば、リストページ(データベースを変更するのではなく、検索パラメーターを使用して広く使用)をデータベースへの読み取り専用接続を使用してエンコードして、コードの障害抵抗をさらに強化できます。

MySQLでは、ユーザーアカウントへのアクセスを特定のIPアドレス範囲(「%」モデルではなく)に制限して、リモートの場所から損傷したアカウントへのアクセスを防ぐことにより、セキュリティが改善されます。

さらに、SQL Serverの高度な機能を使用する予定がない限り、高価な「ローカルシステム」アカウントではなく、制限付きアカウントを使用するようにWindowsサービスをセットアップすることをお勧めします。 「SA」アカウントが壊れている場合、これにより損害が最小限に抑えられます。

機密データを暗号化します

データベース内の機密データを暗号化します。これには、パスワード、セキュリティの質問と回答、財務データ、健康情報、および悪意のあるアクターに役立つ可能性のあるその他の情報が含まれます。これにより、ハッカーがデータを手元に持っていても、すぐにそれを活用できないことが保証され、脆弱性を発見し、脆弱性をプラグインし、強制的なパスワードリセットなどの他の反応を行う時間が与えられます。攻撃を受けている人は、解読の前にその価値を失います。

パスワードをハッシュしている場合は、SHA-2のような強力なアルゴリズムを使用してください。これはまもなくパスワード保護の業界標準になります。 MD5とSHA-1は時代遅れで、逆転することができます。

他の形式の暗号化については、キーを保存し、単一の賭けをしない場所に注意してください。キーが暗号化されたデータのすぐ隣にあり、ハッカーがサーバーが侵害されると簡単にアクセスできる場合、暗号化を使用することには意味がありません。

必要でない場合は、機密データを保存しないでください

データベースに情報を保存するときはいつでも、情報が悪い人の手に渡った場合にどの程度の損害が発生するかを検討し、実際に保存する必要があるかどうかを決定します。 Ashley Madison Hackerは、約3,700万人の暗い秘密とほとんどの個人情報をインターネットに漏らし、データベースから機密情報を削除できなかったこともあります。

したがって、一番下の行は、実際に必要な場合を除き、データベースに機密情報を保存しないでください。それでも、それがもはや役に立たないときにメッセージを削除します。

最終的な考え

SQLインジェクションは何十年も前から存在しており、今後数年間で脆弱性のランキングを維持し続ける可能性があります。それはあなたとあなたのユーザーをそれから保護するためのいくつかの単純な、しかし慎重に計算された手順を必要とします、そして、それはセキュリティ侵害のためのソースコードをレビューする際にあなたの最優先事項の1つであるべきです。

次の大規模なSQLインジェクションデータ侵害の犠牲者であることを避けるための鍵は、1つ目が「when」ではなく「いつ」を制御および検証することです。

SQLインジェクション攻撃からWebサイトを保護するFAQ

SQLインジェクション攻撃から私のウェブサイトを保護するための最初のステップは何ですか?

SQLインジェクション攻撃からウェブサイトを保護する最初のステップは、SQLインジェクションとは何かを理解することです。 SQLインジェクションは、攻撃者が実行のために入力フィールドに悪意のあるSQLステートメントを挿入するために使用するコードインジェクション技術です。これにより、機密データ、データの損失、さらにはデータの破損への不正アクセスにつながる可能性があります。これを理解したら、入力検証、パラメーター化されたクエリ、ストアドプロシージャを使用してWebサイトを保護するなどの測定値を実装できます。

入力検証は、SQLインジェクション攻撃の防止にどのように役立ちますか?

入力検証は、ユーザー入力の構文、コンテンツ、および論理値を定義する方法です。これを行うことにより、攻撃者が悪意のあるSQLコードをWebサイトの入力フィールドに挿入することを防ぐことができます。これは、入力検証プロセスが定義された基準を満たさない入力を拒否するためです。

パラメーター化されたクエリとは何ですか? SQL注射攻撃をどのように防止しますか?

パラメーター化されたクエリは、値を表すためにプレースホルダーを使用し、実行時に値自体が提供されるSQLクエリの一種です。これは、攻撃者が悪意のあるSQLコードを挿入しようとしたとしても、SQLコマンドの一部ではなく、文字通りの文字列として扱われることを意味します。これにより、SQL注入攻撃が効果的に防止されます。

ストアドプロシージャは、SQL注入攻撃の防止にどのように役立ちますか?

ストアドプロシージャは、データベースに保存されているSQLステートメントであり、アプリケーションで呼び出すことができます。データベースへの直接アクセスを許可しないため、SQLインジェクション攻撃の防止に役立ちます。代わりに、SQLコマンドとして実行されないパラメーターを使用するため、注入されたSQLコードが実行されないようにします。

SQLインジェクション攻撃の防止においてエラー処理はどのような役割を果たしますか?

正しいエラー処理は、データベース構造またはSQL構文に関する情報を明らかにしないことにより、SQLインジェクション攻撃を防ぐのに役立ちます。これは、エラーが発生すると、エラーメッセージが攻撃者にデータベース構造またはSQL構文に関する手がかりを提供し、攻撃を改善するために使用できるためです。

最小許可原則を使用して、SQLインジェクション攻撃からWebサイトを保護するにはどうすればよいですか?

最小許可原則とは、意図した機能を実行するために必要なアクセス許可をユーザーアカウントまたはプロセスのみに提供することを意味します。たとえば、ユーザーアカウントがデータベースのデータのみを読み取る必要がある場合、書き込みアクセスを許可する必要はありません。これは、攻撃者が脆弱性を活用しようとするときにできることを制限することにより、SQL注入攻撃を防ぐのに役立ちます。

SQLインジェクション攻撃の防止において、定期的な更新はどのような役割を果たしますか?

SQL注入攻撃を防ぐには、通常、既知の脆弱性のパッチが含まれているため、定期的な更新が重要です。ソフトウェアを最新の状態に保つことにより、SQLインジェクション攻撃によって悪用される可能性のある既知の脆弱性から保護されるようにすることができます。

Webアプリケーションファイアウォールを使用して、WebサイトをSQLインジェクション攻撃から保護するにはどうすればよいですか?

Webアプリケーションファイアウォール(WAF)は、Webアプリケーションとインターネット間のHTTPトラフィックをフィルタリングおよび監視することにより、SQLインジェクション攻撃からWebサイトを保護するのに役立ちます。 HTTPリクエストで悪意のあるSQLコードを検出することにより、SQLインジェクション攻撃を識別およびブロックできます。

侵入検知システムは、SQLインジェクション攻撃の防止においてどのような役割を果たしますか?

侵入検知システム(IDS)は、ネットワークトラフィックを監視し、疑わしい活動を検出することにより、SQL注入攻撃を防ぐのに役立ちます。 IDSが潜在的なSQLインジェクション攻撃を検出した場合、管理者に攻撃を防ぐための措置を講じるよう警告することができます。

暗号化を使用して、SQLインジェクション攻撃からWebサイトを保護するにはどうすればよいですか?

暗号化は、攻撃者が機密データを読むことを難しくすることにより、SQLインジェクション攻撃からウェブサイトを保護するのに役立ちます。攻撃者がSQLインジェクションの脆弱性を悪用したとしても、それを使用するためにデータを復号化する必要があります。

以上がSQLインジェクション攻撃からウェブサイトを保護する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート