1

我已经看到了一些答案,但我的查询有点不同:

这是一个原始查询:

cmd.CommandText = "select count(Table1.UserID) from Table1 INNER JOIN 
Table2 ON Table1.ID = Table2.ID where Table1.Userid = " + UserID + " and
Table1.Number != '" + Number +"' and Table2.ID < 4";

这是 SQL 注入的修改查询:

cmd.CommandText = "select count(Table1.UserID) from Table1 INNER JOIN 
Table2 ON Table1.ID = Table2.ID where Table1.Userid = @userId and
Table1.ID != @Number and Table2.ID < 4";

如果您能注意到,第一个查询UserId用双引号括起来:..." + UserID +"...Numberus 用单引号和双引号括起来:...'" + Number + "'...

这是我设置参数的方式:

cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@Number", Number); 
cmd.Parameters.AddWithValue("@userId",UserID);

其中UserID是一个整数,Number是一个字符串。

所以,我的问题是,修改后的查询格式是否正确?@UserId考虑到原始查询中指定的不同方式,如何将@Number参数放入查询中是否有任何区别?

4

3 回答 3

1

我在.net Mvc上工作了很长时间,我可以确保你在第二种情况下自己正确修复了参数,你不必担心。顺便说一句,如果您可以自己注入,您仍然可以调试和测试。简而言之,您的代码看起来很棒且无懈可击。

我就是这样做的,这与您的相似且安全:

    string Query = @"select a1, a2, a3, a4 from table1 where a1 in 
                           (select b1 from table2 where b2 = @start or b2 = @end)";

            using (SqlCommand Comm = new SqlCommand(Query, Conn))
            {
                Comm.Parameters.Add("@start", SqlDbType.NVarChar).Value = start;
                Comm.Parameters.Add("@end", SqlDbType.Int).Value = end;
            }
于 2015-08-12T15:56:37.310 回答
1

在您的初始查询中,双引号属于查询的实际文本,而不是参数。将字符串附加到 sql 查询时添加的单引号。我不知道你为什么要在一个叫做 Number 的东西周围加上单引号。如果实际上这是一个数字类型变量,它可以在没有单引号的情况下进入查询。但是如果它有单引号,唯一会发生的事情是 Sql 将其视为一个字符串,然后将其转换为一个数字,如果它打算将其用作一个。例如,如果 Table1.Number 是数字。

但是,正如您所指出的,通过将参数附加到查询字符串中来构建查询字符串是一种糟糕的做法,因为它为 sql 注入攻击敞开了大门。因此,您可以使用参数化查询。

在参数化查询中,您不必担心引号。对于字符串值的参数,环境将担心在构建命令以传递给您的 sql 数据库时将它们括在引号中。对于数字参数,不需要引号,并且再次为您处理。

于 2015-08-12T16:25:59.117 回答
0

我认为您的第二版查询要好得多,从外观上看,它应该可以正常工作。

添加参数而不是连接您的值对于 sql 注入更安全。在这个例子中,我看不到任何进行 sql 注入的方法。

编辑

使用参数化查询时,您不需要添加任何引号,就像您声明变量并在查询中使用它一样 - 您不需要使用引号。

DECLARE @x CHAR(10) = 'abc'
SELECT  @x 

在查询中使用值的串联时,如果您尝试添加到查询中的值是 a CHAR,则需要将其用单引号括起来。如果是INT,则不应将其括在单引号之间。

SELECT  'abc', 1

您在第一个查询中使用的双引号与 sql 语句没有任何关系,它们在您的 c# 代码中用于构建您尝试分配给 CommandText 的 sql 语句字符串。

string abcVar = "abc";
int intVar = 1;
string sqlCommand = "SELECT '" + abcVar + "', " + intVar;
于 2015-08-12T15:57:01.403 回答