首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >asp.net是否可以防御sql注入攻击?

asp.net是否可以防御sql注入攻击?
EN

Stack Overflow用户
提问于 2011-03-01 00:20:28
回答 7查看 5.3K关注 0票数 7

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

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-03-01 00:21:37

不是的。只要您提供了SQL,您就可以决定如何使用控件。

这通常意味着清理输入并使用参数化查询或存储过程而不是动态SQL字符串。

如果控件正在为您生成查询(如成员资格控件等)那你就会受到很好的保护。

票数 10
EN

Stack Overflow用户

发布于 2011-03-01 00:48:57

是也不是。

ADO.NET对参数化有很好的支持,当您正确使用它时,参数值将被自动消毒以防止SQL注入。因此,您可以向SqlCommand (或SqlDataSource控件)添加参数,而不必过多担心其中的内容。

好消息是,参数化你的东西真的很容易。我将向您展示一个以编程方式完成此操作的C#示例,但是you can do it declaratively with server controls if you prefer.

坏消息是,就像其他事情一样,你仍然需要考虑你正在做什么。如果您想要具有任何安全性,则必须将来自不安全源的任何字符串参数化为。如果您将其逐字粘贴到查询中,您将绕过ADO.NET的安全功能。

安全:

代码语言:javascript
复制
string name = txtName.Text;
sqlCommand.CommandText = "select * from product where name = @name";
sqlCommand.Parameters.AddWithValue("name", name);

不安全:

代码语言:javascript
复制
string name = txtName.Text;
sqlCommand.CommandText = "select * from product where name = " + name;

如果您的SQL查询中有任何内容直接来自用户,您需要将其放入一个参数中,否则所有的赌注都会失效。例如,你可以把代码放在一个参数中,然后把它传递给 EXEC语句。但是你不会那么做的,因为这是一个非常糟糕的想法。

仍然不安全(是的,我在产品代码中看到了这一点)!

代码语言:javascript
复制
string sql = "select * from product where name = " + txtName.Text;
sqlCommand.CommandText = "exec(@sql)";
sqlCommand.Parameters.AddWithValue("sql", sql);

SQL;DR: ADO.NET具有阻止注入的强大功能,但前提是您必须正确使用它们。

票数 10
EN

Stack Overflow用户

发布于 2011-03-01 00:22:14

大多数ASP.Net控件(除了DataGrid)根本不使用SQL。

如果您的代码中有自己的SQL (使用SqlCommand),则不会获得任何免费的保护;您需要使用参数。

少数使用SQL (SqlDataSource和成员框架)的控件确实使用了参数,并且可以安全地防止注入。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5144566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档