zurück zur Startseite
  


Zurück XHTMLforum > Webentwicklung (außer XHTML und CSS) > Serveradministration und serverseitige Scripte
Seite neu laden Ist das Login-Script sicher?

Antwort
 
LinkBack Themen-Optionen Ansicht
  #1 (permalink)  
Alt 02.11.2007, 22:46
A noobish expert
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 11.10.2007
Beiträge: 126
spacegaier befindet sich auf einem aufstrebenden Ast
Standard Ist das Login-Script sicher?

Hallo zusammen,

für mein aktuelles Projekt habe ich mir eine Userverwaltung aufgabut. Nun bin ich gerade dabei diese bezüglich Sicherheit zu überprüfen. Ich poste jetzt hier mal das Login und das Logoutscript und würde von euch gerne wissen, ob es dort noch Sicherheitslücken gibt.

PHP-Code:
<?php
    session_start
();
    
    
error_reporting(E_ALL);
    
    require(
'connection.php');
    require(
'saltTheHash.php');
    
    
connectToDB();
    
    if(isset(
$_POST['submit']))
    {
        if (
get_magic_quotes_gpc()) 
        {
               
$user_nickname stripslashes($_POST['user_nickname']);
                
$user_password stripslashes($_POST['user_password']);
        }
    
        
$user_nickname mysql_real_escape_string($user_nickname);
        
$user_nickname str_replace('%''\%'$user_nickname);
        
$user_nickname str_replace('_''\_'$user_nickname);

        
$res mysql_query("SELECT * FROM Users WHERE user_nickname='".$user_nickname."'");
    
        
$row mysql_fetch_array($res);
    
        if(
saltTheHash($user_password$row['user_password']) == $row['user_password'] && $row['user_activated'] == true)
        {
            echo
"Login erfolgreich!";
        
            
$_SESSION['logged_in'] = true;    
            
$_SESSION['user_id'] = $row['user_id'];
            
$_SESSION['user_name'] = $row['user_nickname'];
            
$_SESSION['user_rank'] = $row['user_rank'];
        
            
$res mysql_query("UPDATE Users SET user_session_id='".session_id()."', user_last_login=NOW() WHERE user_nickname='".$user_nickname."'");
        
            if(
$res == false)
            {
                 echo 
"Fehler beim Eintragen der Session_ID!";
            }
        
            
header("Location: index.php?page=".$_GET['page']);    
        }
        else
        {
            echo 
"Fehler beim Login!";
        }
    }
    else
    {
         echo 
"FEHLER! Bitte versuchen Sie es erneut.";
    }
?>
PHP-Code:
<?php
    error_reporting
(E_ALL);
    
    require(
'connection.php');
    
connectToDB();
    
    
ob_start();
    
session_start();    

    
$res mysql_query("UPDATE Users SET user_session_id='0', user_last_logout=NOW() WHERE user_nickname='".$_SESSION['user_nickname']."'");
    
    if(
$res == false )
    {
         echo 
"Fehler beim Ausloggen!";
    }
    
    
session_unset();  
    
session_destroy();  

    
header("Location: index.php?page=home");  
    
ob_end_flush();   
?>
Gibt es hier noch irgendwas, was ich nicht berücksichtig habe?
Muss ich die Eingabe des Users (also Nickname und PWD) noch irgendwie weiter validieren?
Mit Zitat antworten
Sponsored Links
  #2 (permalink)  
Alt 03.11.2007, 08:38
Benutzerbild von Boris
Tanzender Webentwickler
XHTMLforum-Kenner
 
Registriert seit: 29.07.2004
Ort: Kornwestheim / Stuttgart
Beiträge: 4.925
Boris ist ein sehr geschätzer MenschBoris ist ein sehr geschätzer MenschBoris ist ein sehr geschätzer Mensch
Standard

