7

入力@featuretypeを受け取るspがあります。@featuretype は "mobile"、"login"、または "index" のいずれかと等しくなり、データベース内の列に対応します。

私のSPには次のものがあります:

EXEC(
    'select TOP 3 * from featuredtypes_v where'+' featuredtypes_v.'+@featuretype+'Page=1'+
    ' order by featuredtypes_v.priority desc'
    )

ただし、これによりデータベースがSQLインジェクションに開放されると言われました。私の 2 つの質問は、なぜこれなのか、これを回避するためにこのクエリを他にどのように書くことができるのかということです。

4

4 に答える 4

6

なぜあなたは使わないのですcaseか?

select TOP 3 * 
from featuredtypes_v F
where
    case
        when @featuretype = 'mobile' then F.MobilePage
        when @featuretype = 'login' then F.LoginPage
        when @featuretype = 'index' then F.IndexPage
    end
    = 1
于 2012-08-21T15:30:21.947 に答える
3

ユーザーが変数に渡された値を提供した場合、または誰かが特別に細工された悪意のあるコードを渡してストアド プロシージャを実行する方法を見つけた場合、プロシージャはインジェクションに対して無防備です。これに基づいた面白い漫画の私のユーザー名をググってください。

ストアド プロシージャを使用しているため、変数を確認してからSELECT、指定された変数に基づいてステートメントを実行できます。

IF @featuretype = 'mobile'
BEGIN
    select TOP 3 * 
    from featuredtypes_v 
    where featuredtypes_v.MobilePage=1
    order by featuredtypes_v.priority desc
END
IF @featuretype = 'login'
BEGIN
    select TOP 3 * 
    from featuredtypes_v 
    where featuredtypes_v.LoginPage=1
    order by featuredtypes_v.priority desc
END
-- etc...

WHEREまたは、条件を 1 つのクエリの句に入れることもできます。

select TOP 3 * 
from featuredtypes_v 
where (featuredtypes_v.MobilePage=1 AND @featuretype = 'Mobile') OR 
    (featuredtypes_v.LoginPage=1 AND @featuretype = 'Login') OR
    (featuredtypes_v.IndexPage=1 AND @featuretype = 'Index')
order by featuredtypes_v.priority desc
于 2012-08-21T15:26:38.597 に答える
1

1つのアプローチはこれです。列がテーブルに存在することを確認してから、動的SQLを実行します。そうでない場合は実行しません。

if Exists(select * from sys.columns where Name = N'@featuretype'  
            and Object_ID = Object_ID(N'tableName'))
begin

   EXEC(
    'select TOP 3 * from featuredtypes_v where'+' featuredtypes_v.'+@featuretype+'Page=1'+
    ' order by featuredtypes_v.priority desc'
    )

end
于 2012-08-21T15:49:00.997 に答える