PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr (https://www.php-resource.de/forum/)
-   PHP Developer Forum (https://www.php-resource.de/forum/php-developer-forum/)
-   -   Login mit Sessions (https://www.php-resource.de/forum/php-developer-forum/87000-login-mit-sessions.html)

Alpenmerlin 17-09-2007 22:33

Login mit Sessions
 
Hallo zusammen,

ich beschäftige mich erst seit heute Morgen mit dem Thema Login mit Hilfe von Cookies und Sessions usw. Habe es aber geschafft ne rudimentäre Userverwaltung aufzubauen die mit PHP, MySQL und Sessions arbeitet.

Nun würde mich interessieren ob ihr den Schutz für ausreichend haltet. Später sollen über die Datenbank Daten wie eMail-Adressen usw. gespeichert werden. Es wäre also ganz gut, wenn man nicht ohne weiteres auf die Daten zugreifen kann.

Das hier ist mein Code:
PHP-Code:

<?
function logged_in() {
    
$sql "SELECT UserID FROM users WHERE UserSession='".session_id()."' LIMIT 1";
    
$query mysql_query($sql);
    if (
mysql_num_rows($query) == 1)
        return 
true;
    else
        return 
false;
}

function 
check_pwd($userName$userPass) {
    
$sql "SELECT UserID AS UserID FROM users WHERE UserName='".$userName."' AND UserPass=MD5('".$userPass."') LIMIT 1;";
    
$query mysql_query($sql);
    if (
mysql_num_rows($query) == 1) {
        
$user mysql_fetch_array($query);
        return 
$user['UserID'];
    }
    else
        return 
false;
}

function 
update_session($userId) {
    
$sql "UPDATE users SET UserSession='".session_id()."' WHERE UserID=".$userId;
    
$query mysql_query($sql);
    if (
mysql_affected_rows() == 1){
        return 
true;
    }
    else {
        return 
false;
    }
}

function 
logout() {
    
$sql "UPDATE users SET UserSession = NULL WHERE UserSession='".session_id()."'";
    
$query mysql_query($sql);
    if (
mysql_affected_rows() == 1)
        return 
true;
    else
        return 
false;
}



session_name("sessionid");    
session_start(); 
require_once(
"connectdb.php");
connectdb("test");
if (isset(
$_POST['sent'])) { 
    
$_POST['sent']=0;
    
$userid check_pwd($_POST['userName'], $_POST['userPass']); 
    if (
$userid) {
        
update_session($userid);
    }
    else {
        echo 
"LogIn fehlgeschlagen!";
        
session_destroy();
    }

    
if (!
logged_in()) 
    echo 
'    <form method="post" action="'.$_SERVER["PHP_SELF"].'"> 
            <label>User: &nbsp;</label><input name="userName" type="text"><br> 
            <label>PWD: </label><input name="userPass" type="password"><br> 
            <input type="submit" value="Eintragen">
            <input type="reset">
            <input type="hidden" name="sent" value="1">
            </form>'

else 
    echo 
'<a href="logout.php">Ausloggen</a>'
?>

Wie man sieht, überprüfe ich die Anmeldung mit Hilfe der SessionID. Die Frage ist nur, wie sicher diese Art der Anmeldung ist. Denn die SessionID bleibt ja in der MySQL Tabelle stehen. Wenn es nicht sicher genug ist, stellt sie die Frage, wie man das verbessern kann.

Der Aufbau der MySQL Tabelle ist wie folgt:
PHP-Code:

UserID      int(11)         PRI    NULL    auto_increment
UserName    varchar
(30)         UNI          
UserPass    varchar
(32)                    
UserSession varchar(32)    YES         NULL     
UserMail    varchar
(150)         UNI 

Ich hoffe ihr könnt damit etwas anfangen und mir evtl. auch helfen. Danke schonmal für die Hilfe!

Gruß Alpenmerlin

Slava 17-09-2007 22:40

mysql_real_escape_string benutzen

Alpenmerlin 17-09-2007 23:10

Wie gesagt, ich bin Anfänger. Daher ist deine Antwort vielleicht einen Tick zu kurz! ;)

Habe es trotzdem mal versucht auf das Script anzuwenden:
PHP-Code:

//$sql = "SELECT UserID FROM users WHERE UserName='".$userName."' AND UserPass=MD5('".$userPass."') LIMIT 1;";

    
$sql sprintf("SELECT UserID FROM users WHERE UserName='%s' AND UserPass=MD5('%s') LIMIT 1;",
            
mysql_real_escape_string($userName),
            
mysql_real_escape_string($userPass)); 

Ist die Sache damit schon gegessen oder muss man noch mehr daran ändern?

Und wie sieht es mit dem Erraten der MD5-Prüfsumme aus? Ist es zu unsicher diese in der Datenbank zu speichern? Schließlich könnte man ja reintheoretisch durch ausprobieren auf die Nummer kommen und ist dann eingelogt! Halte es zwar für höchst unwahrscheinlich, würde aber gerne mal die Meinung von erfahrerenen Usern wissen...

deathcakeman 17-09-2007 23:31

http://de.wikipedia.org/wiki/Md5#Sic....BCberlegungen

ministry 18-09-2007 00:25

MD5 ist dafür völlig ok.

Außerdem gibt man am Login ja nicht den Hash sondern das Passwort ein, also müsste man sowieso das Passwort im Klartext erraten... Und das ist wohl noch einfacher.

Alpenmerlin 18-09-2007 00:41

Hatte es mir bei Wiki schon durchgelesen. Aber Danke nochmal für die Info. Weißt du wie das mit SQL-Injection aussieht? Passt das dann so?

ministry 18-09-2007 00:46

Wie? Mit den Hashes hat das nichts zu tun. Überprüf alle Eingaben, die vom Benutzer kommen, und wende wie schon gesagt mysql_real_escape_string auf die Strings an.

Alpenmerlin 18-09-2007 00:56

Zitat:

Original geschrieben von ministry
Wie? Mit den Hashes hat das nichts zu tun. Überprüf alle Eingaben, die vom Benutzer kommen, und wende wie schon gesagt mysql_real_escape_string auf die Strings an.
Ja, das Prüfen der Eingabe habe ich mit JavaScript vor. Die Frage war ob ich mysql_real_escape_string richtig angewendet habe. Das Skript funktioniert so wie es oben geändert habe. Ob es den Sinn erfüllt weiß ich aber nicht! ;)

kapitaeniglo 18-09-2007 01:08

Zitat:

Original geschrieben von Alpenmerlin
Ja, das Prüfen der Eingabe habe ich mit JavaScript vor. Die Frage war ob ich mysql_real_escape_string richtig angewendet habe. Das Skript funktioniert so wie es oben geändert habe. Ob es den Sinn erfüllt weiß ich aber nicht! ;)
Hi,

und was machst du , wenn der Benutzer Javascript deaktiviert hat?
Mit Javascript Benutzereingaben zu prüfen ist zwar nicht verkehrt, du musst aber weiterhin Serverseitig prüfen.

Gruss
Iglo

Alpenmerlin 18-09-2007 01:09

Und wenn wir schon dabei sind mal ne ganz blöde Frage: Ich hab grade angefangen ein neues PHP Script (newUser.php)zu schreiben. Das sieht momentan so aus:
PHP-Code:

<?
session_start
(); 
echo 
session_id();
?>

Ich bekomme folgende Fehlermeldung:
Zitat:

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at C:\Programme\xampp\htdocs\functions\newUser.php:1) in C:\Programme\xampp\htdocs\functions\newUser.php on line 2

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:\Programme\xampp\htdocs\functions\newUser.php:1) in C:\Programme\xampp\htdocs\functions\newUser.php on line 2
699909c12579fa567c843a7f9bd475c0
WARUM?!? :confused:
Wenn ich einen Reload ausführe ändert sich die SessionID trotzdem...

