2017-03-16 103 views
1

我有一个SQL请求,我需要的数据连接成的要求:TryParse防止SQL注入吗?

if (dataChoosen != "randomValue") 
{ 
    sCondition = " WHERE RandomField = '" + dataChoosen + "' "; 
}    
cd.CommandText = "SELECT xData FROM table " + sCondition + "GROUP BY xxx"; 

当我需要连接的情况下,我不认为我可以用一备的要求吗?

此外,我已经tryparse'dataChoosed'值,因为它来自一个文本框,我需要一个整数。那么tryparse足以防止SQL注入?

+10

您应该使用参数。将SQL与参数连接起来没有任何问题。 – SLaks

+6

请务必使用参数,另请参见[最佳实践 - 执行Sql语句](http://stackoverflow.com/documentation/.net/3589/ado-net/14261/best-practices-executing-sql-statements)以获取更多信息和希望。 – Igor

+2

“选择”的过去分词是“选择”,而不是“选择”。如果变量名称在其中有正确的拼写,它会让其他人更容易查看你的代码:) –

回答

-2

是否[BLANK]防止SQL注入?

除非[BLANK]是“参数”,否则答案总是否定的。

+0

反对票?为什么? – aquinas

+1

不知道。不是我。也许它太简单了,而'空白'应该是'一些新的想法关于SQL注入预防'。让我们忽略这个“新点子”并不新鲜。 –

+0

@AndrewMorton,是的,我主要认为这很有趣/可怕。上面的评论“你应该使用参数。” 10票。 “总是使用参数”6。这个答案基本上说的是完全一样的东西:总是使用参数,因为像Dmitry Bychenko之类的原因,以及其他许多原因(多字节字符漏洞(https://security.stackexchange.com/questions/9908/multibyte-character- exploits-php-mysql)等):3票反对。 – aquinas

2

我只是使用参数,没有理由不这样做。

if (dataChoosed != "randomValue") 
{ 
    sCondition = " WHERE RandomField = @dataChoosed "; 
}    
cd.CommandText = "SELECT xData FROM table " + sCondition + "GROUP BY xxx"; 
cd.Parameters.Add("@dataChoosed", SqlDbType.VarChar).Value = dateChoosed; 
+0

永远不要使用AddWithValue:[我们可以停止使用AddWithValue()了吗?](http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already /) –

+0

@AndrewMorton怎么样? – Kevin

+0

如果OP为他们提到的整数值使用VarChar列(它们不应该是这样),那就可以了。如果它确实是VarChar类型,那么最好也指定长度与数据库中的声明相同。 [最佳实践 - 执行Sql语句]中有更多信息(http://stackoverflow.com/documentation/.net/3589/ado-net/14261/best-practices-executing-sql-statements#t=201703162000398457387)(正如伊戈尔的评论中所链接的那样)。 –

1

不,你在安全方面不。即使dataChoosed是一个无辜的整数值,坏男孩可以用,比如说,负值格式伤害你:

// It's good old "-1", with a bit strange format 
    // (let use "delete from table commit;" as an injection) 
    string dataChoosed = "1'; delete from table commit; --1"; 

    // A little hack: let "-" sign be... 
    CultureInfo hacked = new CultureInfo("en-US"); 
    hacked.NumberFormat.NegativeSign = "1'; delete from table commit; --"; 
    Thread.CurrentThread.CurrentCulture = hacked; 

    if (dataChoosed != "randomValue") 
    { 
     int v; 

     // since "1'; delete from table commit; --1" is of correct fotmat it will be parsed 
     if (int.TryParse(dataChoosed, out v)) 
      sCondition = " WHERE RandomField = '" + dataChoosed + "' "; 
    }    

    cd.CommandText = "SELECT xData FROM table " + sCondition + "GROUP BY xxx"; 

而且,荣辱与共!我的桌子在哪儿?该命令文本将

SELECT xData FROM table = '1'; delete from table commit; --1'GROUP BY xxx 

这是efficently 查询:

SELECT xData FROM table = '1'; -- the innocent one 
    delete from table commit;  -- an arbitrary query from the attacker 

(我已经删除注释掉--1'GROUP BY xxx片段)

使用参数,不要诱惑我们。请注意,您不想更改代码:您只需在Windows中更改区域设置。