防止在SELECT语句中注入SQL

本文关键字:注入 SQL 语句 SELECT | 更新日期: 2023-09-27 18:17:14

我使用VS2005 c# ASP。. NET和SQL Server 2005.

我在我的asp页面上有一个搜索功能,我觉得我的SELECT查询容易受到SQL注入。

这是我当前的SELECT语句:

string LoggedInUser = (User.Identity.Name);
SqlDataSource1.SelectCommand = "SELECT * FROM [TABLE1] where [" + DropDownList1.Text + "] like '%" + searchTB.Text + "%' AND [empUser] LIKE '%"+LoggedInUser+"%'";
SqlDataSource1.DataBind();

*其中searchTB是我的搜索文本框;DropDownList1是我的搜索类别;其中,LoggedInUser为登录用户的用户名。


我在INSERT语句中实现了参数而不是连接:

string sql = string.Format("INSERT INTO [TABLE2] (Username) VALUES (@Username)");
        SqlCommand cmd = new SqlCommand(sql, conn);
        cmd.Parameters.AddWithValue("Username", usernameTB.Text);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();

我想改变我的SELECT语句像我的INSERT语句,使用参数代替。我可以知道怎么换吗?

谢谢

防止在SELECT语句中注入SQL

您可以使用

为selectcommand添加参数
SqlDataSource s = new SqlDataSource();
s.SelectParameters.Add("paramName", "paramValue");

还有其他用于删除、更新和插入的参数集合

s.DeleteParameters
s.UpdateParameters
s.InsertParameters

更多信息:

MSDN: SqlDataSource。SelectParameters地产

以编程方式使用SqlDataSource

希望对您有所帮助

参见在SqlDataSource控件中使用参数

和SqlDataSource。SelectParameters地产

您可以为SqlDataSource指定SelectParameters属性以使用参数化SQL查询

编写一个获取数据源的方法,并为查询使用sql参数。下面是一个如何在命令对象

中添加参数的好例子
SqlCommand command = new SqlCommand(commandText, connection);
command.Parameters.Add("@ID", SqlDbType.Int);
command.Parameters["@ID"].Value = customerID;
我将为查询使用一个方法,以便将数据库访问从UI功能中分离出来。此外,这还允许重用查询。

在查询中动态指定字段名并不是一项简单的任务,所以我建议对字段名进行切换/大小写验证,如下所示:

switch (DropDownList1.Text)
{
    case "ValidField1":
    case "ValidField2":
    ...
        break;
    default: 
        throw new ArgumentException(...); // or prevent query execution with some other statement
}
SqlDataSource1.SelectCommand = "SELECT * FROM [TABLE1] where [" + DropDownList1.Text + "] like @value AND [empUser] LIKE @user";
SqlDataSource1.SelectParameters.Add("value", "%" + searchTB.Text + "%");
SqlDataSource1.SelectParameters.Add("user", "%"+LoggedInUser+"%");
SqlDataSource1.DataBind();
  1. 您可以简单地使用SQL数据源的过滤器表达式

  2. 你可以用object datasource/datatable编写你自己的select函数方法