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

mrt*_*man 7 sql asp.net security sql-injection

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

Jus*_*gan 10

是的,不是.

ADO.NET非常支持参数化,当您正确使用它时,参数值将自动清理以防止SQL注入.因此,您可以向SqlCommand(或SqlDataSource控件)添加参数,而无需过多担心其中的内容.

好消息是参数化你的东西真的很容易.我将以编程方式向您展示一个C#示例,但如果您愿意,可以使用服务器控件以声明方式执行此操作.

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

安全:

string name = txtName.Text;
sqlCommand.CommandText = "select * from product where name = @name";
sqlCommand.Parameters.AddWithValue("name", name);
Run Code Online (Sandbox Code Playgroud)

不安全:

string name = txtName.Text;
sqlCommand.CommandText = "select * from product where name = " + name;
Run Code Online (Sandbox Code Playgroud)

如果SQL查询中的任何内容直接来自用户,则需要将其放在参数中或所有投注都关闭.就像几乎所有其他东西一样,如果你真的想要拍摄自己的话,就有可能.例如,您可以获取SQL代码,将其放在参数中,然后将其传递给SQL EXEC语句.但你不会这样做,是吗,因为这是一个非常糟糕的主意.

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

string sql = "select * from product where name = " + txtName.Text;
sqlCommand.CommandText = "exec(@sql)";
sqlCommand.Parameters.AddWithValue("sql", sql);
Run Code Online (Sandbox Code Playgroud)

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


Jus*_*ner 9

不可以.只要您提供SQL,就要明智地使用控件.

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

如果控件正在为您生成查询(如成员控制等),那么您将受到很好的保护.

  • @mrtsherman - 我想补充一点,如果你在代码隐藏中使用参数化,它就像sqldatasource版本一样安全.并且可以在不对其进行参数化的情况下设置sqldatasource,这与在代码隐藏中执行它一样不安全.因此参数化是关键. (2认同)

SLa*_*aks 8

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

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

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