Sven Rautenberg: download einer Datei von einem Server

Beitrag lesen

Moin!

ich möchte von dieser Seite http://browsers.garykeith.com/downloads die Datei php_browscap.ini per php-script downloaden. Wenn ich das mit meinem Browser mache, also http://browsers.garykeith.com/stream.asp?PHP_BrowsCapINI in die Adresszeile eingebe, dann bekomme ich die Datei.

Ich halte die Nutzung solcher statischen Browserinfos für sehr fragwürdig. Wie dir in der PHP-Doku zum Befehl get_browser() ja für Cookies illustriert wird, enthält diese Datei eben gerade nur Infos über die GRUNDSÄTZLICHEN technischen Möglichkeiten des erkannten Browsers. Es wird hingegen keinerlei Rücksicht genommen auf die eventuellen Einstellungen, die der User gemacht hat. get_browser() wird also immer "Javascript = true" für einen Firefox ausgeben, auch wenn der User Javascript abgeschaltet hat oder mit NoScript o.ä. selektiv Javascript deaktiviert hat.

Weiterhin ist diese gesamte Erkennung von Fähigkeiten ausschließlich basiert auf:
1. Dem vom Browser mitgeschickten User-Agent, den man als User sehr leicht verändern kann, insbesondere auf falsche Werte bzw. Werte anderer existierender Browser verstellen kann.
2. Der Existenz einer passenden browscap.ini-Datei, die zu pflegen ziemlich aufwendig ist.

Obendrein sehe ich in der Ausgabe des Funktionsaufrufs von get_browser() eigentlich auch keine wertvolle Information, die ich als Programmierer einer Webseite oder Webapplikation nutzen wollen würde.

Naja, zugegeben: Die Browserfamilie oder ggf. auch die Browserversion wäre dann interessant, wenn ich in einer erklärenden Support-Seite Screenshots von Browser-Dialogen anzeigen will, und dabei dynamisch dem User immer die Screenshots seines eigenen Browsers (oder zumindest einer nicht sehr veralteten Version) zeigen will. Sowas macht allerdings immer noch hohen Pflegeaufwand für etwas, was vom User mutmaßlich kaum wertgeschätzt werden würde.

Summa summarum: Lohnt sich nicht in meinen Augen, damit überhaupt zu experimentieren. Für was hättest du das einsetzen wollen?

Wenn ich das aber mit folgendem script mache:

$bc_url = "browsers.garykeith.com";

function get_remote_file($url, $method = "GET", $data = "", $redirect = 10) {
    $fp = fsockopen ($url, 80, $errno, $errstr, 30);
    if ($fp) {
        $path = $url."/stream.asp?PHP_BrowsCapINI";
        $header = "\r\nHost: ".$url."\r\n";
        $header .= "Connection: Close\r\n\r\n";
        fputs ($fp, $method." ".$path." HTTP/1.0".$header);
        $body = "";
        while ( !feof($fp) ) $body .= fgets($fp);
        fclose($fp);
    }
    else return ("Fehler");
    return $body;
}
$erg = get_remote_file($bc_url);
if($erg!="Fehler") {
  $handle = fopen('php_browscap.ini','w');
  fwrite($handle,$erg);
  fclose($handle);
  chmod('php_browscap.ini',0755);
  $out = "Fertig";
} else { $out = $erg; }
echo $out;


>   
> dann bekomme ich folgende Antwort:  
>   
> HTTP/1.1 400 Bad Request  
> Content-Type: text/html  
> Date: Thu, 15 Mar 2012 16:09:06 GMT  
> Connection: close  
> Content-Length: 34  
>   
> <h1>Bad Request (Invalid URL)</h1>  
  
Du hast die [FAQ](http://browsers.garykeith.com/faq) nicht gelesen. Dort wird ausführlich erklärt, dass du gefälligst die "Terms of Service" berücksichtigen sollst, insbesondere keinen Abuse des Downloads betreiben darfst (mehr als 100 Requests pro Tag sind Abuse, Requests ganz ohne oder mit User-Agents kürzer als 10 Zeichen sind Abuse).  
  
Da ich in deinem Skript keinerlei Mechanismus zum Zwischenspeichern oder Abfragen auf Aktualisierung der Datei gefunden habe, und du in diese Sicherungsmaßnahmen gegen Serverüberlast blind reingetappt bist, ist davon auszugehen, dass deine Requests künftig ohnehin wegen Überlastung des Servers gesperrt werden.  
  
Wie man an dem zwischenzeitlich aufgetretenen 403-Status gesehen hat, dürfte das tatsächlich streng kontrolliert werden.  
  
Angesichts der Überflüssigkeit der Funktion get\_browser() (wäre nur sinnvoll nutzbar für PHP-Versionen mit topaktueller browscap.ini - das ist aber nicht garantierbar der Fall) würde ich mir den Aufwand einfach sparen. Alle Browserfähigkeiten ermittelt man schlauerweise IM BROWSER SELBST.  
  
 - Sven Rautenberg