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