Может ли советник без DLL функций отправить куда-нибудь данные? - страница 3

 
Renat Fatkhullin:

Даже если что-то закодировать в input переменные, то эти значения никогда не попадут не только в логи клаудных агентов, но и локальных.

Во первых, объем вывода в логи клаудных агентов урезан донельзя, чтобы не раскрывать данных. Во вторых, режим оптимизации(а в клауде запускается только оптимизация) полностью отключает логгирование даже в локальных агентах.

В общем, вы делаете умозрительные заключения, не имея в руках фактических данных по работе клаудных агентов и их логов.

Если советник будет записывать input-переменные в /Files облачного агента в OnInit, то, как минимум, на время прогона этот файл будет доступен. Злоумышленнику нужно только отслеживать любые изменения в /Files и копировать их себе.

Нужно запрещать на Облачных агентах создавать файлы, чтобы закрыть эту дыру безопасности. Также нельзя хранить глобальные переменные в файлах клаудного агента.

ЗЫ 

fxsaber:
  • tester_file вшивается ли на этапе компиляции в EX5 или нет?
 
Хватит уже из пальца высасывать глупости.
 
Renat Fatkhullin:
Хватит уже из пальца высасывать глупости.

Могу кодом доказать.

 
fxsaber:

Могу кодом доказать.

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

И tester_file вам никак не поможет, так как вы не сможете его менять. В клауд уйдет исходный статический файл, взятый до момента запуска тестирования. То есть, в него не сможете ничего записывать по ходу тестирования.


В рамках конкретного прохода агент имеет право писать в /files и никаких проблем в этом нет. После отработки прохода все стирается.

Так что глупости и попытка натянуть ну хоть какой-то мизер.

 
Renat Fatkhullin:

Не докажите

  1. Из "Маркета" юзер скачивает этот советник
    input int Range = 0;
    sinput long AccountNumber = 0; // ------
    
    template <typename T>
    bool DataToFile( const string FileName, const T Data, const int Common_Flag = 0 )
    {
      T Tmp[1];    
      Tmp[0] = Data;
      
      return(FileSave(FileName, Tmp, Common_Flag));
    }
    
    template <typename T>
    bool FileToData( const string FileName, T &Data, const int Common_Flag = 0 )
    {
      T Tmp[];    
      
      const bool Res = FileLoad(FileName, Tmp, Common_Flag) && (ArraySize(Tmp) > 0);
      
      if (Res)
        Data = Tmp[0];
      
      return(Res);
    }
    
    const string FileNameIn = "PrivateData.in";
    const string FileNameOut = "PrivateData.out";
    
    void OnInit()
    {
      if (MQLInfoInteger(MQL_OPTIMIZATION) || MQLInfoInteger(MQL_FRAME_MODE))
      {
        if (AccountNumber)
          DataToFile(FileNameOut, AccountNumber);
      }
      else if (!FileIsExist(FileNameIn))
        DataToFile(FileNameIn, AccountInfoInteger(ACCOUNT_LOGIN));
    }
    
    void OnTesterInit()
    {
      long Data;
      
      if (FileToData(FileNameIn, Data))  
        ParameterSetRange("AccountNumber", true, 0, 0, Data, Data);
    }
    
    void OnTesterDeinit()
    {
    }
  2. Запускает его хоть раз на своем счету.
  3. Решает оптимизировать его через Облако.
  4. Все облачные агенты, получившие задание, создают файл Files\PrivateData.out (существует, как минимум, на время прогона), где содержится номер счета юзера.
На локальных агентах воспроизводится на 100%. Специально создал вариант передачи через входные параметры. Через tester_file было бы еще проще.
 

А теперь достаньте это в клауде на практике, привяжите к своей программе и не упустите момент стирания файла.

Особенно с учетом того, что владелец клаудного агента даже узнать имен запускаемых программ не может, так как они не пишутся на диск и вообще в логах не фигурируют.

 
Renat Fatkhullin:

А теперь достаньте это в клауде на практике, привяжите к своей программе и не упустите момент стирания файла.

Особенно с учетом того, что владелец клаудного агента даже узнать имен запускаемых программ не может, так как они не пишутся на диск и вообще в логах не фигурируют.

Подведем промежуточный итог

  • Нежелательные данные все таки отправить можно.
  • Их даже записать на стороне получается.
  • Вот только записываются они лишь на время прогона (может достигать нескольких минут), а далее стираются сразу (на локальных агентах это не так).
Выходит, что осталось погуглить стороннюю программу, которая будет следить за изменениями \Files папки своего облачного агента и копировать все изменения в ней. Думаю, с этим проблем возникнуть не должно.
 

Клауд вы не контролируете и тем самым у вас по факту нет возможности что-либо получить.

Между теорией и практикой большая разница. Вернее, мизерная вероятность построить цепочку "Успешный продукт -> Массовая продажа -> Риск полного бана -> Ожидание запуска в клауде -> Покрытие достаточной доли клаудных агентов, чтобы получить шанс на часть задач -> ... -> А профит где?"

Я не зря указал "Причем понимаете, что шансов смоделировать весь процесс у вас нет". Нет шансов, так что ситуация высосана из пальца.

 
Renat Fatkhullin:

Клауд вы не контролируете и тем самым у вас по факту нет возможности что-либо получить.

Между теорией и практикой большая разница. Вернее, мизерная вероятность построить цепочку "Успешный продукт -> Массовая продажа -> Риск полного бана -> Ожидание запуска в клауде -> Покрытие достаточной доли клаудных агентов, чтобы получить шанс на часть задач -> ... -> А профит где?"

Я не зря указал "Причем понимаете, что шансов смоделировать весь процесс у вас нет". Нет шансов, так что ситуация высосана из пальца.

Я ответил на вопрос в названии ветки. При желании разослать публично в Облако любые данные можно. Механизм описан и реализован в коде. Не замечать - право каждого.
 
fxsaber:

  1. Из "Маркета" юзер скачивает этот советник
  2. Запускает его хоть раз на своем счету.
  3. Решает оптимизировать его через Облако.
  4. Все облачные агенты, получившие задание, создают файл Files\PrivateData.out (существует, как минимум, на время прогона), где содержится номер счета юзера.

Второй пункт для примера отправки номера счета не требуется, поэтому код может быть лаконичнее

sinput long PrivateData = 0; // ------

template <typename T>
bool DataToFile( const string FileName, const T Data, const int Common_Flag = 0 )
{
  T Tmp[1];    
  Tmp[0] = Data;
  
  return(FileSave(FileName, Tmp, Common_Flag));
}

void OnInit()
{
  if (MQLInfoInteger(MQL_OPTIMIZATION) && PrivateData)
    DataToFile("PrivateData.out", PrivateData);
}

void OnTesterInit()
{
  const long Data = AccountInfoInteger(ACCOUNT_LOGIN); // Что отправляем
  
  ParameterSetRange("PrivateData", true, 0, 0, Data, Data);
}

void OnTesterDeinit()
{
}
Причина обращения: