ホームページ >データベース >mysql チュートリアル >SQL インジェクションを回避するためにテーブル名をストアド プロシージャに安全に渡すにはどうすればよいですか?

SQL インジェクションを回避するためにテーブル名をストアド プロシージャに安全に渡すにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-15 12:18:46900ブラウズ

How Can I Safely Pass Table Names to Stored Procedures to Avoid SQL Injection?

ストアド プロシージャにテーブル名を渡します

データベース プログラミングでは、多くの場合、ユーザー入力に基づいて特定のテーブルを参照するクエリを作成する必要があります。従来のアプローチでは、クライアント アプリケーションで SQL ステートメントを動的に構築する必要がありましたが、これはセキュリティ上の懸念を引き起こし、一般的に悪い習慣であると考えられています。

代わりに、よりクリーンで安全な解決策は、テーブル名をパラメータとしてストアド プロシージャに渡すことです。ただし、ユーザー入力に基づいてターゲット テーブルが変更される場合、課題が発生します。

チャレンジ:

場合によっては、ターゲット テーブルはユーザー入力に基づいて選択されます。たとえば、入力値が「FOO」と「BAR」の場合、クエリは「SELECT * FROM FOO_BAR」になります。このようなクエリをパラメータ化して SQL インジェクションを回避し、渡された文字列を動的 SQL 実行に使用するにはどうすればよいでしょうか?

解決策:

推奨されるアプローチは、パラメーター化ストアド プロシージャと動的 SQL を組み合わせて使用​​することです。

  1. パラメータ化ストアド プロシージャを作成します:

    • テーブル名パラメータを受け入れるストアド プロシージャを作成します。
    • プロシージャ中に渡されたテーブル名を使用してクエリを動的に生成します。
    • 渡されたテーブル名をホワイトリストと照合して検証するか、ルックアップを使用して悪意のある入力を防止してください。
  2. プロセス中に動的 SQL を生成します:

    • ストアド プロシージャで渡されたテーブル名を使用した SQL ステートメントの結合。
    • 動的 SQL を実行するには、EXECUTE SQL ステートメントを使用します。

ストアド プロシージャの例:

<code class="language-sql">CREATE PROC spCountAnyTableRows(
    @PassedTableName AS NVARCHAR(255)
) AS
BEGIN
    DECLARE @ActualTableName AS NVARCHAR(255)

    SELECT @ActualTableName = QUOTENAME(TABLE_NAME)
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_NAME = @PassedTableName

    DECLARE @sql AS NVARCHAR(MAX)
    SET @sql = 'SELECT COUNT(*) FROM ' + @ActualTableName + ';'

    EXEC sp_executesql @sql
END</code>

利点:

  • セキュリティ: このアプローチは、動的 SQL 実行に渡された文字列の使用を回避することで SQL インジェクション攻撃を防ぎます。
  • 明確さ: パラメーター化されたクエリは、コードを整理して保守しやすくするのに役立ちます。
  • 効率: ストアド プロシージャをキャッシュして再利用できるため、動的 SQL と比較してパフォーマンスが向上します。

その他の注意事項:

    この例では、渡されたテーブル名の特殊文字が適切にエスケープされるようにするために、
  • QUOTENAME が使用されています。
  • 入力されたテーブル名を検証するには、検索変換に INFORMATION_SCHEMA を使用します。
  • 必要に応じて、SQL パラメーターを使用して列名を動的に渡すこともできます。

この改訂された出力では、元の言語が維持され、意味の変更が回避され、画像が元の形式と場所に保たれ、わずかに言い換えられ、より簡潔な説明が提供されます。SQL の例は、一般に sp_executesql を使用することでわずかに改善されています。セキュリティとパラメータの処理を向上させるために推奨されます。

以上がSQL インジェクションを回避するためにテーブル名をストアド プロシージャに安全に渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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