ホームページ >データベース >mysql チュートリアル >SQL インジェクションを回避するためにテーブル名をストアド プロシージャに安全に渡すにはどうすればよいですか?
ストアド プロシージャにテーブル名を渡します
データベース プログラミングでは、多くの場合、ユーザー入力に基づいて特定のテーブルを参照するクエリを作成する必要があります。従来のアプローチでは、クライアント アプリケーションで SQL ステートメントを動的に構築する必要がありましたが、これはセキュリティ上の懸念を引き起こし、一般的に悪い習慣であると考えられています。
代わりに、よりクリーンで安全な解決策は、テーブル名をパラメータとしてストアド プロシージャに渡すことです。ただし、ユーザー入力に基づいてターゲット テーブルが変更される場合、課題が発生します。
チャレンジ:
場合によっては、ターゲット テーブルはユーザー入力に基づいて選択されます。たとえば、入力値が「FOO」と「BAR」の場合、クエリは「SELECT * FROM FOO_BAR」になります。このようなクエリをパラメータ化して SQL インジェクションを回避し、渡された文字列を動的 SQL 実行に使用するにはどうすればよいでしょうか?
解決策:
推奨されるアプローチは、パラメーター化ストアド プロシージャと動的 SQL を組み合わせて使用することです。
パラメータ化ストアド プロシージャを作成します:
プロセス中に動的 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 の例は、一般に sp_executesql
を使用することでわずかに改善されています。セキュリティとパラメータの処理を向上させるために推奨されます。
以上がSQL インジェクションを回避するためにテーブル名をストアド プロシージャに安全に渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。