PHP Browser Request vs. Server Request

QXARE

Lt. Commander
Registriert
Aug. 2008
Beiträge
1.634
Hi,

mich würde interessieren ob man mit einem Server Request an einen anderen Server die Header eines Browsers nahezu ident emulieren kann bzw. ob es für den zweiten Server möglich ist, zwischen den Anfragen zu unterscheiden - was ein Browser ist und was nicht?
 
Nein, man kann es nicht unterscheiden ;)
Alles was ein Browser sendet, kann ein Server auch senden, das ist keine Kunst.
 
Ja, das geht, aber nur mit Aufwand. Dazu musst du aber dann direkten Zugriff auf die Sockets haben und alle von modernen Browsern implementierten (HTTP-)Features nachbauen.

Dafür gibts auch schon viele fertige Klassen, die diese Dinge erleichtern (HTTP-Request zusammenbauen und sowas wie Referer und User-Agent dazumachen). Aber das vollständig zu schaffen, ist fast unmöglich. Dein Client muss zB mit Antworten zurechkommen, die im Chunked-Encoding zurückkommen, Keep-Alive unterstützen oder Requests für Bilder und andere Resourcen schicken, die im HTML der Antwort referenziert sind. Im Extremfall müsste sogar noch Javascript geparst werden, da oft auch Javascript HTTP-Anfragen auslöst.

Ein fieser Webmaster könnte zB ein Javascript einbauen, das über eine externe Datei nachgeladen wird, ausgeführt wird und dann einen HTTP-Request auslöst. Wenn dieser Request dann ausbleibt, weiß er dass der User entweder JS ausgeschalten hat (unwahrscheinlich) oder keinen richtigen Browser benutzt. Natürlich sehr aufwändig, aber zB als Botschutz bei Browsergames durchaus nicht unwahrscheinlich.
 
Wie weiß denn der zweite Server, wie der anfragende Server die Daten anschließend verarbeitet?

Kennst du auch entsprechende Klassen die dies erleichtern?
 
Auf Protokollebene kann man das problemlos emulieren. Semantisch ist es schwieriger. Aber es funktioniert auch z.B. WebKit als Library zu verwenden ohne Rendering. Das verhält sich dann exakt wie ein Browser.
 
@Cry&Die: es gibt für jede Sprache genug Komponenten, die einem die ganze Arbeit abnehmen. Z.B. curl bei PHP, das kapselt dir direkt das ganze HTTP-Protokoll. Du musst dann nur manuell die Header hinzufügen und Cookies mitschleifen, das sind nicht einmal 100 Zeilen Code.
 
@Eagle-PsyX-: Na dann bin ich ja wohl zumindest aus dem Schneider oder? :D

Mit curl werde ich mich wohl näher beschäftigen, was aber nicht das Ende der Diskussion bedeuten soll!
 
Es gibt auch schon genug fertige Bibliotheken oder gar einzelne Klassen, die serverseitig als Browser fungieren. Einfach mal Googeln.

edit: wurde schon gesagt, vergess das hier -.-
 
@ice-breaker: Ja, einzelne Aufrufe für sich betrachtet kann man mit den entsprechenden Bibliotheken wie cURL prima zusammenbasteln, mein Post bezog sich eher auf die komplexe Interaktion zwischen HTTP-Server und Client, wenn man zusätzlich noch davon ausgeht, dass der Client den Inhalt der Antwort auswertet und verarbeitet.

@QXARE: Du könntest zB mit einem Sniffer deiner Wahl (zB Wireshark) einen manuellen Aufruf auf die gewünschte Zielseite durch deinen Browser aufzeichnen. Da siehst du dann genau, wie die HTTP-Anfrage an den Server ausschaut. Damit kannst du dann schrittweise mit zB cURL den Aufruf nachbauen und das Ergebnis immer auch wieder mit dem Sniffer begutachten. Idealerweise sieht man dann am Schluss keinen Unterschied mehr :)
 
ok, danke für den Ansatz!

Mich würde wie oben schon geschrieben nur noch interessieren, ob bzw. wie ein Server wissen kann, wie der Client die Daten auswertet bzw. entgegen nimmt?
 
Wenn du dich auf HTTP beziehst, der Server weiß nicht mehr über den Client als in dem HTTP-Request steht.
Öffne ich diesen Thread hier, dann bekommt der Server lediglich folgendes von mir mit:

Code:
GET https://www.computerbase.de/forum/threads/browser-request-vs-server-request.926693/ HTTP/1.1
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
Cache-Control:max-age=0
Connection:keep-alive
Cookie: ...; bblastactivity= ...; bbuserid= ...; bbpassword= ...; POPUPCHECK= ...; bbsessionhash= ...
Host:[url]www.computerbase.de[/url]
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30

Das war's. Danach kommt natürlich seine Antwort an mich zurück, aber an diesem Punkt bekommt er keine Infos mehr von mir.

Von dem obigen Request ist übrigens so ziemlich alles optional. Du kannst auch einfach nur

Code:
GET /forum/showthread.php?p=10285948 HTTP/1.1
Host: www.computerbase.de
Accept: */*

schicken, das ist ein valider Request und der Server weiß 0 über dich (ich rede natürlich jetzt von der HTTP-Ebene).

edit: bei unterem minimalrequest will mir computerbase nichts zurückliefern (außer 403 - moved permanently), das hat aber nix damit zu tun, dass der Request nicht gültig wäre.
 
Zuletzt bearbeitet:
Zurück
Oben