通过使用方法插入来规避sql注入

时间:2016-03-23 20:22:56

标签: c# mysql

我编写了一个插入带参数的记录的方法,但是我不能100%确定我是否在这样做时避免了SQL注入的安全性?

如果我拆开查询并以这种方式重组它,是否可以注入sql?

string tbl = "tbl_jobLogs";
string col = "job,user,logDate,log,logType" ; //,logType";
string val = jobID.ToString() + "," + user.ToString() + "," + dt.ToString("yyyy-MM-dd H:mm:ss") + "," + log + "," + logType.ToString() ;

MessageBox.Show(InsertWithParameters(tbl,col,val));

使用此方法

string InsertWithParameters(string tbl, string col, string val)
    {
        string cnString = "connectionstring";
        string sqlParameters = col.Replace(",", ",@");
        sqlParameters = "@" + sqlParameters; //add the first @

        List<string> columns = col.Split(',').ToList<string>();
        List<string> values = val.Split(',').ToList<string>();
        List<string> paramenters = sqlParameters.Split(',').ToList<string>();


        string sql = "insert into " + tbl + " (" + col + ") values (" + sqlParameters + ")";

        try
        {
            MySqlConnection cnn = new MySqlConnection(cnString);
            cnn.Open();
            MySqlCommand cmd = cnn.CreateCommand();
            cmd.CommandText = sql;
            for (int i = 0; i <= columns.Count - 1; i++)
            {
                cmd.Parameters.AddWithValue(paramenters[i], values[i]);
            } 

            cmd.ExecuteNonQuery();
            cnn.Close();

        }
        catch (Exception)
        {
            throw;
           // TODO: Error Log
        }

        return ("Record Inserted");
    }

1 个答案:

答案 0 :(得分:0)

只要您完全控制string tblstring col的值,这就是注入安全的,因为这两个字符串可以将任何部分插入到发送的SQL字符串中到RDBMS。

我会改变这个实现,并传递一组单独的列值,而不是传递以逗号分隔的列列表。这样做的原因是重新组装字符串比拆解字符串更直接。例如,对于包含逗号的分隔标识符的表,您解析字符串的方式会中断。

这是完全合法的查询 *

SELECT [Return, Raw], [Return, Normalized] FROM Returns

由于嵌入了逗号,您的方法会失败。如果您传递一组标识符,则可以轻松地重建以逗号分隔的列表,如下所示:

string[] colNames = new[] {"[Return, Raw]", "[Return, Normalized]"};
var col = string.Join(", ", colNames);

* 虽然我不一定建议使用这样的名称,但您可能需要使用不会让您选择的现有数据库。