我想使用变量并将此值作为表名的一部分传递给SQL语句,但是,我不确定我使用的方法是否安全(即使它有效) 。如果没有,我应该怎么做呢?
string connStr = ConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString;
MySqlConnection conn = new MySqlConnection(connStr);
string table = "1";
MySqlCommand comm = new MySqlCommand("INSERT INTO " + table + "_tests (user_id, score, time) VALUES (@user_id, @score, @time)", conn);
comm.Parameters.Add("@user_id", MySqlDbType.VarChar);
comm.Parameters["@user_id"].Value = "2";
comm.Parameters.Add("@score", MySqlDbType.VarChar);
comm.Parameters["@score"].Value = txtScore.ToString();
comm.Parameters.Add("@time", MySqlDbType.VarChar);
comm.Parameters["@time"].Value = txtTime.ToString();
更新:
int tableID = Convert.ToInt32(Session["TestModuleID"].ToString());
MySqlCommand comm = new MySqlCommand("INSERT INTO " + tableID.ToString() + "_tests (user_id, score, time) VALUES (@user_id, @score, @time)", conn);
答案 0 :(得分:2)
你说的是正确的。您可能已经猜到了,您不能使用参数作为表名。
您的代码引发的安全问题可以通过将table
变量重新声明为整数来删除,就像这样......
int table = 1;
MySqlCommand comm = new MySqlCommand (
"INSERT INTO " + table.ToString() +
"_tests (user_id, score, time) VALUES (@user_id, @score, @time)", conn);
这将使任何非数字不会进入您的查询。还有其他方法可以控制table
变量的值。