我编写了一个插入带参数的记录的方法,但是我不能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");
}
答案 0 :(得分:0)
只要您完全控制string tbl
和string col
的值,这就是注入安全的,因为这两个字符串可以将任何部分插入到发送的SQL字符串中到RDBMS。
我会改变这个实现,并传递一组单独的列值,而不是传递以逗号分隔的列列表。这样做的原因是重新组装字符串比拆解字符串更直接。例如,对于包含逗号的分隔标识符的表,您解析字符串的方式会中断。
这是完全合法的查询 *
SELECT [Return, Raw], [Return, Normalized] FROM Returns
由于嵌入了逗号,您的方法会失败。如果您传递一组标识符,则可以轻松地重建以逗号分隔的列表,如下所示:
string[] colNames = new[] {"[Return, Raw]", "[Return, Normalized]"};
var col = string.Join(", ", colNames);
* 虽然我不一定建议使用这样的名称,但您可能需要使用不会让您选择的现有数据库。