Discussão do artigo "Utilizando WinInet.dll para a troca de dados entre plataformas via internet" - página 2

 
Graff:

Os números de erro são diferentes.

o erro foi corrigido

na função

int HttpOpenRequestW

é necessário definir o sexto parâmetro como int e passar 0 para ele em vez de " ".

int HttpOpenRequestW(int hConnect, string &lpszVerb, string &lpszObjectName, string &lpszVersion, string &lpszReferer, int lplpszAcceptTypes, uint dwFlags, int dwContext);

 
sergeev:

erro corrigido

na função

int HttpOpenRequestW

é necessário definir o sexto parâmetro como int e passar 0 para ele em vez de " "

int HttpOpenRequestW(int hConnect, string &lpszVerb, string &lpszObjectName, string &lpszVersion, string &lpszReferer, int lplpszAcceptTypes, uint dwFlags, int dwContext);


Não funciona, recebo o mesmo erro. Como corrigir isso?
 
arbuz:
Não funciona, diz o mesmo erro, como faço para corrigir isso?

Acabei de fazer uma revisão de todas as classes há uma semana.

Está funcionando bem.

 

Antes de mais nada, gostaria de agradecer ao autor por este artigo. Acho que esse tópico é relevante principalmente para os operadores que já têm seus desenvolvimentos originais e buscam proteger sua propriedade intelectual. O modelo de transmissão de sinais de negociação por meio do servidor é adequado para essa finalidade.

Alex, seu artigo é excelente, mas acho que um ponto muito importante não foi abordado, ou seja, como transmitir todos esses dados de forma criptografada por meio de uma conexão segura (criptografia de 256 bits). Ou seja, os sinais do computador A são transmitidos para o servidor por meio de uma conexão segura e, por sua vez, o computador B também lê esses dados do servidor por meio de uma conexão segura. Com essa organização da transmissão de sinais, o corretor não poderá rastrear a origem desses sinais, pois todo o tráfego será criptografado.

Alex, o que você acha disso e como a questão da segurança pode ser resolvida de forma mais eficaz?

 
enotis:

Alex, o que você acha disso e como a questão da segurança pode ser resolvida de forma mais eficaz?

Gostaria de direcioná-lo para a segunda parte do artigo - transmissão POST e uso de multipart/form-data.

Quanto à segurança, entendo que você está falando sobre trabalhar com certificados SSL?

Isso pode ser resolvido com a adição de dois sinalizadores ao criar solicitações. Mas eu recomendaria trabalhar com o WinHttp.dll para SSL.

Tudo é quase idêntico na interface de criação de solicitações, mas ele é anunciado como mais avançado e tem um pouco mais de recursos.

 
sergeev:

Gostaria de direcioná-lo para a segunda parte do artigo - transmissão POST e uso de multipart/form-data.

Quanto à segurança, entendo que você está falando sobre trabalhar com certificados SSL?

Isso pode ser resolvido com a adição de dois sinalizadores ao criar solicitações. Mas eu recomendaria trabalhar com o WinHttp.dll para SSL.

Tudo é quase idêntico na interface de criação de solicitações, mas ele é anunciado como mais avançado e tem um pouco mais de recursos.


Sim, eu estava me referindo aos certificados SSL. Obrigado pela orientação, eu a levei em consideração. Se entendi corretamente, você concorda que esse modelo de organização de transferência de dados pode ser considerado suficientemente seguro?
 
enotis:
Sim, eu estava me referindo a certificados SSL. Obrigado por sua orientação, eu a levei em consideração. Se entendi corretamente, então você concorda que esse modelo de organização da transferência de dados pode ser considerado suficientemente seguro?

Você provavelmente pode pensar em outras opções. Por exemplo, você mesmo pode criptografar seus dados e transmiti-los abertamente.

Essa é uma função da classe MqlNet, com verificação SSL

//------------------------------------------------------------------ Request
bool MqlNet::Request(tagRequest &req)
{
  if(!TerminalInfoInteger(TERMINAL_DLLS_ALLOWED)) { Print("-DLL not allowed"); return(false); } // verificar se a DLL é permitida no terminal
  if(!MQL5InfoInteger(MQL5_DLLS_ALLOWED)) { Print("-DLL not allowed"); return(false); } // verificar se a DLL é permitida no terminal
  if (req.toFile && req.stOut=="") { Print("-File not specified "); return(false); }
  uchar data[]; int hRequest, hSend; 
  string Vers="HTTP/1.1"; string nill="";
  if (req.fromFile) { if (FileToArray(req.stData, data)<0) { Print("-Err reading file "+req.stData); return(false); } }// ler o arquivo em uma matriz
  else StringToCharArray(req.stData, data);
  
  if (hSession<=0 || hConnect<=0) { Close(); if (!Open(Host, Port, User, Pass, Service)) { Print("-Err Connect"); Close(); return(false); } }
  // criar um descritor de solicitação
  hRequest=HttpOpenRequestW(hConnect, req.stVerb, req.stObject, Vers, nill, 0, INTERNET_FLAG_KEEP_CONNECTION|INTERNET_FLAG_RELOAD|INTERNET_FLAG_PRAGMA_NOCACHE, 0); 
  if (hRequest<=0) { Print("-Err OpenRequest"); InternetCloseHandle(hConnect); return(false); }
  
  
  // enviar a solicitação
  int n=0;
  while (n<3) // faça duas tentativas de envio. a primeira é normal, a segunda se o SSL for necessário
  {
    n++;
    hSend=HttpSendRequestW(hRequest, req.stHead, StringLen(req.stHead), data, ArraySize(data)); // enviou o arquivo
    if (hSend<=0) // se o envio não for bem-sucedido, verifique o SSL
    {       
      int err=0; err=GetLastError(err); Print("-Err SendRequest= ", err); 
      if (err!=ERROR_INTERNET_INVALID_CA) // se o erro estiver realmente relacionado à solicitação SSL
      {
        int dwFlags;
        int dwBuffLen = sizeof(dwFlags); // definir sinalizadores adicionais
        InternetQueryOptionW(hRequest, INTERNET_OPTION_SECURITY_FLAGS, dwFlags, dwBuffLen);
        dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;
        int rez=InternetSetOptionW(hRequest, INTERNET_OPTION_SECURITY_FLAGS, dwFlags, sizeof (dwFlags));
        if (!rez) { Print("-Err InternetSetOptionW= ", GetLastError(err)); break; }
      }
      else break;
    } 
    else break;
  }
  if (hSend>0) ReadPage(hRequest, req.stOut, req.toFile); // ler a página se enviada
  InternetCloseHandle(hRequest); InternetCloseHandle(hSend); // fechar todas as alças
  if (hSend<=0) Close(); // fechar em caso de erro
  return(true);
}
 

Você também pode definir os seguintes sinalizadores

dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;
dwFlags |= SECURITY_FLAG_IGNORE_CERT_DATE_INVALID;
dwFlags |= SECURITY_FLAG_IGNORE_CERT_CN_INVALID;

 
sergeev:

Você também pode definir os seguintes sinalizadores

dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;
dwFlags |= SECURITY_FLAG_IGNORE_CERT_DATE_INVALID;
dwFlags |= SECURITY_FLAG_IGNORE_CERT_CN_INVALID;


Sim, há muitas opções de criptografia, mas esse é o tópico de um artigo separado. Primeiro, precisamos levantar o modelo de sinalização por meio de hospedagem. Obrigado pelas dicas.
 

Olá,

O Metachat é uma boa ideia e eu gostaria de ter um funcionando.

Nada do que foi mencionado no site fxmaster.de está funcionando mais. Você poderia fornecer o código-fonte PHP do metachat? Muito obrigado.