ホームページ  >  記事  >  データベース  >  mysqlでSQLインジェクションを防ぐ方法

mysqlでSQLインジェクションを防ぐ方法

(*-*)浩
(*-*)浩オリジナル
2019-05-09 11:51:309161ブラウズ

SQL インジェクションを防ぐ Mysql の方法: 1. 一般ユーザーとシステム管理者ユーザーの権限は厳密に分離する必要があります; 2. ユーザーにパラメーター化されたステートメントの使用を強制します; 3. に付属のセキュリティ パラメーターを使用するようにしてください。 SQL Server データベース ; 4. ユーザーが入力した内容を確認します。

mysqlでSQLインジェクションを防ぐ方法

SQL インジェクション攻撃は非常に有害であり、攻撃者はこれを利用してデータベース内のデータの読み取り、変更、削除を行ったり、データベース内のユーザー名とパスワードを取得したりすることができます。などの機密情報が含まれており、データベース管理者の許可を取得することもできます。 SQL Server 拡張ストアド プロシージャとカスタム拡張ストアド プロシージャを再利用して一部のシステム コマンドを実行できる場合、攻撃者はシステムを制御することもできます。

(推奨チュートリアル: mysql ビデオ チュートリアル )

そして、SQL インジェクションも防ぐのが困難です。 Web サイト管理者は、システム パッチをインストールしたり、単純なセキュリティ構成を実行したりすることで自分自身を保護することはできません。また、一般的なファイアウォールは SQL インジェクション攻撃をブロックできません。

mysql は SQL インジェクションをどのように防ぐのですか?

1. 一般ユーザーとシステム管理者ユーザーの権限は厳密に区別される必要があります。

一般ユーザーが別の Drop Table ステートメントをクエリ ステートメントに埋め込んだ場合、その実行は許可されますか?

Drop ステートメントはデータベースの基本オブジェクトに関連しているため、このステートメントのユーザーは、関連する権限を持っている必要があります。権限設計では、エンド ユーザー、つまりアプリケーション ソフトウェアのユーザーに対して、データベース オブジェクトの作成と削除の権限を与える必要はありません。

したがって、使用する SQL ステートメントに悪意のあるコードが埋め込まれている場合でも、ユーザー権限の制限により、これらのコードは実行されません。

2. パラメータ化されたステートメントの使用を強制します。

SQL ステートメントを作成するときに、ユーザーが入力した変数が SQL ステートメントに直接埋め込まれていない場合。この変数をパラメータを通じて渡すと、SQL インジェクション攻撃を効果的に防ぐことができます。

つまり、ユーザー入力を SQL ステートメントに直接埋め込むことはできません。対照的に、ユーザー入力はフィルター処理するか、パラメーター化されたステートメントを使用してユーザー入力変数を渡す必要があります。パラメータ化されたステートメントは、ユーザー入力変数を SQL ステートメントに埋め込む代わりにパラメータを使用します。この手段を使用すると、

はほとんどの SQL インジェクション攻撃を排除できます。残念ながら、パラメータ化されたステートメントをサポートするデータベース エンジンは多くありません。ただし、データベース エンジニアは、製品を開発するときにパラメータ化されたステートメントを使用するように努める必要があります。

3. SQL Server データベースに付属のセキュリティ パラメーターを使用します。

SQL Server データベースに対するインジェクション攻撃の悪影響を軽減するために、SQLServer データベースでは比較的安全な SQL パラメータが特別に設計されています。データベース設計プロセス中、エンジニアはこれらのパラメータを使用して、悪意のある SQL インジェクション攻撃を防ぐように努める必要があります。

たとえば、Parameters コレクションは SQL Server データベースで提供されます。このコレクションは、型チェックと長さ検証機能を提供します。管理者が Parameters コレクションを使用する場合、ユーザー入力は実行可能コードではなく文字値として扱われます。ユーザー入力に実行可能コードが含まれている場合でも、データベースはそれをフィルターで除外します。現時点ではデータベースはそれを通常の文字としてのみ扱うためです。 Parameters コレクションを使用するもう 1 つの利点は、型と長さのチェックを強制でき、範囲外の値が例外をトリガーできることです。

