Hallo
André,
viele Grüße zurück nach Sydney!
Weshalb vergeht die Zeit nur immer so schnell!?
Ich hatte in den letzten 14 Tagen mit den
Indy-Quelltexten gekämpft und mich in einem Schnellkurs in die Grundlagen der HTTP-Kommunikation eingearbeitet.
Heute also die ersten Ergebnisse dieser Anstrengungen.
Mit einem Proxy kann man (fast) alles machen - aber auch schnell ziemlich viel falsch.
Ich möchte deshalb einige grundlegende Überlegungen zum Proxy an einem Beispiel demonstrieren.
Wer hat schon einmal versucht, die Google-Seite auf Englisch zu sehen? Das sollte eigentlich kein Problem sein:
http://www.google.com.
Interessanterweise landet man dann sofort auf der deutschen Seite google.de.
Ein Service? Das wollte ich doch aber gar nicht!!!
Ok. Erster Versuch mit dem Proxy:
Den Eintrag
Accept-Language auf
he eingestellt (1.) - zur Kontrolle die Header angeschaut (2.) - stimmt. Und schon kann die Maus Hebräisch.
Zweiter Versuch mit
Accept-Language auf
en (2.) - Kontrolle der Header (3.): stimmt. Kekse sicherheitshalber aus (4.) und ab zu google.com (1.).
Als Reaktion erhält man von Google die interessante Antwort, daß die Seite angeblich verschoben wurde (5.). Achso!?
Und als Folge davon kommt die Weiterleitung auf google.de (6.). Damit ist also klar, weshalb man Google nicht auf Englisch zu sehen bekommt.
Bleibt die Frage, wie Google erkennt, daß ich aus Deutschland komme. An der HTTP-Anfrage kann es nicht liegen - die Header wurden entsprechend korrigiert und verräterische Cookies vor der Übertragung gelöscht. Ein JavaScript wurde auch nicht geladen. Wertet Google eventuell die
IP-Adresse aus!?
Nächster Versuch mit einem weiteren, nachfolgenden Proxy aus dem Internet (1.):
Und siehe da: Wie durch ein Wunder kommt die erwartete Antwort vom Server (2.) und die gewünschte Seite (3.).
Also wertet Google offenbar doch die
IP des Computers aus (ich lasse mich natürlich gern eines Besseren belehren)!?.
Dazu etwas Stoff für Paranoiker: Wer nicht weiß,
wo er wohnt...
In diesem Zusammenhang eine lustige Sache: Diese Seite, die so für Anonymität im Internet plädiert, wertet die Besucher gleich mal schnell durch Google-Analytics aus (1. und 2.)...
Natürlich gibt es Firewalls, Plugins für Browsers und eine Menge anderer Tools, die für ein tolles Gefühl an Sicherheit und Anonymität sorgen - trotzdem ist es sehr interessant, einmal hinter die Kulissen zu schauen, um wieder mal etwas aus der Traumwelt aufzuwachen.
Dazu bietet sich ein Proxy an, mit dessen Hilfe man die volle Kontrolle über den aus- und eingehenden Datenverkehr einer TWebBrowser-Komponente erhält. Die
Indy-interne Komponente TIdHTTPProxyServer bietet eine Ausgangsbasis, die aber für eine vernünftige Handhabung erweitert werden muß. Einen möglichen Ausgangspunkt für eigene Experimente bietet die Komponente THTTPProxyServer auf Basis der
Indy's.
Sie besitzt vier Ereignishandler:
- OnCommand: Vom Klienten ist eine Anfrage eingetroffen. Die Anfrage inklusive aller Header und Cookies kann modifiziert und mit eigenen Werten versehen werden. Es ist auch möglich, die Anfrage abzubrechen und beliebige Daten an den Klienten zurückzusenden. Der Proxy würde dann quasi als HTTP-Server arbeiten. Damit wäre zum Beispiel auch die Arbeit mit Black- und Whitelists möglich, Cookies könnten unterdrückt und weitere Proxys vorgeschaltet werden.
- OnResponse: Vom Server ist die Antwort eingetroffen. Auch an dieser Stelle können alle Einträge im Header einschließlich der vom Server stammenden Cookies bearbeitet werden.
- OnDocument: Die vom Server angeforderten Daten (HTML-Seite, Bilder, ....) sind eingetroffen. Diese liegen in einem Memory-Stream vor und können auch bearbeitet werden. Hier gibt es allerdings (momentan noch) eine kleine Einschränkung: Wird der Inhalt gestreamt, wird dieses Ereignis nicht ausgelöst. Das ist aber in Arbeit.
- OnLog: Die Komponente THTTPProxyServer besitzt einen internen Log-Mechanismus. Ist die Eigenschaft Logging auf true gesetzt (standardmäßig false), wird nach der Abarbeitung der Klientanfrage dieses Ereignis im Kontext des Hauptthreads ausgelöst und kann so bedenkenlos zur Ausgabe von Informationen genutzt werden.
Delphi-Quellcode:
procedure TForm1.OnLog(Sender: TObject; LogItem: TLogItem);
begin
with ListView1.Items.Add do
begin
Caption:=LogItem.Request.Command;
Data:=LogItem;
SubItems.Add(IntToStr(LogItem.Response.Code));
SubItems.Add(LogItem.Response.ContentType);
SubItems.Add(LogItem.Request.Host);
SubItems.Add(LogItem.Request.Path);
SubItems.Add(LogItem.Request.Document);
SubItems.Add(LogItem.Request.Params);
end;
end;
Die Komponente ist noch im absoluten Anfangsstadium - inklusive etlicher Baustellen und Bugs...
Viel Spaß bei eigenen Experimenten!
P.S.: Mir ist bekannt, daß ich auch auf der deutschen Google-Seite Englisch als Oberflächensprache einstellen kann (das geht dann per Cookie). Mir ging es aber um eine Klärung der Frage, wie ich auf google.com gelangen und auch dort bleiben kann, ohne gleich wieder weggeschickt zu werden.