LOAD DATA local INFILE не может работать на ядре .net - PullRequest
0 голосов
/ 07 февраля 2019

Следующий запрос работает в mysql.

DROP TEMPORARY TABLE IF EXISTS TempTbl; 
create temporary table TempTbl like ACTIVITY; 

LOAD DATA local INFILE 'C:\\test\\000000135_20190109133919.flat' 
INTO TABLE TempTbl COLUMNS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES; 

Но когда я пытаюсь запустить в ядре .net, я получаю следующую ошибку.Как я могу решить?

var db = new RheEntities(Utils.GetAppSettingsByKey("ConnectionStrings:RheConnection"));
var query = System.IO.File.ReadAllText(Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "App_Data/BulkInsertTemplate.sql"));
db.Database.ExecuteSqlCommand(query);

Сообщение об исключении:

Error during LOAD DATA LOCAL INFILE

StackTrace:

at MySql.Data.MySqlClient.MySqlDataReader.ActivateResultSet(ResultSet resultSet) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlDataReader.cs:line 80
at MySql.Data.MySqlClient.MySqlDataReader.ReadFirstResultSetAsync(IOBehavior ioBehavior) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlDataReader.cs:line 302
at MySql.Data.MySqlClient.MySqlDataReader.CreateAsync(MySqlCommand command, CommandBehavior behavior, ResultSetProtocol resultSetProtocol, IOBehavior ioBehavior) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlDataReader.cs:line 287
at MySqlConnector.Core.TextCommandExecutor.ExecuteReaderAsync(String commandText, MySqlParameterCollection parameterCollection, CommandBehavior behavior, IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\Core\TextCommandExecutor.cs:line 37
at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQueryAsync(IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlCommand.cs:line 261
at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery() in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlCommand.cs:line 62
at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection connection, DbCommandMethod executeMethod, IReadOnlyDictionary`2 parameterValues)
at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteNonQuery(IRelationalConnection connection, IReadOnlyDictionary`2 parameterValues)
at Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.ExecuteSqlCommand(DatabaseFacade databaseFacade, RawSqlString sql, IEnumerable`1 parameters)
at Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.ExecuteSqlCommand(DatabaseFacade databaseFacade, RawSqlString sql, Object[] parameters)

InnerException:

Use SourceStream or SslMode >= VerifyCA for LOAD DATA LOCAL INFILE

Деталь:

.Net core 2.2

Microsoft.EntityFrameworkCore 2.2.1

Pomelo.EntityFrameworkCore.MySql 2.1.4

MySqlConnector 0.47.1

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Это функция безопасности в MySqlConnector;см. выпуск 334 .Поскольку вы не подключены к проверенному хосту, MySqlConnector защищает от уязвимости раскрытия информации, которая может позволить злонамеренному серверу / прокси читать любой локальный файл в вашей системе.

С Проблемы безопасности с LOAD DATA LOCAL :

Есть две потенциальные проблемы безопасности с локальной версией LOAD DATA:

  • Инициирована передача файла с клиентского хоста на хост серверасервером MySQL.Теоретически, можно создать пропатченный сервер, который будет указывать клиентской программе передавать файл по выбору сервера, а не файл, указанный клиентом в операторе LOAD DATA.Такой сервер может получить доступ к любому файлу на клиентском хосте, к которому у клиента есть доступ на чтение.

Вы можете обойти его, используя класс MySqlBulkLoader вместо того, чтобы создавать SQL самостоятельно:

var loader = new MySqlBulkLoader(db.Database)
{
    FileName = "C:\\test\\000000135_20190109133919.flat",
    TableName = "TempTbl",
    FieldTerminator = ",",
    FieldQuotationCharacter = '"',
    NumberOfLinesToSkip = 1,
};
loader.Load();
0 голосов
/ 07 февраля 2019

Проблема решена с помощью MySql.Data (8.0.15).Я думаю, что есть проблема в (Pomelo.EntityFrameworkCore.MySql 2.1.4 / MySqlConnector 0.47.1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...