默认情况下,ASP.net在使用ASP控件时是否可以防止SQL注入攻击?
答案 0 :(得分:10)
是和否。
ADO.NET非常支持参数化,当您正确使用它时,参数值将自动清理以防止SQL注入。因此,您可以向SqlCommand
(或SqlDataSource
控件添加参数,而无需担心太多了解其中的内容。
好消息是参数化你的东西真的很容易。我将以编程方式向您展示一个C#示例,但you can do it declaratively with server controls if you prefer.
坏消息是,就像其他任何事情一样,你仍然需要考虑你在做什么。如果您想要具有任何安全性,则必须对来自不安全源的任何字符串进行参数化。如果将其逐字粘贴到查询中,您将绕过ADO.NET的安全功能。
<强>安全强>
string name = txtName.Text;
sqlCommand.CommandText = "select * from product where name = @name";
sqlCommand.Parameters.AddWithValue("name", name);
不安全:
string name = txtName.Text;
sqlCommand.CommandText = "select * from product where name = " + name;
如果您的SQL查询中有任何内容直接来自用户,您需要将其放入参数或所有投注都关闭。就像其他任何事情一样,如果你真的想要,你可以用脚射击自己。例如,你可以把SQL代码,把它放在一个参数中,并将它传递给SQL { {1}}陈述。但是你不会这样做,不是吗,因为这是一个非常糟糕的主意。
仍然不安全(是的,我在生产代码中看到了这一点)!
EXEC
TL; DR: ADO.NET具有阻止SQL注入的强大功能,但前提是您正确使用它们。
答案 1 :(得分:9)
没有。只要您提供SQL,就要明智地使用控件。
这通常意味着通过动态SQL字符串清理输入并使用参数化查询或存储过程。
如果控件正在为您生成查询(例如成员资格控制等),那么您就受到了很好的保护。
答案 2 :(得分:8)
大多数ASP.Net控件(DataGrid除外)根本不使用SQL。
如果您的代码中有自己的SQL(使用SqlCommand
s),则不会获得任何免费保护;你需要使用参数。
使用SQL的几个控件(SqlDataSource和成员资格框架)确实使用参数并且可以安全地防止注入。
答案 3 :(得分:3)
ASP.NET不能防止SQL注入!
ASP.NET只是Web应用程序的框架,它并没有规定您访问数据库的方式。这取决于您实现数据访问的方式:
可能我忘了在答案中提到很多,但你可以看到答案是:“这取决于”
答案 4 :(得分:1)
如果你总是使用SqlParameter
,并且永远不会将用户输入连接到SQL,那么你应该是安全的。您也可以在没有存储过程的情况下使用SqlParameter
。
答案 5 :(得分:1)
不,ASP.Net不能防止SQL注入。用于ASP.NEt控件的MS发送代码应该是SQL注入免费的,但这并不能防止开发人员可能陷入困境的所有问题。最好的防御是很好地理解SQL注入和仔细编码。如果这是无法实现的,无论出于何种原因,有些工具可以帮助Microsoft Code Analysis Tool .NET (CAT.NET)。这是一个免费的VS插件,可以分析生成的程序集并检测SQL注入,XSS和XPath注入风险。这样的工具不是防弹的,但总比没有好。
答案 6 :(得分:0)
部分。有一个默认情况下打开的过滤器,这使得构建SQL注入攻击很困难,除非它被关闭。
许多ASPNET应用程序用于访问MSSQL数据库的方法也使它们通常能够抵御SQL注入攻击。
但如果你不够粗心,那么创建一个易受攻击的应用程序仍然是可能的。