So, meine Lieben… Ich konnte vor paar Tagen nicht schlafen, weil mir eine Idee den Puls über 100 gehalten hat. Und zwar war ich plötzlich davon angetan den Inhalt von Webseiten per file() (damit kann man unter anderem Webseiten besuchen) in PHP zu modifizieren. Wozu das ganze? Ganz einfach: 1) schnellster Proxy der Welt :D 2) automatisch Inhalte entschärfen, komprimieren oder gar ganz ausfiltern. Das ist eine wunderschöne Idee und auch in anderen Projekten ein sehr schätzbare Fähigkeit.
Download : http://ul.to/7p7xxca2
Beispiel (auf Domain keksa.de beschränkt): http://keksa.de/proxy.php
Vorteile
1) Man hat einen sehr schnellen Web-Proxy :) Also, die technischen Verbindungen verlangsamen nur minimal, aber der Seitenaufbau geschieht tausend mal schneller, weil:
2) Inhalte werden gefiltert! JavaScript und implementierter Kram wird rausgefiltert. Der Browser braucht nur noch minimale Arbeit zu verrichten :) Das wirkt sich auch auf die Einbruch-Sicherheit aus, 99% der Browser-Exploits funktionieren nicht mehr ;) Diese Option ist aber auch deaktivierbar („Content“-Button oben rechts), kompliziertere Scripts/Inhalte dürften den Umständen wegen aber eh seltener funktionieren.
3) Bilder werden ausgefiltert. Ja, das ist für die meisten eine fragliche Sache, aber dazu möchte ich auch noch ein paar Worte sagen. Und zwar ist es mit der Art, wie ich den Proxy realisiert habe schwer, normale Dateien zu vermitteln. Eigentlich kann der Proxy nur HTML übermitteln, Bilder und weiteres wären dann komplizierter und würden warscheinlich oft Fehler verursachen (das liegt nicht an mir, sondern, weil man mit file() keine Header-Dateien interpretieren kann…). Und, wie bereits im Dokument „anonyme (und private) Kommunikation“ vermerkt, sind die meisten Bilder im Web eh nur irreführende Deko oder Werbung :P
4) Durch die ganzen Filterverfahren (besonders durch die Bilder) wird der Traffic minimiert. Also, DRASTISCH minimiert :) Das könnte auch noch für ein paar Kollegen interessant sein, die an der Uni o.ä. nur begrenzt Traffic haben :) Als Beispiel nehmen wir mal prisonplanet.com, normalerweise fast 1 MB groß (931 KB), durch den Proxy aber nur 132 KB klein :) Außerdem natürlich werbefrei.
Voraussetzungen
Leider gibt es hier nur ein kleines Problem. Man braucht eigenen Webspace und der muss die file-Funktion zulassen. Ich habe bisher keinen Free-Hoster gefunden, der diese zulässt (readfile schon, aber damit kann man keine Inhalte verändern). Also scheint es nur zu funktionieren, wenn man einen Paid-Host hat, diese machen nämlich als einzigste keine so großen Einschränkungen in den Funktionen -.- C’est la vie… :) Update! Da gibt es anscheinend doch einen, wie Eydeet es mitgeteilt hatte ;) Siehe unten bei den Kommentaren: www.000webhost.com – viel Spaß ;)
Weitere Voraussetzung ist, dass man wirklich vollkomme Anonymtät auf technischer Ebene realisiert haben will. Damit meine ich, dass man auch keine Informationen per POST-Methode auf Webseiten schicken kann. In der Dokumentation von TOR wird mehrmals drauf hingewiesen, dass man immernoch die eigenen Identität durch sensible Informationen verraten kann, die man selber absendet (schon mit einer Automarke, Lieblingsfarbe und Arbeitsort kann man Identitäten feststellen; so die Argumentation). Das wird hier vollkommen unterbunden.
Wie man es verwendet
Zunächst, in der PHP-Datei sind oben zwei Variablen vermerkt, die man verändern kann, als erstes die Startseite ($stdsite), und dann noch ob Inhalte ($content) standardmäßig gefiltert werden soll oder nicht (enabled/disabled). Man muss die Variablen aber nicht ändern.
Das nächste, das man machen sollte ist, den Namen der Datei zu ändern. Ich habe keinerlei Authentifizierung eingebaut, also wenn jemand die Datei findet, dann kann er deinen Webserver als Proxy verwenden und das wollen wir ja nicht :)
So, jetzt können wir den Proxy ansurfen :) Oben ist die Leiste, in der man die gewünschte URL eingeben kann. Dann gibt es noch oben rechts die Option, ob man Inhalte (JavaScript / Java / Flash / PlugIns / …) zulassen will, oder nicht. Wie bereits erwähnt dürften aber kompliziertere Inhalte eh nicht mehr funktionieren (besonders die, die eigenständig Verbindungen ins Netz aufbauen). Die Art, in der Inhalte „gefiltert“ werden ist simples Auskommentieren im HTML-Code :) Folgen aber aus unterschiedlichsten Umständen zwei schliessende Kommentarklammern hintereinander, so wird eines im Browser als Text dargestellt (man sieht im Browser ein „-->“ auftauchen).
Wenn man nun Webseiten besucht, bemerkt man, dass Links automatisch manipuliert werden :) Sie werden nicht einfach so durch den Proxy weitergeleitet, sondern um die Proxy-URL erweitert. Ansonsten würde man bei einem Link plötzlich auf einer Seite landen, ohne, dass der Proxy zwischengeschaltet ist. Aus einem „<a href=http://keksa.de>“ wird also automatisch „<a href=proxyurl?q=http://keksa.de>„.
So, das war’s erstmal zum normalen Gebrauch… Es gibt aber noch ein paar schöne Tricks, mit denen man sich das Leben tausendmal einfacher machen kann. Undzwar können wir den Browser (ich erkläre es hier für Firefox und Opera) noch ein bisschen drauf frisieren :)
Wenn wir auf der Proxy-Seite sind, kann man per Rechtsklick auf das Input-Feld (da, wo man die URL eintippt…) eine Suche erstellen; bei Opera auf Englisch steht da „Create Search...“ und bei FireFox auf Deutsch steht da „Ein Schlüsselwort für die Suche hinzufügen...„. Das wählen wir aus, dann kann man einen Titel und ein Schlüsselwort eintippen. Das dient dazu, damit man Input-Felder schnell ansteuern kann, ohne vorher die Seite besucht zu haben. Wenn wir als Schlüsselwort nun „proxy“ eintippen (Titel ist nur zur Deko da), können wir beim Surfen immer ins normale URL-Feld des Browsers z.B. „proxy http://web.de“ eintippen, dann wird web.de automatisch über den Proxy besucht. Verstanden? :) Oder, wenn wir sonst irgendwo surfen, dann steht ja immer die URL der derzeitigen Seite im Browser. Da können wir dann ganz einfach „proxy“ davorschreiben und schon besuchen wir die Seite über den Proxy.
Das wurde eigentlich von den Browsern eingeführt, damit man schnell Suchanfragen starten kann, aber das funktioniert auch wunderbar für unsere Zwecke und macht das Nutzen um einiges einfacher ;)
technische Bemerkungen
Als erstes will ich auf das Kernproblem hinweisen, das ich bei der Entwicklung hatte. Und zwar geht es um die schöne Funktion „rekursiv_href„, die einen String annimmt und da alle href-Links sucht und sie um den Hostnamen der Seite erweitert. Klingt easy aber ich hatte dadran echt meine wildesten Ergüsse, hab immer wieder irgendwelche Zeichnungen angefertigt, die dann aber doch kleine logische Fehler mit fatalen Folgen hatten… Weil ich wollte das natürlich so schlau wie möglich lösen, dabei entstanden aber die wirschesten Verkapselungen, manchmal über 50 Zeilen hinweg, die nur schwer funktionierten und durch die ich selber nichtmal durchgeblickt hatte (was schon was zu bedeuten hat, wenn man mein Spaghetti-Code aus dem SQL-Injection-Crawler kennt :D). Über 5 mal habe ich die Funktion komplett neu durchdacht und geschrieben und eigentlich sollte ich jetzt wütend darüber sein. Aber das bin ich nicht, wenn ich mir ansehe, wie wunderschön ich sie letztenendes gelöst hab :D
An der dritten If-Anweisung in der Funktion sollte der Link eigentlich noch auf andere Protokolle kontrolliert werden, als nur dem HTTP. Aber letztendlich dachte ich mir, dass ich den Proxy ja komplett auf HTTP beschränken wollte und weitere Abfragen an der Stelle einfach nur hässlich aussehen würden, weswegen ich das „&&(TRUE)“ als Knoten im Taschentuch dagelassen hab :)
Desweiteren wollte ich noch auf SSL eingehen. Der Proxy kann je nach Server-Einstellungen auch SLL handhaben. Aber man sollte sich dessen bewusst sein, dass die verschlüsselte Verbindung dann von der besuchten Seite NUR bis zum Webserver reicht, der restliche Weg bis zu dir Nachhause ist dann unverschlüsselt (außer man hat selber eine SSL-Verbindung zum Proxy). Ja, ziemlich doofe Sache, aber schließlich war das Dingen ja nur so eine nächtliche Schnapsidee von mir, daher nicht unbedingt für alle Sachen zu gebrauchen :)
Aber ich finde der Proxy bietet sich wahnsinnig gut als toleranten Schnitt zwischen langsamen echten Proxy und garkein anonymisiertes Surfen an.
Hier, wie immer, der Quellcode:
[php]
<?php
/*******************************************************************************
eigener High Anonymity Web Proxy
Für neuste Version und Dokumentation besuchen Sie bitte http://keksa.de/
*******************************************************************************/
$stdsite="http://aboutyou.keksa.de/"; // Startseite
$content="disabled"; // Content Standard-Einstellung
//
// Prüft effizient ob 2 Strings gleich sind (return: TRUE=ja, FALSE=nein)
//
function strequals($string1, $string2){
if(strlen($string1)==strlen($string2)){
$x=0;
$strlen1=strlen($string1);
while($string1[$x]==$string2[$x]){
if($x==$strlen1)
return TRUE;
$x++;
}
}
return FALSE;
}
//
// Rekursiv HTTP-Links mit Proxy-Fokus erweitern ("link" wird zu "http://proxy?url=link")
// "href=" "href=’" ‚href="‘
function rekursiv_href($string, $host){
if(($pos=stripos($string, "href="))!=FALSE){ // wenn href drin
$adr=$pos+5; // uri ist dahinter
if(($string[$adr]=="\"")||($string[$adr]=="\’")){ // wenn " oder ‚ gehört nicht zur uri
$adr++;
}
if((!strequals(substr($string, $adr, 7), "http://"))&&
(!strequals(substr($string, $adr, 8), "https://"))&&(TRUE))
if($string[$adr]=="/")
$string=substr($string, 0, $adr).$host.
rekursiv_href(substr($string, $adr, (strlen($string)-$adr)), $host);
else
$string=substr($string, 0, $adr).$host.
"/".rekursiv_href(substr($string, $adr, (strlen($string)-$adr)), $host);
}
return $string;
}
if($_GET[‚url‘]){
if((!strequals(substr($_GET[‚url‘], 0, 7), "http://"))&&
(!strequals(substr($_GET[‚url‘], 0, 8), "https://")))
$stdsite="http://".$_GET[‚url‘];
else
$stdsite=$_GET[‚url‘];
}
if($_GET[‚content‘])
$content=$_GET[‚content‘];
echo "<html><head><title>Your Own High Anonymity Web Proxy | ".$stdsite."</title>
</head><body><table width=\"100%\" vspace=0 hspace=0 border=0 cellspacing=0 cellpading=0>
<tr><td><center><form action=\"\" method=get>
<a title=\"Return Home\" alt=\"Return Home\" href=\"?home\">Home</a>
<input size=100 type=text name=url value=\"".$stdsite."\" title=\"URL\" alt=\"URL\">
<input type=submit value=\"go\" alt=\"go\" title=\"go\"> Content:
<select title=\"JavaScript / Java / Flash / PlugIns / …\" name=content size=1>";
if($content=="enabled")
echo "<option selected>enabled</option><option>disabled</option>";
else
echo "<option>enabled</option><option selected>disabled</option>";
echo "</select></form></center></td></tr><tr><td>\n\n\n";
// $prothost=substr($_GET[‚url‘],0,stripos(substr($_GET[‚url‘],7,strlen($_GET[‚url‘])-7),"/")+7);
if(stripos(substr($_GET[‚url‘],7,strlen($_GET[‚url‘])-7),"/")) // Korrektur von Nilos
$prothost=substr($_GET[‚url‘],0,stripos(
substr($_GET[‚url‘],7,strlen($_GET[‚url‘])-7),"/")+7);
else
$prothost=$_GET[‚url‘];
if($seite=file($stdsite)){
foreach($seite as $ausgabe){
$ausgabe=str_ireplace("<img", "<hidden", $ausgabe); // DISABLE IMAGES
$ausgabe=str_ireplace("<form", "<hidden", $ausgabe); // DISABLE FORMS
$ausgabe=str_ireplace("<frameset", "<hidden", $ausgabe); // DISABLE FRAMESETS
$ausgabe=str_ireplace("<frame", "<hidden", $ausgabe); // DISABLE FRAMES
$ausgabe=str_ireplace("<iframe", "<hidden", $ausgabe); // DISABLE IFRAMES
// $ausgabe=str_ireplace("<link", "<hidden", $ausgabe); // DISABLE RELATIONSHIPS
$ausgabe=rekursiv_href($ausgabe, $prothost);
$ausgabe=str_ireplace(‚http://‘, ‚?url=http://‘, $ausgabe); // HTTP LINKS
$ausgabe=str_ireplace(‚https://‘, ‚?url=https://‘, $ausgabe); // HTTPS LINKS
$ausgabe=str_ireplace(‚ftp://‘, ‚?url=ftp://‘, $ausgabe); // FTP LINKS
// $ausgabe=str_ireplace(‚//‘, ‚?url=http://‘, $ausgabe); // CURRENT LINKS
if($content=="disabled"){
$ausgabe=str_ireplace("<script", "<!– <script", $ausgabe); // DISABLE SCRIPTS
$ausgabe=str_ireplace("/script>", "/script> –>", $ausgabe);
$ausgabe=str_ireplace("<applet", "<!– <applet", $ausgabe); // DISABLE APPLETS
$ausgabe=str_ireplace("/applet>", "/applet> –>", $ausgabe);
$ausgabe=str_ireplace("<object", "<!– <object", $ausgabe); // DISABLE OBJECTS
$ausgabe=str_ireplace("/object>", "/object> –>", $ausgabe);
$ausgabe=str_ireplace("onload=", "noonload=", $ausgabe); // DISABLE JS-EVENT-HANDLER
$ausgabe=str_ireplace("onabort=", "noonabort=", $ausgabe);
$ausgabe=str_ireplace("onblur=", "noonblur=", $ausgabe);
$ausgabe=str_ireplace("onchange=", "noonchange=", $ausgabe);
$ausgabe=str_ireplace("onclick=", "noonclick=", $ausgabe);
$ausgabe=str_ireplace("ondblclick=", "noondblclick=", $ausgabe);
$ausgabe=str_ireplace("onerror=", "noonerror=", $ausgabe);
$ausgabe=str_ireplace("onfocus=", "noonfocus=", $ausgabe);
$ausgabe=str_ireplace("onkeydown=", "noonkeydown=", $ausgabe);
$ausgabe=str_ireplace("onkeypress=", "noonkeypress=", $ausgabe);
$ausgabe=str_ireplace("onkeyup=", "noonkeyup=", $ausgabe);
$ausgabe=str_ireplace("onmousedown=", "noonmousedown=", $ausgabe);
$ausgabe=str_ireplace("onmousemove=", "noonmousemove=", $ausgabe);
$ausgabe=str_ireplace("onmouseout=", "noonmouseout=", $ausgabe);
$ausgabe=str_ireplace("onmouseover=", "noonmouseover=", $ausgabe);
$ausgabe=str_ireplace("onmouseup=", "noonmouseup=", $ausgabe);
$ausgabe=str_ireplace("onreset=", "noonreset=", $ausgabe);
$ausgabe=str_ireplace("onselect=", "noonselect=", $ausgabe);
$ausgabe=str_ireplace("onsubmit=", "noonsubmit=", $ausgabe);
$ausgabe=str_ireplace("onunload=", "noonunload=", $ausgabe);
}
echo $ausgabe;
}
}
echo "\n\n\n</body></html>";
?>
// keksa.de
[/php]
Quelle : http://keksa.de/