【问题标题】:Preventing SQL injection on insert防止插入时的 SQL 注入
【发布时间】:2013-07-23 18:43:24
【问题描述】:

我正在寻找一些防止 SQL 注入的技巧。我在一个论坛上被告知我的代码不安全,我正在寻找足够好的人来帮助我解决这个问题。

我有一个网络表单,提交时会转到 aspx.cs 页面并将数据插入到 ms sql 数据库中。

protected void Submit_Click(object sender, EventArgs e)
    {
        string FullStartTime = StartTimeHourList.SelectedValue + ":" + StartTimeMinuteList.SelectedValue + " " + StartTimeAMList.SelectedValue;
        string FullEndTime = EndTimeHourList.SelectedValue + ":" + EndTimeMinuteList.SelectedValue + " " + EndTimeAMList.SelectedValue;

        OleDbConnection conn;
        OleDbCommand cmd;
        conn = new System.Data.OleDb.OleDbConnection("");
        cmd = new System.Data.OleDb.OleDbCommand();
        conn.Open();
        cmd.Connection = conn;
        var sql = String.Format(@"INSERT INTO FormTable1 (Nonprofit, Contact, Phone, Email, Event, StartDate, EndDate, StartTime, EndTime, Place, Comments, SubmitDate) values 
                                                            ('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}','{11}')",
                                                           NonprofitTxtBox.Text, ContactTxtBox.Text, PhoneTxtBox.Text, EmailTxtBox.Text, EventTxtBox.Text,
                                                           StartDateTxtBox.Text, EndDateTxtBox.Text, FullStartTime, FullEndTime, PlaceTxtBox.Text, CommentsTxtBox.Text, DateTime.Now);
        cmd.CommandText = sql;
        cmd.ExecuteNonQuery();
        conn.Close();
 }

【问题讨论】:

  • 您直接将外部数据嵌入到您的查询中。您需要使用带有占位符的预处理语句:msdn.microsoft.com/en-us/library/…
  • 如果你在网上找不到任何关于防止c#中SQL注入的资料,你需要一个新的职业。
  • @BradM 我什么时候说这是一种职业?
  • @MarcB 谢谢 Marc,这个链接很有帮助。

标签: c# sql sql-injection


【解决方案1】:

最直接的解决方法是通过将字符串连接在一起来构建 sql,而是使用参数。如果您使用的是 SqlCommand,您可以执行以下操作,否则按照 @MarcB 的建议执行

SqlCommand cmd = new SqlCommand("INSERT dbo.Table (field1, field2, field3) VALUES (@f1, @f2, @f3)", conn);

cmd.Paramters.Add("@f1", SqlDbType.VarChar, 50).Value = "abc";
cmd.Paramters.Add("@f2", SqlDbType.Int).Value = 2;
cmd.Paramters.Add("@f3", SqlDbType.VarChar, 50).Value = "some other value";

【讨论】:

  • 谢谢杰森。很有帮助。
  • @kcray 我不认为 OleDBCommand 支持命名您的参数。如果遇到麻烦,尝试将insert语句中的参数替换为问号:INSERT INTO table (field1, field2) values (?, ?),并在parameters.Add上省略名称。更好的是,如果你真的不需要 OleDb,切换到 System.Data.SqlClient 中的 SqlConnection 和 SqlCommand(仅适用于 ms sql 数据库),然后你可以像上面 Jason 一样使用命名参数。
  • @JMarsch 不错,可惜它不支持它,我已经更新了答案以消除任何混淆,这应该是用于 sql 命令
  • @Jason Yah,我一直希望对参数名称有更严格的规范(oracle 支持命名参数,但使用冒号作为分隔符而不是 at 符号,oledb 不支持命名参数等等)——我们最终编写了自己的参数包装器,以使用 at 符号作为分隔符来强制命名参数(当然这些天,我主要还是使用 EF)
猜你喜欢
  • 2011-09-27
  • 2011-06-12
  • 1970-01-01
  • 2018-03-23
  • 1970-01-01
  • 2021-07-19
  • 2019-06-22
  • 2013-08-31
相关资源
最近更新 更多