asp.net是否可以防止SQL注入攻击

时间:2011-02-28 16:20:28

标签: asp.net sql security sql-injection

默认情况下,ASP.net在使用ASP控件时是否可以防止SQL注入攻击?

7 个答案:

答案 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应用程序的框架,它并没有规定您访问数据库的方式。这取决于您实现数据访问的方式:

  • 如果您正在使用ADO.NET,并且正在将SQL查询构建为字符串,那么您必须清理任何用户输入以防止注入。
  • 如果您使用的是ADO.NET并使用SqlParameters,那么我认为您可以安全地禁止注射。
  • 如果您使用ORM工具进行数据访问,那么我会说您是安全的(至少在使用常用工具时)
  • 如果您使用的是DataSet,那么您可能也很安全。
  • 如果您正在使用某些第三方数据绑定控件,那么我希望他们能够防范SQL注入

可能我忘了在答案中提到很多,但你可以看到答案是:“这取决于”

答案 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注入攻击。

但如果你不够粗心,那么创建一个易受攻击的应用程序仍然是可能的。