在SELECT语句中防止SQL注入

时间:2011-12-08 09:26:12

标签: c# asp.net sql-server-2005 sql-injection

我正在使用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 语句一样。我可以知道应该怎么改变它?

谢谢

5 个答案:

答案 0 :(得分:4)

您可以使用

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

还有其他参数集合可供删除,更新和插入。

s.DeleteParameters
s.UpdateParameters
s.InsertParameters

更多信息:

MSDN: SqlDataSource.SelectParameters Property

Programmatically Using SqlDataSource

希望这会有所帮助

答案 1 :(得分:2)

编写一个获取数据源的方法,并使用sql参数进行查询。 Here是如何在命令对象中添加参数的一个很好的例子

SqlCommand command = new SqlCommand(commandText, connection);
command.Parameters.Add("@ID", SqlDbType.Int);
command.Parameters["@ID"].Value = customerID;

我会使用一种方法进行查询,以便将数据库访问与UI功能分开。此外,这允许重用查询。

答案 2 :(得分:2)

请参阅Using Parameters with the SqlDataSource Control

SqlDataSource.SelectParameters Property

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

答案 3 :(得分:1)

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

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();

答案 4 :(得分:0)

  1. 您只需对SQL数据源使用过滤器表达式SQL Datasource filter expression

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