Discussione sull’articolo "Utilizzo di WinInet.dll per lo scambio di dati tra terminali tramite Internet" - pagina 2

 
Graff:

I numeri di errore sono diversi.

l'errore è stato corretto

nella funzione

int HttpOpenRequestW

è necessario definire il sesto parametro come int e passare 0 al posto di " ".

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

 
sergeev:

errore corretto

nella funzione

int HttpOpenRequestW

è necessario definire il sesto parametro come int e passargli 0 al posto di " ".

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


Non funziona, ottengo lo stesso errore, come risolverlo?
 
arbuz:
Non funziona, dice lo stesso errore, come posso risolverlo?

Ho fatto una revisione di tutte le classi una settimana fa.

Funziona bene.

 

Innanzitutto, vorrei ringraziare l'autore per questo articolo. Penso che questo argomento sia rilevante soprattutto per quei trader che hanno già i loro sviluppi originali e cercano di proteggere la loro proprietà intellettuale. Il modello di trasmissione dei segnali di trading attraverso il server si adatta perfettamente a questo scopo.

Alex, il tuo articolo è eccellente, ma credo che non sia stato toccato un punto molto importante, ovvero come trasmettere tutti questi dati in forma criptata attraverso una connessione sicura (crittografia a 256 bit). Cioè, i segnali dal computer-A vengono trasmessi al server attraverso una connessione sicura, a sua volta il computer-B legge questi dati dal server attraverso una connessione sicura. Con una tale organizzazione della trasmissione dei segnali, il broker non sarà in grado di risalire alla fonte di questi segnali, poiché tutto il traffico sarà criptato.

Alex, cosa ne pensi e come puoi risolvere il problema della sicurezza in modo più efficace?

 
enotis:

Alex, cosa ne pensi e come si può risolvere il problema della sicurezza in modo più efficace?

Vorrei indirizzarvi alla seconda parte dell' articolo - trasmissione POST e uso di multipart/form-data.

Per quanto riguarda la sicurezza, mi sembra di capire che stia parlando di lavorare con i certificati SSL?

Questo può essere risolto aggiungendo due flag durante la creazione delle richieste. Tuttavia, consiglierei di lavorare con WinHttp.dll per l'SSL.

Tutto è quasi identico nell'interfaccia di creazione delle richieste, ma è pubblicizzato come più avanzato e ha un po' più di funzioni.

 
sergeev:

Vorrei indirizzarvi alla seconda parte dell' articolo - trasmissione POST e utilizzo di multipart/form-data.

Per quanto riguarda la sicurezza, mi sembra di capire che si stia parlando di lavorare con i certificati SSL?

Questo può essere risolto aggiungendo due flag durante la creazione delle richieste. Ma consiglierei di lavorare con WinHttp.dll per l'SSL.

Tutto è quasi identico nell'interfaccia di creazione delle richieste, ma è pubblicizzato come più avanzato e ha un po' più di funzioni.


Sì, mi riferivo ai certificati SSL. Grazie per il consiglio, l'ho preso in considerazione. Se ho capito bene, sei d'accordo che questo modello di organizzazione del trasferimento dei dati può essere considerato sufficientemente sicuro?
 
enotis:
Sì, mi riferivo ai certificati SSL. Grazie per il suo consiglio, ne ho tenuto conto. Se ho capito bene, sei d'accordo che questo modello di organizzazione del trasferimento dei dati può essere considerato sufficientemente sicuro?

Probabilmente si può pensare ad altre opzioni: ad esempio, si possono criptare i dati da soli e trasmetterli in chiaro.

questa è una funzione della classe MqlNet, con verifica SSL

//------------------------------------------------------------------ Request
bool MqlNet::Request(tagRequest &req)
{
  if(!TerminalInfoInteger(TERMINAL_DLLS_ALLOWED)) { Print("-DLL not allowed"); return(false); } // verificare se la DLL è consentita nel terminale
  if(!MQL5InfoInteger(MQL5_DLLS_ALLOWED)) { Print("-DLL not allowed"); return(false); } // verificare se la DLL è consentita nel terminale
  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); } }// leggere il file in un array
  else StringToCharArray(req.stData, data);
  
  if (hSession<=0 || hConnect<=0) { Close(); if (!Open(Host, Port, User, Pass, Service)) { Print("-Err Connect"); Close(); return(false); } }
  // creare un descrittore di richiesta
  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); }
  
  
  // inviare la richiesta
  int n=0;
  while (n<3) // effettua due tentativi di invio. il primo è normale, il secondo se è richiesto SSL
  {
    n++;
    hSend=HttpSendRequestW(hRequest, req.stHead, StringLen(req.stHead), data, ArraySize(data)); // invio del file
    if (hSend<=0) // se l'invio non va a buon fine, controllare SSL
    {       
      int err=0; err=GetLastError(err); Print("-Err SendRequest= ", err); 
      if (err!=ERROR_INTERNET_INVALID_CA) // se l'errore è davvero legato alla richiesta SSL
      {
        int dwFlags;
        int dwBuffLen = sizeof(dwFlags); // impostare i flag aggiuntivi
        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); // leggere la pagina se inviata
  InternetCloseHandle(hRequest); InternetCloseHandle(hSend); // chiudere tutte le maniglie
  if (hSend<=0) Close(); // chiudere in caso di errore
  return(true);
}
 

è possibile impostare anche i seguenti flag

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

 
sergeev:

è possibile impostare anche i seguenti flag

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


Sì, ci sono molte opzioni per la crittografia, ma questo è l'argomento di un articolo a parte. Per prima cosa dobbiamo aumentare il modello di segnalazione attraverso l'hosting. Grazie per i suggerimenti.
 

Salve,

Metachat è una buona idea e vorrei farne funzionare uno anch'io.

Sul sito fxmaster.de non c'è più nulla di funzionante - potete per favore fornire il sorgente PHP di metachat? Grazie mille.