2013-07-31 38 views
0

我已经阅读了很多关于SQL注入和许多争论为什么你应该避免构建查询动态的东西用明码/串连您cs.file内动态生成的查询和SQL注入和DLL的文件

然而,我有问题,我需要一些比我更有经验的人的建议。

我创建了一些DLL文件,以便在不同的项目中重新使用我的代码,因此我在考虑泛型。

我创建了这些DLL文件,其中包含以动态方式+语句连接构建SQL查询的所有逻辑/代码。之后,我将这些DLL文件作为参考添加到我的项目中。

这将容易受到SQL注入?程序不足(耗时/维护不足)?

任何意见,将不胜感激。

+0

我猜你的问题开始时F.E.表或字段是这样动态的:'string sql =“SELECT”+ sColumns +“FROM”+ sTableName;'?你不能参数化表格名称。建议在这些情况下使用sp_exectutesql。 – Koryu

回答

0

如果您未处理传递给查询(在运行时构建)的输入,那么您很容易受到SQL注入的影响。添加到DLL或没有没有任何区别。

要解决这个问题,您需要使用参数化查询。它们具有安全性的多重优势。

我现在能想到的一个原因是你有一个文本框。和您的查询是

"select * from table1 where name = '" + textbox1.Text; 

不是让我们假设在TextBox1中用户输入Ehsan's。你的查询会很快,甚至不会执行。参数化查询的

"select * from table1 where name = @Name" 
yourCommand.Parameters.AddWithValue("@Name", textbox1.Text); 
+0

“处理我的输入”?例如,通过在我的输入上添加一些验证规则? – michaalis

+0

是的,您需要验证您的输入是否有黑客可能执行的所有可能的恶意行为。或者简单地使用存储过程或参数化查询来确保参数获得正确的值。 – Ehsan

+0

谢谢Ehsan,但是我可以用包括动态SQL查询的DLL文件替换参数化查询和存储过程吗?并保持安全? – michaalis

0

我们很难确切地知道,但如果你这样做

string sql = "SELECT Field FROM Table WHERE Field = " + Somevar; 

那么你是开放的SQL注入,如果somevar来自某种输入(通常是用户输入)。

就是没有理由这样做,你可以做

string sql = "SELECT Field FROM Table WHERE Field = @myvar" 
0

你应该确保你正在使用参数化查询或存储过程等

,并避免使用动态SQL查询等作为

"SELECT * FROM Users WHERE UserID = " + UserID 

,因为这些都容易受到SQL注入

而不是使用参数化查询或存储过程,例如

"SELECT * FROM Users WHERE UserID = @UserID" 

大多数ORM(例如,NET的实体框架)将提供对SQL注入一些保护(但只如果使用得当)

此链接详细介绍了http://www.troyhunt.com/2013/07/everything-you-wanted-to-know-about-sql.html

+0

因此,据我所知,我不能用包括动态SQL查询在内的DLL文件替换参数化查询和存储过程?保持安全:) – michaalis

+0

如果你为dll文件编写代码,那么我看不出有什么理由为什么你不能 – user1321471