2013-10-03 107 views
0

是否sqlCommand.Parameters.Add(sqlParam)检查保留字如'Table','Drop'等 基本上我想通过使用上面的方法知道我们如何避免Sql注入什么是机制在那里。Parameters.Add和Sql注入

回答

2

这一切都取决于你计划在您正在执行的SQL参数做什么。关于使用.Parameters.Add()的好处是,这些值是单独传递的,而不是大块chunk-o-sql的一部分。当然,这取决于你决定如何处理它们。

假设你做这样的事情:

SELECT * FROM myTable WHERE customer_nr = @customer_nr 

然后,它并没有真正即使在“黑客”通过沿';DROP TABLE myTable --线的东西没关系。因为没有客户被命名为`查询根本不会返回任何“; DROP TABLE mytable的 - ”

但是,如果你要使用它像这样:

SELECT @sql = 'SELECT * FROM myTable WHERE customer_nr = ''' + @customer_nr + '''' 
EXEC (@sql) 

那么你打败目的的系统和黑客将能够做一些SQL-Injection-ISH的东西。

+1

你真的应该阅读相关文章[关于Bobby Tables](http://stackoverflow.com/questions/332365/how-does-the-sql-injection-from-the-bobby-tables-xkcd-comic-工作?rq = 1),它解释得更好,并引用了很多其他相关信息。 – deroby

+0

所以这意味着.Parameters.Add()将避免SQL注入,我们不想去总是解决它的Sps? – aads

+0

Parameters.Add()确实可以帮助您避免SQL注入。无论你直接在.CommandText中执行实际的SQL命令,还是通过存储过程执行实际上并不重要(尽管我更喜欢存储过程!)。简单地说,不要陷入将参数转换回动态SQL的陷阱,无论是在.CommandText还是在存储过程中,就像我上面所说的那样。 – deroby

0

不,它不会将参数视为保留字。使用参数化存储过程是避免sql注入的最好方法。

+0

感谢您的回复,请提供给我在那里指出占位符不会帮助防止SQL注入参考 – aads

+0

哦......我相信我能拿出一个参数化存储过程,很容易受到SQL注入攻击。 :) –