不对 MySQL 查询进行参数化,而是在进行非常大的插入时使用方法 MySqlHelper.EscapeString(string) 是否安全?
Is it safe to not parameterize an MySQL query, and instead use the method MySqlHelper.EscapeString(string) when very large inserts are made?
例如:
StringBuilder sCommand = new StringBuilder("INSERT INTO User (FirstName, LastName) VALUES ");
using (MySqlConnection mConnection = new MySqlConnection(ConnectionString))
{
List<string> Rows = new List<string>();
for (int i = 0; i < 100000; i++)
{
Rows.Add(string.Format("('{0}','{1}')", MySqlHelper.EscapeString("test"), MySqlHelper.EscapeString("test")));
}
sCommand.Append(string.Join(",", Rows));
sCommand.Append(";");
mConnection.Open();
using (MySqlCommand myCmd = new MySqlCommand(sCommand.ToString(), mConnection))
{
myCmd.CommandType = CommandType.Text;
myCmd.ExecuteNonQuery();
}
}
我想知道不参数化 MySQL 查询是否同样安全,而是在进行大量插入时使用 MySqlHelper.EscapeString
。
您不能使用方法 whatever.EscapeString(string)
代替参数。仅仅是因为这两个选项不相等。他们甚至没有关系。尽管人们普遍认为,任何逃避都不是为了保护,而且从来没有。它有一个非常具体的目的,只是意外 可能 阻止 SQL 注入。而参数化查询,如果使用得当,将 保证 受到保护。
也就是说,当您 Prepare()
查询一次,然后只 execute()
在循环中准备查询时,使用参数将 更快 进行多次插入.
我还建议将您的插入内容包装在 事务 中,这可能会显着加快处理速度。
例如:
StringBuilder sCommand = new StringBuilder("INSERT INTO User (FirstName, LastName) VALUES ");
using (MySqlConnection mConnection = new MySqlConnection(ConnectionString))
{
List<string> Rows = new List<string>();
for (int i = 0; i < 100000; i++)
{
Rows.Add(string.Format("('{0}','{1}')", MySqlHelper.EscapeString("test"), MySqlHelper.EscapeString("test")));
}
sCommand.Append(string.Join(",", Rows));
sCommand.Append(";");
mConnection.Open();
using (MySqlCommand myCmd = new MySqlCommand(sCommand.ToString(), mConnection))
{
myCmd.CommandType = CommandType.Text;
myCmd.ExecuteNonQuery();
}
}
我想知道不参数化 MySQL 查询是否同样安全,而是在进行大量插入时使用 MySqlHelper.EscapeString
。
您不能使用方法 whatever.EscapeString(string)
代替参数。仅仅是因为这两个选项不相等。他们甚至没有关系。尽管人们普遍认为,任何逃避都不是为了保护,而且从来没有。它有一个非常具体的目的,只是意外 可能 阻止 SQL 注入。而参数化查询,如果使用得当,将 保证 受到保护。
也就是说,当您 Prepare()
查询一次,然后只 execute()
在循环中准备查询时,使用参数将 更快 进行多次插入.
我还建议将您的插入内容包装在 事务 中,这可能会显着加快处理速度。