7

我有一个接受输入@featuretype 的sp。@featuretype 将等于“mobile”、“login”或“index”,并将对应于 db 中的一列。

在我的 sp 我有:

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

但是,有人告诉我这会将数据库打开到 sql 注入。我的两个问题是,为什么会这样,为了避免这种情况,我还能怎么写这个查询?

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子句中的条件放在一个查询中:

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

一种方法是这样。确保该列存在于表中,然后执行动态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 回答
0

你们都没有回答问题。这是可能发生的 sql 注入

txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;

现在如果 txtUser = 105 OR 1=1 那么 sql 语句将是这样的

SELECT UserId, Name, Password FROM Users WHERE UserId = 105 or 1=1;

您可以通过使用 sql 参数来避免 sql 注入。它验证字符串并且 sql 执行 alwaus 就像它假设的那样

于 2018-01-04T03:49:02.697 回答