[PHP Sicherheit] Anti Session Hijacking

04/06/2014 11:43 Reddragon55#1
Servus.
Ich dachte mir mal, dass ich meine kleine PHP Sicherheitsfunktion veröffentliche. Vielleicht hilft diese dem ein oder anderen ja weiter ;)
Eventuell wächst sie dadurch ja auch :rolleyes:

Die Kommentare im Code sagen denke ich mal alles aus. Falls es trotzdem noch Unklarheiten gibt, fragt ruhig.


PHP Code:
<?php
/*---------------------------------------------------------------------------------------------
                   \    Anti - Session Hijacking System       /
                    \_____________________________________/

Überprüfe die aktuelle User IP und gleiche sie mit der gespeicherten in der DB ab.
Sind die IP's nicht gleich, dann wird der User ausgeloggt und sämtliche
Sessions, welche dem Account zugeordnet waren, werden zerstört.


WICHTIG: Dieses Script ist auf JEDER Seite, welche ein Nutzerkonto nutzt einzubinden.
         Dazu zählen schon User Panels.

         
Mögliche Komplikationen:    Falls ein Session Cookie für einen dauerhaften Login genutzt wird
                            und der user nach der Zwangstrennung eine neue IP erhalten hat,
                            tritt dieses System in Kraft und macht die Session sowie Cookie zunichte.

                            
Mögliche Lösung:            Bei der Auswertung der IP Adresse nicht die aktuelle IP sondern
                            die IP-Range auswerten.

                            
---------------------------------------------------------------------------------------------*/

#error_reporting(E_ALL);
#ini_set("display_errors", 1);

function Validate($mode TRUE) {
if (
$mode) {
require_once(
'./system/config/dbconfig.php');
mysql_connect("" $mysqlhost "","" $mysqluser "","" $mysqlpwd "","" $mysqlport "");
mysql_select_db($server_db) or die(mysql_error());

session_start(); 
if(isset(
$_COOKIE['PHPSESSID'])) 

        
// User IP auslesen
        
if (!isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            
$client_ip_val $_SERVER['REMOTE_ADDR'];
        } else {
            
$client_ip_val $_SERVER['HTTP_X_FORWARDED_FOR'];
        }

        
// Gespeicherte User IP auslesen
        
$session_id_val session_id();
        
$user_ip mysql_query("SELECT last_login_ip FROM website_login WHERE sid=('" $session_id_val "')");
        
$user_ip_con mysql_fetch_object($user_ip);
        
$user_ip_val $user_ip_con->last_login_ip;
        
    
// Falls User IP und gespeicherte IP nicht übereinstimmen    
    
if($client_ip_val != $user_ip_val) {
            if(
$_GET['form'] != UserLogin) {
        
    
$session_id_validated session_id();
    
mysql_query("INSERT INTO protection_system_logs (message, account_id, user_ip, saved_ip, date) VALUES ('User wurde aufgrund nicht identischer IP Adressen durch das Anti-Session Hijacking System ausgeloggt.', (SELECT id FROM website_login WHERE sid= ('" $session_id_validated "')), ('" $client_ip_val "'), ('" $user_ip_val "'), NOW())") or die(mysql_error());
    
mysql_query("UPDATE website_login SET last_sid=sid,sid=0,logged_in=0 WHERE sid=('" $session_id_validated "')");
    
mysql_query("UPDATE user_sessions SET last_sid=sid,sid=0,active=0 WHERE sid=('" $session_id_validated "')");
    
    
// Session Keks zerkrümeln
    
setcookie ("PHPSESSID"""time() - 3600);
                                }
                                
// Falls User IP und gespeicherte IP übereinstimmen: Funktion verlassen
} else { exit(); }
}            
// Falls System deaktiviert: Funktion verlassen
} else { exit(); }
}
Validate();
?>