Nö, ist soweit ok. Allerdings kannst du dir das Abfangen von % und _ sparen. Check lieber gegen, ob der Username und das Passwort gleich der Eingabe sind und setz noch ein LIMIT 1 in deine Query. SELECT * solltest du grundlegend nie tun, auch wenn es "bequem" ist - wähl die Spalten aus, die du wirklich brauchst und nicht "alles".

Was ist saltTheHash für eine Funktion? md5 oder sha1 Verschlüsselung?
__________________
My software never has bugs. It just develops random features ...

» DevShack - die Website des freien Webentwicklers Boris Bojic
Mit Zitat antworten
Sponsored Links
  #3 (permalink)  
Alt 03.11.2007, 13:18
A noobish expert
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 11.10.2007
Beiträge: 126
spacegaier befindet sich auf einem aufstrebenden Ast
Standard

Hallo Boris,

ein paar Gegenfragen:

1. user_nickname ist auf UNIUE gesetzt, deshalb kann die SQL-Abfrage doch immer nur ein Ergebnis liefern. Bringt das LIMIT 0,1 denn dann was? Hätte das zur Folge, dass er nach dem ersten und damit auch logischerweise dem einzigen Treffer die Suche dann sofot abbricht?

2. Das hier von dir verstehe ich net ganz. Was meinst du damit?

Zitat:
Check lieber gegen, ob der Username und das Passwort gleich der Eingabe sind
Ich checke doch den Username insofern als dass ich schaue, ob dieser Username in der DB vorhanden ist. Reicht das nicht oder was meinst du damit? Außerdem kontrolliere ich mit der Funktion saltTheHash doch auch das Pwd oder was worauf wolltest du hinaus?

Als Verschlüsselung nutze ich momentan sha1(). Würdest du md5() nehmen?
Mit Zitat antworten
  #4 (permalink)  
Alt 03.11.2007, 13:24
Benutzerbild von Boris
Tanzender Webentwickler
XHTMLforum-Kenner
 
Registriert seit: 29.07.2004
Ort: Kornwestheim / Stuttgart
Beiträge: 4.925
Boris ist ein sehr geschätzer MenschBoris ist ein sehr geschätzer MenschBoris ist ein sehr geschätzer Mensch
Standard

Zu 1. Dass das Feld Unique ist, wusste ich nicht. Dennoch erwartest du ja nur ein Ergebnis, daher würde ich immer ein LIMIT 1 dazu setzen - sicher ist sicher.

Zu 2. Na du ermittelst mit der Query den Usernamen und Passwort ... und lässt das halt mit der Eingabe aus dem Formular gegenchecken, beides.

Ich weiß nicht, was deine Funktion saltTheHash macht. Ob du darin sha1 oder md5 benutzt, ist dir überlassen. Sha1 ist halt länger
__________________
My software never has bugs. It just develops random features ...

» DevShack - die Website des freien Webentwicklers Boris Bojic
Mit Zitat antworten
  #5 (permalink)  
Alt 03.11.2007, 13:51
A noobish expert
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 11.10.2007
Beiträge: 126
spacegaier befindet sich auf einem aufstrebenden Ast
Standard

Punkt 1: Done

Punkt 2: Kapier ich immer noch nicht. Schreib mal bitte kurz in Pseudo-Code was du meinst.

Meine Funktion saltTheHast()

PHP-Code:
<?php
    error_reporting
(E_ALL);

    function 
