動的テーブル名を安全に処理する: 動的 SQL クエリの問題を解決する
Web 開発では、ユーザーが指定した値に基づいて SQL クエリをカスタマイズするのが一般的です。ただし、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) SELECT @sql = 'SELECT COUNT(*) FROM ' + @ActualTableName + ';' EXEC(@SQL) END</code>
このプロセスは、ユーザーから @PassedTableName パラメーターを取得し、INFORMATION_SCHEMA.TABLES を使用して実際のテーブル名を検索し、EXEC (@SQL) を使用して実行できる安全な SQL クエリを構築します。
安全性と保護
この方法は、ユーザー指定の SQL ステートメントを直接実行するよりも安全であることに注意することが重要です。 INFORMATION_SCHEMA.TABLES ルックアップは、ユーザーが未承認のテーブルにアクセスしたり、悪意のあるコードを挿入したりすることを防ぎます。
代替方法
あるいは、異なるテーブルを区別するために、TableName 列を持つ単一のテーブルを使用するようにデータベース スキーマを再構築することを検討することもできます。このアプローチにより、動的 SQL が不要になります。ただし、これはすべての場合に実現できるわけではありません。
以上がストアド プロシージャは SQL クエリ内の動的テーブル名をどのように安全に処理できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。