【发布时间】:2011-07-19 00:19:38
【问题描述】:
我正在使用命令名和命令参数来控制排序(字段和方向)。 SQL 注入的视图状态有多安全。
【问题讨论】:
-
能否请您发布您的SQL语句代码?
-
如果您将这些命令名称或参数发送给客户端,只需在数据作为 SQL 执行之前对其进行清理,就可以了(当然,如果仅此而已)
标签: asp.net sql-injection viewstate
我正在使用命令名和命令参数来控制排序(字段和方向)。 SQL 注入的视图状态有多安全。
【问题讨论】:
标签: asp.net sql-injection viewstate
SQL injection 将用户输入的值直接放入查询中,从而允许恶意用户利用您的安全漏洞访问或破坏您的数据库。例如,您有一个要搜索的文本框,他们输入的值进入实际查询中。
除非您的命令参数是由用户动态输入的,否则 SQL 注入不会构成威胁。
【讨论】:
如果您使用的是原始 SQL,那么您可能会使用 DataTable 对象,对吧?如果您使用的是 DataTable,那么您可以在使用 DataView 从数据库中提取数据后对该数据进行排序,并将您的控件绑定到 DataView。这样,您就不会授予用户提交的数据访问您的 SQL 的权限。所以,在你的代码中你会做这样的事情:
DataTable dt = GetData(); // pull data from DB with no sort specified
DataView view = dt.DefaultView; // Get a DataView so you can sort
view.Sort = "Col1, Col2 DESC"; // assemble sort string from your command args
MyControl.DataSource = view;
MyControl.DataBind();
【讨论】:
如果您将值从 ViewState 传递到连接的 SQL,那么可以。但是,如果您使用的是 Bind Parameters(您是,不是吗?),那么您不必担心。
不好:
string sql = "select * from product where name = ' + ProductNameTextBox.Text + '"
好:
string sql = "select * from product where name = @name"
using(var command = new SqlCommand(sql, connection))
{
SqlParameter param = new SqlServerParameter("@name", SqlDbType.VarChar, 50);
param.Value = ProductNameTextBox.Text;
command.Parameters.Add(param);
command.ExecuteNonQuery();
}
【讨论】:
这取决于“直接放入 SQL 查询”是否意味着它们是参数化查询的参数或作为文字......如果作为文字,那么答案是否定的。
【讨论】: