Безопасно ли не параметризировать запрос MySQL, а вместо этого использовать метод MySqlHelper.EscapeString (string), когда выполняются очень большие вставки? - PullRequest
0 голосов
/ 10 июля 2019

Например:

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 при массовых вставках.

1 Ответ

2 голосов
/ 10 июля 2019

Вы не можете использовать метод whatever.EscapeString(string) вместо параметров. Просто потому, что эти два варианта не равны. Они даже не связаны. Несмотря на общее убеждение, все, что удалось избежать, не предназначено для защиты и никогда не было. Он имеет очень конкретное назначение и только случайно может предотвратить внедрение SQL. Принимая во внимание, что параметризованный запрос, при правильном использовании, гарантирует защиту.

Тем не менее, использование параметров будет быстрее для множественных вставок, когда вы Prepare() запрос один раз, а затем только execute(), который подготовил запрос в цикле.

Я бы также порекомендовал обернуть ваши вставки в транзакцию , это может значительно ускорить процесс.

...