Sql injection 如何在现有sql查询中正确插入参数以避免sql注入

Sql injection 如何在现有sql查询中正确插入参数以避免sql注入,sql-injection,sql-parametrized-query,Sql Injection,Sql Parametrized Query,我已经看到了一些答案,但我的问题有点不同: 以下是原始查询: 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"; 其中,UserID是一个整数,Num

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

以下是原始查询:

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";
其中,
UserID
是一个整数,
Number
是一个字符串


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

我在.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;
            }

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

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

编辑

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

DECLARE @x CHAR(10) = 'abc'
SELECT  @x 
在查询中使用值串联时,如果要添加到查询中的值是
CHAR
,则需要将其括在单引号之间。如果它是
INT
,则不应在单引号之间换行

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

string abcVar = "abc";
int intVar = 1;
string sqlCommand = "SELECT '" + abcVar + "', " + intVar;

在初始查询中,双引号属于查询的实际文本,而不是参数。将字符串追加到sql查询时要添加的单引号。我不知道为什么你们会在一个叫做数字的东西周围加上单引号。如果事实上这是一个数值型变量,它可以进入查询而不使用单引号。但是如果它有单引号,唯一发生的事情是Sql将其视为字符串,然后将其转换为一个数字(如果它要将其用作一个数字)。例如,如果Table1.Number是数字。 但是,正如您所指出的,通过将参数附加到查询字符串中来构建查询字符串是一种可怕的做法,因为它为sql注入攻击敞开了大门。因此,您可以使用参数化查询,正如您所做的那样。
在参数化查询中,您不必担心引号。对于字符串值的参数,环境在生成要传递给sql db的命令时会担心将它们括在引号中。对于数值型参数,不需要引号,这一点您也可以考虑。

但是,有两种不同的方法将参数附加到查询中有什么区别?为什么参数化查询以相同的方式处理整数
@UserID
和字符串
@Number
?在原始查询中,
Number
被附加为
,“Number”
UserID
被附加为
,“UserID”
?他们声明参数的方式,有自己检查sql注入的方式,没有人能够读取它。这可能有点像他们在检查or 1==1,以及他们在sql注入中使用的大多数情况。我只是建议一下他们可能是怎么做的。谢谢,但在我的例子中,如果一个变量是字符串,另一个是n整数,我使用的
AddWithValue
方法会起作用吗?真正困扰我的是,一个参数附加了双引号,这是一个
整数
-
“+UserID+”
,另一个参数在单引号内附加了双引号,这是一个字符串-
“+Number+”
是的,您的代码可以工作。而且,引号的外观是这样形成的,所以我想msSql查询解析器不会有任何问题,因为它是唯一的字符串,而不是使用它们的库来解析它。祝你好运:)我应该使用
命令吗?在执行参数化查询之前准备好
?因此,基本上,如何将值追加到查询中并不重要?通过在双引号或单引号之间对查询进行参数化,sql语句可以正常执行?请参阅上面的编辑,我希望它能回答您的问题。您应该签出并停止使用
.AddWithValue()
-这可能会导致意外的结果。。。
SELECT  'abc', 1
string abcVar = "abc";
int intVar = 1;
string sqlCommand = "SELECT '" + abcVar + "', " + intVar;