BrowserCheck


NEU: IP Adresse prüfen über ip.perlmania.de.

Folgende Informationen konnten über die gesendeten HTTP Header bzw. per JavaScript ermittelt werden:

Deine IP Adresse:54.160.187.160
Dein Hostname:ec2-54-160-187-160.compute-1.amazonaws.com
Du kommst aus:United States (US)
Dein Betriebssystem:Unix
Dein Browser: (Version: 2.0)
Mobiles Endgerät:Nein
Cookies:
Javascript:
Java:
Flashplayer:
VBscript:
ActiveX (sicher):
ActiveX (unsicher):
Installierte Plugins:
Supercookies:
Deine Auflösung:
Sichtbarer Bereich: 

Auslesen der Informationen auf dem Server

IP Adresse

In einem Perl CGI Skript kann über die Umgebungsvariable REMOTE_ADDR auf die IP Adresse des Clients zugegriffen werden:

my $ip = $ENV{'REMOTE_ADDR'};

Referer

Klickt man im Internet auf einen Link wird die URL der zuletzt besuchten Seite an den Webserver übertragen. Zugriff darauf erhält man über die Umgebungsvariable HTTP_REFERER:

my $referer = $ENV{'HTTP_REFERER'};

Hostname

Der Hostname kann über die IP Adresse relativ einfach herausgefunden werden, leider klappt das nicht immer:

my $hostname = (gethostbyaddr(pack("C4", split(/\./, $ip)), 2))[0];

User Agent

Der User Agent String enthält Informationen über den Client und steht in der Umgebungsvariable HTTP_USER_AGENT. Verwendet man das CGI Modul geht es auch einfach mit der Funktion user_agent. Zum Parsen des Strings empfiehlt sich das Modul HTTP::BrowserDetect das einen einfachen Zugriff auf den Namen des Browsers, die Versionsnummer und das verwendete Betriebssystem ermöglicht:

use HTTP::BrowserDetect;

  my $agent   = new HTTP::BrowserDetect($ENV{'HTTP_USER_AGENT'});
  my $browser = $agent->browser_string;
  my $version = $agent->version;
  my $os      = $agent->os_string;

Mobiles Endgerät

Um zu erkennen, ob es sich bei dem Useragent um einen mobilen Browser handelt, gibt es unter detectmobilebrowsers.com reguläre Ausdrücke für mehr als ein dutzend Programmiersprachen, die regelmäßig aktualisiert werden.
Hier die Perl Version:

my $is_mobile = $ENV{'HTTP_USER_AGENT'} =~ m/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i || substr($ENV{'HTTP_USER_AGENT'}, 0, 4) =~ m/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i

HTTP Header

Die HTTP Accept Header geben Aufschluß darüber, welche Inhalte der Browser wiedergeben kann. Die http() Funktion des CGI Moduls ermöglicht Zugriff auf sämtliche HTTP Header, die der Browser sendet:

use CGI;
  my $cgi = CGI->new;
  my %http_headers = map { $_ => $cgi->http($_) } $cgi->http();
  for my $header (keys %http_headers) {
    print "$header=$http_headers{$header}\n";
  }
  

Land

Über die IP Adresse lässt sich mit Hilfe von IP::Country in den meisten Fällen der Ländercode herausfinden. Wer den Namen des Landes möchte, dem kann hier Geography::Countries weiterhelfen:

use Geography::Countries;
  use IP::Country::Fast;

  my $reg          = new IP::Country::Fast;
  my $country_code = $reg->inet_atocc($ENV{'REMOTE_ADDR'});
  my $country_name = country $country_code; 

Auslesen der Informationen im Client

IP Adresse / Hostname / Referer / Land

Es gibt keine Möglichkeit, die IP Adresse oder den Referer per JavaScript auszulesen. Demnach können auch Hostname und Land nicht ermittelt werden.
Man kann jedoch per Ajax auf einen Webservice zuzugreifen, die Daten dort auslesen (siehe oben) und dann an den Browser zurücksenden.

User Agent

Es gibt unzählige JavaScript Bibliotheken, die den UserAgent String auswerten und die selben Informationen zur Verfügung stellen, wie das oben genannte HTTP::BrowserDetect Modul.
Eine davon ist UAParser.js:

<script src="ua-parser.min.js"></script>
<script>
  var parser  = new UAParser(window.navigator.userAgent);
  var browser = parser.getBrowser().name;
  var version = parser.getBrowser().major;
  var os      = parser.getOS().name;
</script>

Flashplayer

Ob und in welcher Version der Flashplayer installiert ist, kann man über die JavaScript Flash Detection Library ermitteln:

<script src="flash_detect_min.js"></script>
<script>
  if (FlashDetect.installed) {
    var flashVersion = FlashDetect.raw;
  }
</script>

Installierte Plugins

Die im Browser installierten (und aktivierten) Plugins können über navigator.plugins ausgelesen werden:

<script>
  if (navigator.plugins) {
    for (var i=0; i<navigator.plugins.length; i++) {
      var name        = navigator.plugins[i].name;
      var description = navigator.plugins[i].descripton;
    }
  }
</script>

Supercookies

Aktuelle Browser ermöglichen es Webseiten (über HTML5 localStorage/sessionStorage oder die IE spezifische userData) Daten auf dem Client zu speichern. Die sogenannten Super-Cookies können deutlich mehr Daten speichern, als normale Cookies und lassen sich teilweise auch schwerer löschen. Über das Modernizr Skript lässt sich prüfen, ob sie auf dem Browser zur Vergügung stehen:

<script src="Modernizr.js"></script>
<script>
   var localStorageAvailable   = Modernizr.localstorage;
   var sessionStorageAvailable = Modernizr.sessionstorage;
   var userDataAvailable       = Modernizr.userdata;
</script>

Auflösung

Die Auflösung des Clients kann über window.screen ausgelesen werden:

<script>
  if (window.screen) {
    var width  = screen.width:
    var height = screen.height;
    var colors = screen.colorDepth;
  }
</script>

Sichtbarer Bereich

Der zu Verfügung stehende Bereich (Browserfenster abzüglich aller Steuerelemente) steht je nach Browser an unterschiedlicher Stelle. Folgendes Skript ermittelt die Größe des ViewPorts in den gängigen Browsern:

<script>
  var width, height;
  if (typeof window.innerWidth != 'undefined') {
    width  = window.innerWidth;
    height = window.innterHeight;
  } else if (window.document.body) {
    width  = window.document.body.clientWidth;
    height = window.document.body.clientHeight;
  }
</script>