saltTheHash($givenPassword$givenSalt null)
    {
        
$saltHash = array();
      
          
$saltHash['salt'] = $givenSalt;
          
$saltHash['password'] = $givenPassword;
          
$saltHash['saltedHash'] = null;
  
          
$saltHash['privateKey'] = "WKobxlp9Gr1JH41VCC,@i*6I714N7@74aw4GIDSFsrhGSG546G@-6Z*9TdfgEGEhRGTO5UU4uv/E0Y(h:F;Fao*OReDK?LP66ajhDvb-3IF6FM%zEk*8ZYf>@30@sH-Gs%s4DAiO##1*4s02
          9UX6iWUq*rO>8&5V:Ut-&Wa)v,&qVS1MVNy-IwH@Y6-Gs%s43&k6CVIELQCY5c97LY1j0l2OU<<9c5uYGHk:e3lNTe4R4LNT*f!9VoOFfO3<6CM8kfVAM<5%6Vve86+gKm*m(Bnce?E3Ai
          WRLRZjV5yvZT98P/1!g!ZtGs%s4?;h5%"
;
    
          if(
$saltHash['salt'] == null)
          {
              
$saltHash['salt'] = microtime();
            
$saltHash['salt'] = crc32($saltHash['salt']);
                
$saltHash['salt'] = pack('N'$saltHash['salt']);    
            
$saltHash['salt'] = base64_encode($saltHash['salt']);
    
            
$saltHash['salt'] = substr($saltHash['salt'], 06);
          }
          else if(
strpos($saltHash['salt'], "|") !== false)
          {
            
$saltHash['salt'] = substr($saltHash['salt'], 0strpos($saltHash['salt'], "|"));
          }
          
        
$saltHash['saltedHash'] = $saltHash['salt'];
          
          
$saltHash['saltedHash'].= "|";
  
          
$saltHash['saltedHash'].= sha1($saltHash['privateKey']);
  
          
$saltHash['saltedHash'].= sha1($saltHash['salt'].$saltHash['password']);
   
        return 
$saltHash['saltedHash'];
    }
?>
EDIT: PS: Keine Sorge, die hier ist nicht der echte PrivateKey (nur falls sich jemand schon Hoffnungen gemacht haben sollte^^).

Geändert von spacegaier (03.11.2007 um 14:49 Uhr)
Mit Zitat antworten
  #6 (permalink)  
Alt 03.11.2007, 16:15
Benutzerbild von Gumbo
XHTMLforum-Kenner
 
Registriert seit: 22.08.2004
Ort: Trier
Beiträge: 2.733
Gumbo ist jedem bekanntGumbo ist jedem bekanntGumbo ist jedem bekanntGumbo ist jedem bekanntGumbo ist jedem bekanntGumbo ist jedem bekannt
Standard

Nur bei einem „LIKE“-Vergleich gibt es die Wildcard-Zeichen „%“ und "_". Bei einem normalen Vergleich sind diese jedoch nur normale Zeichen und das Voransetzen eines umgekehrten Schrägstrichs macht einen Vergleich unmöglich, sollte eines der Zeichen verwendet werden:
Code:
SELECT "foo_bar" = "foo\_bar"
Zudem solltest du auch den „$_SESSION['user_nickname']“-Wert für den Einsatz in der Datenbankabfrage durch die „mysql_real_escape_string()“-Funktion schicken.
__________________
Markus Wulftange
Mit Zitat antworten
  #7 (permalink)  
Alt 04.11.2007, 12:12
A noobish expert
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 11.10.2007
Beiträge: 126
spacegaier befindet sich auf einem aufstrebenden Ast
Standard

Ich hab doch gar keine Sessionvariable user_nickname ?!?

Ich poste nochmal das ganze Script. Vielleicht hast du dich nur verkuckt.

Und noch ne Frage: mysql_real_escape_string ist doch nur da nötig, wo Eingaben vom Nutzer für eine DB-Abfrage gebraucht werden, oder?
PHP-Code:
<?php
    session_start
