c# - 当进行非常大的插入时,不参数化 MySQL 查询而是使用方法 MySqlHelper.EscapeString(string) 是否安全?

标签 c# mysql .net sql-injection parameterized-query

例如:

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 注入(inject)。而参数化查询如果使用得当,将保证保护。

也就是说,当您 Prepare() 查询一次,然后仅 execute() 时,对于多次插入,使用参数会更快循环中准备好的查询。

我还建议将您的插入内容包装在事务中,这可能会显着加快速度。

关于c# - 当进行非常大的插入时,不参数化 MySQL 查询而是使用方法 MySqlHelper.EscapeString(string) 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56968876/

相关文章:

c# - 如何查看 xamarin 形式的两个引脚之间的距离并将距离作为字符串获取?

mysql - Node js和mysql中的多个查询

asp.net - .NET进程和AppDomains在什么情况下会共享内存中已加载的程序集?

c# - 使用 C# 为我自己的项目创建我自己的插件

c# - 测试字典<k,v>中的一项

php - WordPress:$wpdb->get_results();第一次循环后返回错误结果

c# - 单元测试在 Thread.Sleep 时间之前完成

c# - 如何在C#上获取字符串的中心部分

c# - 如何在 <%# Eval "or")%> 内联语句中使用 ('column' 条件?

mysql - 创建 MySQL 触发器的 SQL 语法错误