[PHP] Autologin-Funktion

finke

finke

Eroberer
HI, habe mir eben mal eine Autologin Funktion überlegt. Ich weiß zwar, das solche Funktionen zum teil, gerade im Web, argwöhnisch beliebäugelt werden, trotzdem hätte ich gerne einmal Meinungen und Verbesserungsvorschläge von den Forennutzern gehört.

PHP:
<?php
/* iwo gefunden, vertrau der for schleife nicht ganz.
Muss mir mal noch was richtiges suchen um Zufallszahlen mithilfe von /dev/urandom zu finden
if(!function_exists('getRandom')){
function getRandom($min, $max) 
{
    $bits = '';
    $diff = $max-$min;
    $bytes = ceil($diff/256);
    $fp = @fopen('/dev/urandom','rb');
    if ($fp !== FALSE) {
        $bits .= @fread($fp,$bytes);
        @fclose($fp);
    
    $bitlength = strlen($bits);
    for ($i = 0; $i < $bitlength; $i++) {
        $int =  1+(ord($bits[$i]) % (($max-$min)+1));
    }
    }
    else{
    //wird benoetigt, falls /dev/urandom nicht exitiert (Windows) oder nicht geoeffnet werden darf
    $int = mt_rand($min, $max);
    }
    return $int;
}
}
/**/
if(!function_exists('descripeServer')){
/**
 *Funktion, welche einen String zuruek gibt, der den Server beschreibt
 *Wird genutz, um zu verhindern, das der Cookie auf einem anderen System entschlüsselt werdne kann
 *(Unzuverlessig, wenn ein Angreifer das genaue System kennt)  
 *@return string
 **/
function descripeServer(){
$string = '';
$string .= $_SERVER['SERVER_NAME']; 
$string .= $_SERVER['DOCUMENT_ROOT'];
$string .= $_SERVER['SERVER_SOFTWARE'];
$string .= phpversion();
return $string;
}
}

//Erst mal pruefen, ob ich nicht zu dusselig war, und meine eigenen Funktionsbiblioteken 2 mal einbinde
if(!(function_exists('autoLogin') || function_exists('readAutoLogin'))){
//verschluesselungbibliotek

include("blowfish/blowfish.class.php");

//Funktion zum anlegen des cookies
function autoLogin($userID, $passwdHash, $gueltigkeit = NULL, $saltLenght = 16){
//Wenn der Header bereits gesendet wurde, kann diese funktion nichts mehr machen, und gibt einen fehler zurueck
if(headers_sent()) return false;
// Wenn keine Gueltigkeit angegeben, wird von 14 Tagen ausgegangen
if($gueltigkeit === NULL || !is_int($gueltigkeit) || $gueltigkeit<0) $gueltigkeit = time()+60*60*24*14;
//Salt erzeugen
// Alle Zeichen die er fuer die Bildung eines salts verwenden darf.
// Der Doppelpunkt ist nicht enthalten, da dieser als Trennzeichen dient. 
$saltPool = 'abcdefghijklmnopqrstuvwxyz';
$saltPool .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$saltPool .= '-_.,;#+*~!"§$%&/()=?ß\}][{<>|';
$saltPoolLeght = strlen($saltPool); 
$salt = '';
for($i = 0; $i<$saltLenght; $i++){
$salt.=$saltPool[mt_rand(0,$saltPoolLeght-1)];
// $salt.=$saltPool[getRandom(0,$saltPoolLeght-1)];

}
//Verschluesseln der daten mithilfe des Serverstrings und des salts
  $blowfish = new Blowfish($salt.descripeServer());
   $cookie = $salt.':'.$blowfish->Encrypt($userID.':'.$passwdHash);
   //jetzt noch das eigentlcihe Cookie setzen
   
   return setcookie ('autoLogin', $cookie, $gueltigkeit, '','',false ,true);
}

//Funktion zum pruefen ob der User autologin aktiviert hat
// und ob die Daten gueltig sind
function readAutoLogin(&$userID, &$passwdHash){
$userID = NULL;
$passwdHash = NULL;
// als erstes nachschaun, ob ein Cookie gesetzt ist
if(!isset($_COOKIE['autoLogin'])) return false;
$cookie = $_COOKIE['autoLogin'];
//trennt den Salt von den verschluesselten Informationen  
$cookie = explode(':', $cookie, 2);
// wenn der salt nicht sauber getrennt werden konnte abbrechen
if(empty($cookie) || empty($cookie[0]) || empty($cookie[1])) return false;
//Anlegen einer verschluesselungsklasse, mit einem Schluessel aus salt und Serverbeschreibung
$blowfish = new Blowfish($cookie[0].descripeServer());
$tmp = explode(':', $blowfish->Decrypt($cookie[1]), 2);
//wenn das was entschluesselt wurde nicht irgendwie dem aehnlich sieht, was gesucht wurde, abbrechen
if( empty($tmp) || empty($tmp[0]) || empty($tmp[1]) || !is_numeric($tmp[0]) ) return false;

//wenn er es bis hirhin geschaft hat, noch schnell die Daten uebergeben, und Erfolg melden
$userID = $tmp[0];
$passwdHash = $tmp[1];
return true;
}
}
?>
Hir nochmal der Komplette Quelltext samt Beispiel:
Anhang anzeigen autologin.tar.bz2

Die Funktionen regeln nur die sichere Übermittlung der Daten, Sie schreibt in keiner Weise vor, wie diese dann ausgewertet werden.

Nachtrag:
PHP:
75:$cookie = $salt.':'.$blowfish->Encrypt('Erfolg:'.$userID.':'.$passwdHash);
94:if( empty($tmp) || empty($tmp[0]) || empty($tmp[1]) || empty($tmp[2]) ||$tmp[1] != 'Erfolg' || !is_numeric($tmp[1]) ) return false;
Der statische String vor den Daten dient dazu, zweifelsfrei sicherzustellen, das die daten mit dem richtigen Schlüssen entschlüsselt wurden.
 
Zuletzt bearbeitet:

Ähnliche Themen

Shellskript - Fehler in Cron

Escaping-Problem

Samba 4 Gast Zugang unter Ubuntu funktioniert nicht

NagiosGrapher 1.7.1 funktioniert nicht

Displayport + externer Monitor zeigt bei startx nichts erst bei DVI

Zurück
Oben