();
    
    
error_reporting(E_ALL);
    
    require(
'connection.php');
    require(
'saltTheHash.php');
    
    
connectToDB();
    
    if(isset(
$_POST['submit']))
    {
        if(
get_magic_quotes_gpc()) 
        {
               
$user_nickname stripslashes($_POST['user_nickname']);
                
$user_password stripslashes($_POST['user_password']);
        }
        
$user_nickname mysql_real_escape_string($user_nickname); 
        
        
$res mysql_query("SELECT user_id, user_password, user_rank, user_nickname, user_activated FROM Users WHERE user_nickname='".$user_nickname."' LIMIT 0,1");
        
        if(
mysql_num_rows($res) == 0)
        {
             echo 
"Unbekannter Benutzername!";
        }
        else
        {    
            
$row mysql_fetch_array($res);
    
            if(
saltTheHash($user_password$row['user_password']) == $row['user_password'] && $row['user_activated'] == true)
            {
                echo
"Login erfolgreich!";
        
                
session_name("SESSION".$row['user_id']."NORMAL");
                
$_SESSION['logged_in'] = true;    
                
$_SESSION['user_id'] = $row['user_id'];
                
$_SESSION['user_name'] = $user_nickname;
                
$_SESSION['user_rank'] = $row['user_rank'];
        
                
$res mysql_query("UPDATE Users SET user_session_id='".htmlspecialchars(session_id())."', user_last_login=NOW() WHERE user_nickname='".$user_nickname."'");
        
                if(
$res == false)
                {
                     echo 
"Fehler beim Eintragen der Session_ID!";
                }
        
                
header("Location: index.php?page=".$_GET['page']);    
            }
            else
            {
                echo 
"Fehler beim Login!";
            }
        }
    }
    else
    {
         echo 
"FEHLER! Bitte versuchen Sie es erneut.";
    }
?>
Mit Zitat antworten
  #8 (permalink)  
Alt 04.11.2007, 12:31
Benutzerbild von Timo
table-layout: none;
XHTMLforum-Kenner
 
Registriert seit: 11.11.2006
Beiträge: 5.345
Timo ist ein LichtblickTimo ist ein LichtblickTimo ist ein LichtblickTimo ist ein LichtblickTimo ist ein Lichtblick
Standard

er meint nicht $_SESSION oder $_POST und antatt stripslashes solltest du mysql_real_escape_string da diese Funktion den String speziell für Mysql Abfragen Escapet.

Gruß
Timo
__________________
Um weitere Erklärungen eingeblendet zu bekommen, drücken Sie bitte die Tastenkombination Alt + F4
Mit Zitat antworten
  #9 (permalink)  
Alt 04.11.2007, 12:44
A noobish expert
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 11.10.2007
Beiträge: 126
spacegaier befindet sich auf einem aufstrebenden Ast
Standard

Nutze ich doch?!?

PHP-Code:
if(get_magic_quotes_gpc())  
        { 
               
$user_nickname stripslashes($_POST['user_nickname']); 
                
$user_password stripslashes($_POST['user_password']); 
        } 
        
$user_nickname mysql_real_escape_string($user_nickname); 
Mit Zitat antworten
Sponsored Links
  #10 (permalink)  
Alt 04.11.2007, 13:10
Benutzerbild von Boris
Tanzender Webentwickler
XHTMLforum-Kenner
 
Registriert seit: 29.07.2004
Ort: Kornwestheim / Stuttgart
Beiträge: 4.925
Boris ist ein sehr geschätzer MenschBoris ist ein sehr geschätzer MenschBoris ist ein sehr geschätzer Mensch
Standard

Ich meine, dass du nicht nur den Benutzernamen, sondern auch das Passwort aus der DB holen sollst (WHERE user=bla AND passwort=lblabal) und diese beiden mit den vom User angegebenen Usernamen und Passwort (die in $_POST stehen) vergleichen sollst.
__________________
My software never has bugs. It just develops random features ...

» DevShack - die Website des freien Webentwicklers Boris Bojic
Mit Zitat antworten
Sponsored Links
Antwort

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
PHP Login Script newbie88 Serveradministration und serverseitige Scripte 10 21.05.2011 15:45
Login Script verändern andre-ne Serveradministration und serverseitige Scripte 13 08.04.2011 18:39
Login Script bluub Serveradministration und serverseitige Scripte 4 11.01.2010 19:08
PHP Script mit GET-Parametern als Img-Src Ares Serveradministration und serverseitige Scripte 2 13.09.2008 22:19
PHP Login Script Pixel Design Serveradministration und serverseitige Scripte 19 19.01.2007 14:36


Alle Zeitangaben in WEZ +2. Es ist jetzt 13:41 Uhr.