INDIVIDUARE IL SISTEMA OPERATIVO DELL' UTENTE
by Michele Cotrufo m.cotrufo@email.it

Ogni qualvolta un utente visita una pagina del vostro sito, egli invia una richiesta in formato HTTP al server sul quale risiede il vostro sito. In questa stringa, oltre a trovarsi il nome della pagina richiesta dall'utente, ci sono molte informazioni sul computer di questi, come sistema operativo e browser utilizzato. Analizzando questa stringa, quindi, si è in grado di stabilire l'os dell'utente.

Ecco un esempio di richiesta HTTP:

GET /sito/index.php HTTP/1.1" 200 4615 "http://localhost/sito/index.php" "Mozilla/5.0 (Windows; U; Windows NT 5.1; it-IT; rv:1.7.8) Gecko/20050511 Firefox/1.0.4"

Tra le varie informazioni contenute, quella che ci interessa è:

Mozilla/5.0 (Windows; U; Windows NT 5.1; it-IT; rv:1.7.8) Gecko/20050511 Firefox/1.0.4

Qui sono contenute informazioni sull'OS e il browser dell'utente.
Da una prima lettura balza subito all'occhio Firefox/1.0.4, che ci indica che il browser dell'utente è Firefox. Inoltre si nota la stringa Windows NT 5.1. Per chi non lo sapesse, Windows NT 5.1 è un "altro nome" di Windows XP. Abbamo dunque stabilito che questo utente Usa Windows XP. Ora è necessario creare una funzione che analizzi le stringhe e stabilisca automaticamente il sistema operativo dell'utente.

Girando nella rete, ho trovato la seguente tabella di riferimenti, che indica per ogni sistema operativo, che stringa c'è nella richiesta dell'utente:

SISTEMA OPERATIVO        STRINGA NELLA RICHIESTA HTTP

Windows (generico)        Win
Windows XP            Windows NT 5.1
Windows 2000            Windows NT 5.0
Windows ME            Windows NT 4.90
Windows 95            Win95
Windows 98            Win98
Windows Net            Windows NT 5.2
Windows NT            WinNT4.0
Mac                Mac oppure PPC        
Linux                Linux
FreeBSD                FreeBSD
SunOS                SunOS
Irix                Irix
BeOS                BeOS
OS/2                OS/2
AIX                AIX

Naturalmente nulla vi vieta di cercare le stringhe relative agli altri sistemi operativi!

La stringa che dovremo esaminare è contenuta nell indice HTTP_USER_AGENT di $_SERVER, perciò potremo ottenerla in qualsiasi momento usando $_SERVER['HTTP_USER_AGENT']

Ecco quindi come potrebbe essere strutturata la funzione, di seguito la commenterò:

function GetSistemaOperativo(){
    $os = array("Windows XP" => "Windows NT 5.1",
            "Windows 2000" => "Windows NT 5.0",
            "Windows ME" => "Windows NT 4.90",
            "Windows 95" => "Win95",
            "Windows 98" => "Win98",
            "Windows NET" => "Windows NT 5.2",
                "Windows NT" => "WinNT4.0",
            "Mac" => "Mac|PPC",    
            "Linux" => "Linux",
            "FreeBSD" => "FreeBSD",
            "SunOS" => "SunOS",
            "Irix" => "Irix",
            "BeOS" => "BeOS",
            "OS/2" => "OS/2",
            "AIX" => "AIX",
           )

    foreach($os as $chiave => $valore){
        if(eregi($valore, $_SERVER["HTTP_USER_AGENT"])){
            return $chiave;
        }
    }

    return "Altro";
}                    

Prima di tutto memorizziamo in un array i sistemi operativi. Ogni chiave è un sistema operativo e il valore relativo rappresenta la stringa che deve essere presente nella richiesta HTTP. Noterete che l'indice "Mac" presenta il valore "Mac|PPC", questo perchè il sistema operativo sarà Mac sia se c'è la stringa Mac, sia se c'è la stringa PPC, e il carattere | rappresenta l'OR nelle espressioni regolari, quindi riconoscerà l'os sia se c'è 'Mac', sia se c'è 'PPC'.
Se volete aggiungere altri Os, basta che seguite la stessa sintassi che ho seguito io.

Dopo aver costruito l'array, questo viene analizzato con l'istruzione Foreach. Per ogni elemento, viene controllato se il valore è presente in $_SERVER["HTTP_USER_AGENT"]. In caso positivo ritornerà l'indice di quell'elemento.

Se non viene trovato nessun valore corrispondente, il ciclo foreach finisce, e la funzione ritorna la stringa "Altro", perchè non è stato identificato nessun sistema operativo.

Per informazioni e chiarimenti scrivetemi!

Michele Cotrufo - m.cotrufo@email.it