加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 参数化查询与SQL注入

发布时间:2020-12-15 08:06:44 所属栏目:百科 来源:网络整理
导读:我是 Asp.net的新手,我刚刚开始上课.我最近创建了一个类,它将为我处理大多数SQL查询,这样我就不必重复创建所有文件的新连接. 我创建的方法之一将SQL查询作为参数并返回结果.我知道我应该使用参数化查询来避免SQL注入.我的问题是,当我将查询作为字符串参数传
我是 Asp.net的新手,我刚刚开始上课.我最近创建了一个类,它将为我处理大多数SQL查询,这样我就不必重复创建所有文件的新连接.

我创建的方法之一将SQL查询作为参数并返回结果.我知道我应该使用参数化查询来避免SQL注入.我的问题是,当我将查询作为字符串参数传递时,我该怎么做?

例如,这是我将要调用的方法:

public static DataTable SqlDataTable(string sql)
{
    using (SqlConnection conn = new SqlConnection(DatabaseConnectionString))
    {
        SqlCommand cmd = new SqlCommand(sql,conn);
        cmd.Connection.Open();
        DataTable TempTable = new DataTable();
        TempTable.Load(cmd.ExecuteReader());
        return TempTable;
    }
}

所以我想从另一个文件中使用这个方法:

DataTable dt = new DataTable();

dt = SqlComm.SqlDataTable("SELECT * FROM Users WHERE UserName='" + login.Text  + "' and Password='" + password.Text + "'");

if (dt.Rows.Count > 0)
{
   // do something if the query returns rows
}

这有效,但仍然容易受到注射吗?有没有办法可以将变量作为参数传递给字符串?我知道如果我为查询创建一个新的SQLCommand对象并使用Parameters.AddWithValue,我可以这样做,但我希望所有的SQL命令都在单独的类中.

解决方法

This works but would still be vulnerable to injections right?

是的,你的代码非常容易受到SQL注入攻击.

I know that I should be using parameterized queries to avoid SQL injections.

哦,绝对是的.

My question is,how can I do this when I’m passing the query as a string parameter?

您根本不应该将查询作为字符串参数传递.相反,您应该将查询作为包含占位符的字符串参数和这些占位符的值传递:

public static DataTable SqlDataTable(string sql,IDictionary<string,object> values)
{
    using (SqlConnection conn = new SqlConnection(DatabaseConnectionString))
    using (SqlCommand cmd = conn.CreateCommand())
    {
        conn.Open();
        cmd.CommandText = sql;
        foreach (KeyValuePair<string,object> item in values)
        {
            cmd.Parameters.AddWithValue("@" + item.Key,item.Value);
        }

        DataTable table = new DataTable();
        using (var reader = cmd.ExecuteReader())
        {
            table.Load(reader);
            return table;
        }
    }
}

然后像这样使用你的函数:

DataTable dt = SqlComm.SqlDataTable(
    "SELECT * FROM Users WHERE UserName = @UserName AND Password = @Password",new Dictionary<string,object>
    {
        { "UserName",login.Text },{ "Password",password.Text },}
);

if (dt.Rows.Count > 0)
{
   // do something if the query returns rows
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读