質問: ### 質問内容 SQLServer のストアドプロシージャで 引数で受け取った SQL 文を実行する記述をしている場合 脆弱性になりえるでしょうか? 質問1.脆弱性の有無 質問2.脆弱性がある場合、発生しうる状況・方法 質問3.脆弱性が無い場合、安全だといえる理由 ### 環境情報 * クライアントサーバ型のツールがあり、ローカルネットワーク内の DB サーバに対して、データ取得などの通信を行っている。(サーバはローカルネットワークからの接続のみ可能) * 引数で渡す SQL はツール内のソースコードに記述している。(ユーザによる任意の SQL 文は発行できない) * SQLServer は安全なパスワードで接続を行う。 ### 該当のストアドプロシージャ /* Exec(引数)でストアド呼び出し時の引数を実行 */ /* 引数として実行する SQL 文(例:SELECT * FROM テーブル名)を設定する */ USE [データベース名] GO CREATE Procedure [dbo].[execSql] (@sql NVARCHAR(MAX)) As BEGIN Exec (@sql) END GO
回答: SQLServerをご利用とのことなので、フレームワークがASP.NETの前提でご回答します。ASP.NETあればDBアクセスにADO.NETやLINQなど利用されるかと思います。その場合にSQL文(もしくはストアドプロシージャ)を実行するオブジェクトにパラメータを渡す方式を取ればインジェクションのブロックに有効と言えます。 SqlParameterでSQLインジェクション対策 ASP.NETにおけるXSS、SQLインジェクション対策 以下はMSDNのコンテンツですが、プロシージャでも脆弱性が有るのでパラメータの利用が推奨されています。 How To: ASP.NET で SQL インジェクションから保護する方法 ご参考までに。