不参数化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?

提问人:d703732 提问时间:7/10/2019 更新时间:7/10/2019 访问量:372

问:

例如:

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

C# mysql .net sql 注入 参数化查询

评论

0赞 Filburt 7/10/2019
我还会考虑与参数化命令一起使用与一个批量 INSERT 命令相比可能带来的好处。Prepare()
0赞 Marc Gravell 7/10/2019
仅供参考,管道中还有一个新的 ADO.NET 批处理 API,但它在一段时间内不会可用
0赞 ste-fu 7/10/2019
这取决于你是否真的相信输入。转义字符串有旁路(谷歌返回详细信息)。

答:

2赞 Your Common Sense 7/10/2019 #1

不能使用该方法代替参数。仅仅因为这两个选项不相等。它们甚至没有关系。尽管人们普遍认为,无论逃跑什么都不是为了保护,而且从来都不是。它有一个非常具体的目的,只是意外地可能会阻止SQL注入。而参数化查询,如果使用得当,将保证保护。whatever.EscapeString(string)

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

我还建议将您的插入物包装在交易中,这可能会显着加快事情的速度。

评论

0赞 d703732 7/12/2019
非常感谢您的回复。我将考虑到它以进行进一步发展。我想我将尝试 Entity Framework,尽管我认为没有外键的 298 个表的数据库不会让我的任务变得更容易。