コンテンツにスキップこのブラウザーはサポートされなくなりました。サポートを利用できます。インスタンスに渡して解析と実行の対象とする文字列に、悪意のあるコードが挿入される攻撃です。ステートメントを構成するすべてのプロシージャにおいて、インジェクションに対する脆弱性を検証する必要があります。高いスキルを持つ決然たる攻撃者は、パラメーター化されたデータであっても操作できるのです。コマンドと連結されて実行されるユーザー入力変数にコードを直接挿入することにより行われます。それほど直接的ではない攻撃では、悪意のあるコードが、テーブル内の記憶領域に格納される文字列に挿入されたり、メタデータとして挿入されたりします。コマンドに後で連結された場合、悪意のあるコードが実行されます。プロセスは、途中でテキスト文字列を終了し、新しいコマンドを追加することによって行われます。後続のテキストは実行時には無視されます。インジェクションを示しています。クエリが作成されます。ユーザーは、都市の名前を入力するように要求されます。Redmond」と入力した場合、スクリプトによって構築されたクエリは次のようになります。ユーザーが次のように入力するとします。この場合、スクリプトによって構築されたクエリは次のようになります。前のクエリの終了と次のクエリの開始の区切りを示します。現在行の残りの部分はコメントであるため無視されることを意味します。変更されたコードが構文的に正しい場合、このコードはサーバーによって実行されます。Redmondであるレコードをすべて選択します。OrdersTableを削除します。コードが構文的に正しい限り、改ざんをプログラムによって検出するのは不可能です。コマンドを実行するコードを注意深く確認する必要があります。プラクティスについて説明します。型、長さ、形式、および範囲をテストすることによってユーザー入力を必ず検証してください。悪意のある入力を未然に防ぐには、アプリケーションのアーキテクチャおよび配置シナリオについて検討する必要があります。セキュリティで保護された環境で実行するようにデザインされたプログラムでも、セキュリティで保護されていない環境にコピーされる可能性があることに注意してください。プラクティスとして検討してください。アプリケーションによって受信されるデータのサイズ、型、内容を推測で処理しない。次のような評価を行う必要があります。ファイルが入力された場合、アプリケーションはどのような動作をするか。フィールドに埋め込まれている場合、アプリケーションはどのような動作をするか。入力のサイズとデータ型をテストし、適切な制限を適用する。オーバーランを防ぐのに役立ちます。文字列変数の内容をテストし、予測される値のみを受け入れる。シーケンス、およびコメント文字を含む入力は拒否します。オーバーランをねらった攻撃に対する防御にもなります。ドキュメントを扱う場合、入力時にすべてのデータをスキーマに照らして検証する。ステートメントをユーザー入力から直接ビルドしないでください。プロシージャを使用して、ユーザー入力を検証する。多層環境では、信頼関係ゾーンへ入る前にすべてのデータを検証する必要がある。検証プロセスをパスしないデータは拒否し、直前の層にエラーを返す必要があります。複数層の検証を実装する。軽い悪意を持つユーザーに対する予防策は、決然たる攻撃者に対しては有効ではありません。インターフェイスを介した入力時に検証を行い、その後の信頼境界を越えるすべてのポイントでも検証を行うことです。インジェクションを防ぐことができます。次の層で、この入力が既に検証済みであると推測されると、クライアントを迂回する能力を持つ悪意のあるユーザーは、システムへ無制限にアクセスできることになります。検証されていないユーザー入力は連結しない。インジェクションを行うための主なポイントとなります。LPT8、NUL、PRN。可能であれば、次の文字を含む入力は受け入れないでください。文字データ文字列の区切り記号。単一行コメントの区切り記号。以降、その行の末尾までのテキストは、サーバーによって評価されません。コメントの区切り記号。間にあるテキストについては、サーバーによる評価は行われません。プロシージャ名の先頭に使用します。コレクションは、型のチェックおよび長さの検証に使用できます。コレクションを使用する場合、入力は実行可能コードとしてではなくリテラル値として扱われます。つの利点は、型のチェックおよび長さのチェックを適用できることです。範囲外の値が入力されると例外が発生します。コレクションの使用方法を示しています。パラメーターは実行可能コードとしてではなくリテラル値として扱われます。この値は型および長さについてチェックされます。値が指定された型および長さの制約に従っていない場合は、例外がスローされます。インジェクションの影響を受けやすくなります。次のコードには脆弱性があります。プロシージャの入力として使用する必要があります。プロシージャを使用できない場合でも、次のコード例に示すようにパラメーターを使用することができます。インジェクションの防御に役立ちます。問題となり得る文字は数が多いため、信頼性の高い防御策にはなりません。次の例では、文字の文字列区切り記号を検索しています。句を使用している場合、ワイルドカード文字もエスケープする必要があることに注意してください。sp_executesqlを呼び出すすべてのコードを確認する必要があります。次のようなクエリを使用すると、これらのステートメントを含むプロシージャの識別に役立てることができます。個のスペースがあるかどうかをチェックします。使用されるすべての変数が正しく処理されることを確認します。ラップする必要があります。文字であることに注意してください。ステートメントを次のように変更できます。その変数に割り当てられたバッファーより大きい場合は切り捨てられます。プロシージャに渡すことで、強制的にステートメントの切り捨てを行うことができれば、攻撃者が結果を操作することも可能になります。プロシージャは、切り捨てによって有効になるインジェクションの影響を受けやすくなります。文字を渡して新しいパスワードを設定できます。返される文字列は、割り当てられている領域よりも大きくなると、暗黙に切り捨てられます。プロシージャは、行われる可能性がある処理を示しています。使用すると、割り当てられたバッファー領域よりも大きくすることで強制的に文字列の切り捨てを行うことができます。プロシージャは、行われる可能性がある処理を示しています。よる文字列の切り捨てを回避できます。呼び出す必要があります。サイズを次のように計算できます。2*(len(@input)+1)にする必要があります。次の計算は、すべての場合に対応します。']')という形式のステートメントに渡されると、切り捨てが発生する可能性があります。文字を十分保持できる大きさの一時変数を使用する必要があります。サイズを計算できます。