Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态构建查询&;SQL注入&;DLL文件_C#_Asp.net_Sql_Dll_Dll Injection - Fatal编程技术网

C# 动态构建查询&;SQL注入&;DLL文件

C# 动态构建查询&;SQL注入&;DLL文件,c#,asp.net,sql,dll,dll-injection,C#,Asp.net,Sql,Dll,Dll Injection,我已经阅读了很多关于SQL注入的内容,以及许多关于为什么应该避免在cs.file中使用纯代码/串联动态构建查询的参数 然而,我有个问题,我需要比我更有经验的人给我一些建议 为了在不同的项目中重复使用我的代码,我创建了一些DLL文件,出于这个原因,我考虑使用泛型 我创建了这些DLL文件,其中包含以动态方式+语句串联方式构建SQL查询的所有逻辑/代码。此后,我添加这些DLL文件作为我的项目的参考 这将容易受到SQL注入的攻击?这是否也是程序不足(耗时/维护不足) 如有任何建议,将不胜感激 如果您不处

我已经阅读了很多关于SQL注入的内容,以及许多关于为什么应该避免在cs.file中使用纯代码/串联动态构建查询的参数

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

为了在不同的项目中重复使用我的代码,我创建了一些DLL文件,出于这个原因,我考虑使用泛型

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

这将容易受到SQL注入的攻击?这是否也是程序不足(耗时/维护不足)


如有任何建议,将不胜感激

如果您不处理要传递给查询的输入(在运行时生成),则容易受到SQL注入的攻击。添加到dll与否没有任何区别

要克服这个问题,您需要使用参数化查询。它们有多种优势,其中一部分来自安全性

我现在能想到的一个原因是你有一个文本框。你的问题是

 "select * from table1 where name = '" +  textbox1.Text;
不允许假设用户在textbox1中输入Ehsan的
。您的查询将崩溃,甚至无法执行

参数化查询示例

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

很难确定,但如果你做了类似的事情

string sql = "SELECT Field FROM Table WHERE Field = " + Somevar;
如果somevar来自某种类型的输入(通常是用户输入),那么您就可以接受SQL注入

没有理由做你能做的事

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

您应该确保使用的是参数化查询或存储过程等

并避免使用动态SQL查询,如

"SELECT * FROM Users WHERE UserID = " + UserID
因为它们容易受到SQL注入的攻击

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

"SELECT * FROM Users WHERE UserID = @UserID"
大多数ORM(例如.NET的实体框架)将提供一些针对SQL注入的保护(但只有在正确使用的情况下)


此链接更详细地解释了“处理我的输入”?例如,通过在我的输入上添加一些验证规则?是的,您需要验证您的输入,以防黑客可能执行的所有错误。或者简单地使用存储过程或参数化查询,以确保您的参数得到正确的值。谢谢Ehsan,但是我可以用DLL文件(包括动态SQL查询)替换参数化查询和存储过程吗?“还要保证安全吗?”米哈利斯,对不起,我没听清你的问题。如果你的意思是,你可以在dll文件中添加参数化查询,那么你当然可以。我的意思是,通过在dll文件中添加动态查询,比如上面的示例(带有文本框),它安全吗?因此,据我所知,我不能用dll文件(包括动态SQL查询)替换参数化查询和存储过程?为了保持安全性:)如果您为dll文件编写了代码,那么我看不出有任何原因您无法猜测问题是从f.e.表或字段是动态的时开始的:
string sql=“SELECT”+sColumns+“FROM”+sTableName?不能直接参数化表名。建议在这些情况下使用sp_exectutesql。