ユーザーが入力した値が指定された型と長さの制約に準拠していない場合、例外が発生し、管理者に報告されます。例えば上記の場合、社員番号で定義されるデータ型が文字列型の場合、長さは10文字となります。ユーザが入力する内容も文字型データですが、その長さは20文字に達します。ユーザー入力の長さがデータベース フィールドの長さ制限を超えているため、この時点で例外がスローされます。

4. ユーザー入力の検証を強化します。

一般に、SQL インジェクション攻撃を防ぐには 2 つの方法が使用できます。

1 つ目は、ユーザー入力内容の検査と検証を強化することであり、2 つ目は、SQL インジェクション攻撃の使用を強制することです。パラメータ化されたステートメントのユーザー入力を渡します。

SQLServer データベースには、管理者が SQL インジェクション攻撃に対処するのに役立つユーザー入力コンテンツ検証ツールが多数あります。文字列変数の内容をテストし、必要な値のみを受け入れます。バイナリ データ、エスケープ シーケンス、コメント文字を含む入力を拒否します。これは、スクリプト インジェクションを防ぎ、特定のバッファ オーバーフロー攻撃を防ぐのに役立ちます。ユーザー入力のサイズとデータ型をテストし、適切な制限と変換を適用します。これは、意図的なバッファ オーバーフローの防止に役立ち、インジェクション攻撃の防止に大きな効果があります。

たとえば、ストアド プロシージャを使用してユーザー入力を検証できます。ストアド プロシージャを使用して、一部の特殊記号を拒否するなど、ユーザー入力変数をフィルタリングできます。たとえば、上記の悪意のあるコードでは、ストアド プロシージャがセミコロンを除外する限り、悪意のあるコードは役に立ちません。

SQL ステートメントを実行する前に、データベースのストアド プロシージャを使用して一部の特殊記号を拒否できます。データベース アプリケーションに影響を与えることなく、データベースは次の文字を含む入力を拒否できるようにする必要があります。 SQL インジェクション攻撃の主な共犯者であるセミコロン区切り文字など。コメント区切り文字など。注釈はデ​​ータ設計中にのみ使用されます。通常、ユーザーのクエリ文には必要なコメント内容がないため、そのまま拒否しても問題ありませんが、通常であれば予期せぬ損失が発生することはありません。これらの特殊記号が拒否された場合、SQL ステートメントに悪意のあるコードが埋め込まれていても、何も行われません。

したがって、常にユーザー入力を検証し、型、長さ、形式、範囲をテストしてユーザー入力をフィルタリングしてください。これは、SQL インジェクション攻撃を防ぐための一般的で効果的な対策です。

マルチレイヤー環境で SQL インジェクション攻撃を防ぐにはどうすればよいですか?

多層アプリケーション環境では、ユーザーが入力したすべてのデータは、信頼できる領域へのアクセスを許可される前に検証される必要があります。

検証プロセスに失敗したデータはデータベースによって拒否され、上位層にエラー メッセージが返されます。多層検証を実装します。目的のない悪意のあるユーザーに対して講じられた予防策は、決意の強い攻撃者に対しては効果的ではない可能性があります。

より良いアプローチは、ユーザー インターフェイスとその後の信頼境界を越えるすべてのポイントで入力を検証することです。たとえば、クライアント アプリケーションでデータを検証すると、単純なスクリプト インジェクションを防ぐことができます。

ただし、次の層がその入力が検証されたと考える場合、クライアントをバイパスできる悪意のあるユーザーはシステムに無制限にアクセスできる可能性があります。したがって、マルチレイヤー アプリケーション環境では、インジェクション攻撃を防ぐ場合、すべてのレイヤーが連携して機能する必要があり、SQL ステートメント インジェクション攻撃を防ぐためにクライアント側とデータベース側で対応する措置を講じる必要があります。

以上がmysqlでSQLインジェクションを防ぐ方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。