Diskussion zum Artikel "Datenaustausch zwischen Terminals via Internet mit Hilfe von WinInet.dll" - Seite 2

 
Graff:

Die Fehlernummern sind unterschiedlich.

der Fehler wurde korrigiert

in der Funktion

int HttpOpenRequestW

ist es notwendig, den 6. Parameter als int zu definieren und ihm 0 anstelle von " " zu übergeben.

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

 
sergeev:

Fehler behoben

in der Funktion

int HttpOpenRequestW

ist es notwendig, den 6. Parameter als int zu definieren und ihm 0 anstelle von " " zu übergeben

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


Es funktioniert nicht, ich erhalte die gleiche Fehlermeldung, wie kann ich das beheben?
 
arbuz:
Es funktioniert nicht, es wird derselbe Fehler angezeigt, wie kann ich ihn beheben?

Ich habe erst vor einer Woche eine Überarbeitung aller Klassen vorgenommen.

Es funktioniert gut.

 

Zunächst einmal möchte ich dem Autor für diesen Artikel danken. Ich denke, dieses Thema ist vor allem für jene Händler relevant, die bereits eigene Entwicklungen haben und ihr geistiges Eigentum schützen wollen. Das Modell der Übermittlung von Handelssignalen über den Server ist für diesen Zweck sehr gut geeignet.

Alex, Ihr Artikel ist ausgezeichnet, aber ich denke, dass ein sehr wichtiger Punkt nicht angesprochen wurde, nämlich wie man all diese Daten in verschlüsselter Form über eine sichere Verbindung (256-Bit-Verschlüsselung) übertragen kann. D.h. die Signale von Computer A werden über eine sichere Verbindung an den Server übertragen, Computer B wiederum liest diese Daten ebenfalls über eine sichere Verbindung vom Server ab. Bei einer solchen Organisation der Signalübertragung kann der Broker die Quelle dieser Signale nicht zurückverfolgen, da der gesamte Datenverkehr verschlüsselt ist.

Alex, was hältst du davon und wie kann das Sicherheitsproblem besser gelöst werden?

 
enotis:

Alex, was denkst du darüber und wie kann das Sicherheitsproblem besser gelöst werden?

Ich möchte Sie auf den zweiten Teil des Artikels verweisen - POST-Übertragung und Verwendung von multipart/form-data.

Was die Sicherheit betrifft, so sprechen Sie von der Arbeit mit SSL-Zertifikaten?

Dies kann durch Hinzufügen von zwei Flags bei der Erstellung von Anfragen gelöst werden. Aber ich würde empfehlen, mit WinHttp.dll für SSL zu arbeiten.

Die Schnittstelle für die Erstellung von Anfragen ist fast identisch, aber sie wird als fortschrittlicher angepriesen und hat ein paar mehr Funktionen.

 
sergeev:

Ich möchte Sie auf den zweiten Teil des Artikels verweisen - POST-Übertragung und Verwendung von multipart/form-data.

Was die Sicherheit betrifft, so sprechen Sie von der Arbeit mit SSL-Zertifikaten?

Dies kann durch das Hinzufügen von zwei Flags bei der Erstellung von Anfragen gelöst werden. Aber ich würde empfehlen, mit WinHttp.dll für SSL zu arbeiten.

Die Schnittstelle zur Erstellung von Anfragen ist fast identisch, aber sie wird als fortschrittlicher angepriesen und hat ein paar mehr Funktionen.


Ja, ich bezog mich auf SSL-Zertifikate. Danke für den Hinweis, ich habe ihn berücksichtigt. Wenn ich Sie richtig verstanden habe, stimmen Sie zu, dass dieses Modell der Datenübertragungsorganisation als ausreichend sicher angesehen werden kann?
 
enotis:
Ja, ich bezog mich auf SSL-Zertifikate. Ich danke Ihnen für Ihren Hinweis, ich habe ihn berücksichtigt. Wenn ich Sie richtig verstehe, sind Sie also auch der Meinung, dass dieses Modell der Datenübermittlung als ausreichend sicher angesehen werden kann?

Wahrscheinlich fallen Ihnen noch andere Möglichkeiten ein, z.B. können Sie Ihre Daten selbst verschlüsseln und offen übertragen.

dies ist eine Funktion der Klasse MqlNet, mit SSL-Verifizierung

//------------------------------------------------------------------ Request
bool MqlNet::Request(tagRequest &req)
{
  if(!TerminalInfoInteger(TERMINAL_DLLS_ALLOWED)) { Print("-DLL not allowed"); return(false); } // Prüfen, ob die DLL im Terminal erlaubt ist
  if(!MQL5InfoInteger(MQL5_DLLS_ALLOWED)) { Print("-DLL not allowed"); return(false); } // Prüfen, ob die DLL im Terminal erlaubt ist
  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); } }// Lesen der Datei in ein 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); } }
  // Erstellen eines Anforderungsdeskriptors
  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); }
  
  
  // Senden der Anfrage
  int n=0;
  while (n<3) // zwei Sendeversuche unternehmen. der erste ist normal, der zweite, wenn SSL erforderlich ist
  {
    n++;
    hSend=HttpSendRequestW(hRequest, req.stHead, StringLen(req.stHead), data, ArraySize(data)); // Senden der Datei
    if (hSend<=0) // wenn das Senden nicht erfolgreich ist, SSL prüfen
    {       
      int err=0; err=GetLastError(err); Print("-Err SendRequest= ", err); 
      if (err!=ERROR_INTERNET_INVALID_CA) // wenn der Fehler wirklich mit der SSL-Anfrage zusammenhängt
      {
        int dwFlags;
        int dwBuffLen = sizeof(dwFlags); // zusätzliche Flaggen setzen
        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); // Lesen der Seite, falls gesendet
  InternetCloseHandle(hRequest); InternetCloseHandle(hSend); // alle Griffe schließen
  if (hSend<=0) Close(); // Schließen bei Fehler
  return(true);
}
 

können Sie auch die folgenden Flags setzen

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

 
sergeev:

können Sie auch die folgenden Flags setzen

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


Ja, es gibt eine Menge Optionen für die Verschlüsselung, aber das ist das Thema eines separaten Artikels. Zuerst müssen wir das Modell der Signalisierung durch das Hosting erhöhen. Vielen Dank für die Tipps.
 

Hallo,

Metachat ist eine gute Idee und ich würde es gerne selbst zum Laufen bringen.

Auf der Seite fxmaster.de funktioniert nichts mehr - können Sie mir bitte den PHP-Source zu metachat zur Verfügung stellen? Vielen Dank!