2017-11-15 15 views
0

私が管理する製品チームの1つに、連結を使用してテーブルを注入する動的SQLクエリを使用する豊富なクエリがあります。それはsanitisationを持っている間、私は完全に動的SQLを削除しようとしています。SQLのパラメータ化された動的テーブルのクエリ

テーブル名をパラメータ化する方法はありますか?

SELECT * FROM (SELECT DISTINCT Table_Name FROM INFORMATION_SCHEMA.Tables WHERE Table_Name = :queryParam) 

これが可能である: 私は私のようなテーブルに何かを問い合わせることができる方法を考えるしようとしていますか?

+2

SQLクエリで識別子をパラメータ化することはできません。 'QUOTENAME()'を使ってより慎重にすることができます:https://docs.microsoft.com/en-us/sql/t-sql/functions/quotename-transact-sql。 –

+0

@ GordonLinoffこれらはインライン文字列クエリであり、ストアドプロックではないので、QUOTENAMEは誰かがその境界をエスケープできるので助けになりません。しかし、ありがとう。 – Cyassin

+2

@Cyassin _動的sql_を完全に削除しようとしていますが、動的SQLなしでは実行できません。 – Sami

答えて

0

私は動的SQLを完全に削除しようとしています。

  • あなたはDynamic SQLせずにそれを行うことはできません。

これは可能ですか?

  • いいえ、それはあなたがSQLクエリで識別子をパラメータ化することができない、ことはできません。

なぜですか?

  • Variablesためのオンラインブックページから、Variablesは、式だけでなく、object namesまたはkeywordsの代わりに使用することができます。 dynamic SQLステートメントを作成するには、EXECUTEを使用します。

これはそれを行うための唯一の方法である:

DECLARE @SQL NVARCHAR(MAX); 
DECLARE @queryParam NVARCHAR(120); 

SET @queryParam = N'TableName'; 
SET @SQL = N' 
SELECT * 
FROM 
(SELECT DISTINCT Table_Name 
FROM INFORMATION_SCHEMA.Tables 
WHERE Table_Name = '+ QUOTENAME(@queryParam) + ')'; 

EXECUTE (@SQL); 
+0

ORMを使用する/強く型付けされたデータレイヤーを構築すると、この問題は解決されますか?あなたがこの状況にいるという事実は、データレイヤー(本質的にORMの仕事)を構築しようとしていることを意味します...あなたが提示した状況を考えると、誰かがあなたの問題に対する完全な答えをSOの投稿に与えることは不可能です。生のSQL文字列を生成している場合は、SQLインジェクションの文字列入力をチェックする責任があります。おそらくEFやHibernateのソースコードを読んで、あなたが何を求めているのか(特にクエリ生成コード)を理解することを検討してください。 – War

0

「適切に」呼び出し元のアプリケーション層は前にこれを行う必要があり、SQL内から完全にSQLインジェクションを防ぐための方法はありません任意のSQL文を実行します。

ORMを使用して問題を解決するか、アプリケーションコードでSQLを生成するときにSQLインジェクションから身を守るためにコードを構築してください。

これは古典的なXY問題のように感じます。一歩前進して、SQLサーバーにアクセスした後のすべての状態をサニタイズするのではなく、SQLサーバー自体へのアクセスを保護する必要があると考えてください。

関連する問題