Alpenmerlin 18-09-2007 01:10

Zitat:

Original geschrieben von kapitaeniglo
Hi,

und was machst du , wenn der Benutzer Javascript deaktiviert hat?
Mit Javascript Benutzereingaben zu prüfen ist zwar nicht verkehrt, du musst aber weiterhin Serverseitig prüfen.

Gruss
Iglo

Gutes Argument! Danke für den Hinweis. Man merkt eben doch, wenn ein paar Leute schon einiges gecodet haben... :)

tontechniker 18-09-2007 01:12

Die Fehlermeldung sagt es bereits:
Code:

headers already sent by (output started at ...\newUser.php:1)
Du darfst vor session_start() keine Ausgaben machen.

Alpenmerlin 18-09-2007 01:28

Jaja, das ist mir schon klar! Aber wo mache ich denn Angaben? Das ist die komplette Datei! Und <? muss ich ja schreiben...

Bugbuster 18-09-2007 02:37

er schreibt es nich umsonst?! sicher vorher keine html ausgaben? irgendwo ein echo?!

mfg
bugbuster

PHP-Desaster 18-09-2007 09:48

Wenn du eine UTF-8-Datei hast, check mal mit einem Hexeditor die ersten Zeichen auf die BOM.


Alle Zeitangaben in WEZ +2. Es ist jetzt 05:28 Uhr.

Powered by vBulletin® Version 3.8.2 (Deutsch)
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.0
[c] ebiz-consult GmbH & Co. KG