tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
6
ZUGRIFFE
388
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    hab1cht hab1cht ist offline Mitglied Gold
    Registriert seit
    Aug 2005
    Ort
    (BW)
    Beiträge
    173
    Hallo,
    hab mein Login-Script gerade um eine Funktion erweitert und zwar sollen Falschanmeldungen in einer Logdatei gespeichert werden.
    Das Speichern von Falschanmeldungen klappt auch wunderbar, allerdings die Anmeldung mit richtigen Daten nicht mehr, es kommt folgender Fehler: "Fatal error: Cannot redeclare class mysql_control".
    Hier der Code der login.php:
    PHP-Code:
    <?php 

    define
    ('thefooter'TRUE);
    include(
    "inc/config.inc.php");

    require(
    'MySQLc.inc.php');       #Klasse mit Speicherfunktion für Falscheingaben
    $mc = new MySQL_Control;

    $ip $REMOTE_ADDR;


    if(isset(
    $_POST[login])) { 

        if(empty(
    $_POST[passwort]) or empty($_POST[vorname]) or empty($_POST[nachname])) { 
           
    $error true;
             echo 
    "Bitte füllen Sie alle Lücken aus!";
             
    $result $mc->mc_registerfail($vorname$nachname$passwort$ip);
        } else { 
            
    $passwort strip_tags(stripslashes($_POST[passwort]));
            
    $passwort MD5($passwort);
            
    $nachname strip_tags(stripslashes($_POST[nachname]));
            
    $vorname strip_tags(stripslashes($_POST[vorname])); 
            
    $sql "SELECT * FROM `user` WHERE `nachname` = '".$nachname."' && `vorname` = '".$vorname."' && `passwort` = '".$passwort."'";
             
    $check mysql_query($sql);
             
    $vorhanden mysql_num_rows($check);
        if(
    $vorhanden != "1") { 
                
    $error true;
            echo 
    "Dieser Benutzer ist in der Datenbank nicht registriert!";
            
    $result $mc->mc_registerfail($vorname$nachname$passwort$ip);      
            }     
        } 
         
        if(!
    $error) { 
            if(
    $check) { 
                
    $check mysql_fetch_array($check); 
                    
    $userid $check["ID"]; 
        
    $timedate("Y-m-d H:i:s");
        
    $query "UPDATE `$my_table` SET `letzter_login` = '".$time."' WHERE `ID` = $userid LIMIT 1"
            
    $result $mc->mc_mysql_query($query);
        
    session_start(); 
                    
    session_register("userid"); 
                    
    header("Location: index_profil.html"); 
                } else { 
                       echo 
    "Es ist ein Fehler aufgetreten, bitte versuchen Sie es später noch einmal. Sollte dieser Fehler weiterhin auftreten, wenden Sie sich bitte an das Serviceteam oder fordern Sie ein neues Passwort an."
                   
    $result $mc->mc_registerfail($vorname$nachname$passwort$ip);
                } 
            } 
        } 

    ?>
    Der Code der Klasse:
    PHP-Code:
    <?php 
        
    # Filename: MySQLc.inc.php 
        #  
        # Funktion: Falsche Logins werden gespeichert
         
        
    define ('CRLF'chr(13).chr(10)); # Zeilenumbruch 
        
    define ('PATH'$_SERVER['DOCUMENT_ROOT'].'/MySQL_Control/'); # Pfad zur Logdatei 
             
        
    class MySQL_Control
             
    #Funktion für, falsche Logins
        
    function mc_registerfail($vorname$nachname$passwort$ip){
                
    $login_date date("d.m.y, H:i:s"); # Aktuelles Datum und aktuelle Zeit setzen 

                # Überprüfen ob das Verzeichnis existiert in dem die Logdatei abgelegt werden soll.. Ansonsten Wird das Verzeichnis erstellt.. 
                
    if(!is_dir($_SERVER['DOCUMENT_ROOT'].'/MySQL_Control')){ 
                    
    mkdir ($_SERVER['DOCUMENT_ROOT'].'/MySQL_Control'0664); 
                } 
            
            
    $this->sl_writeFile(PATH.'login_report.log''Vorname: '.$vorname.' ; Nachname: '.$nachname.' ; Passwort: '.$passwort.' ; IP: '.$ip."\t\t\t# ".$login_date.CRLF); 
           
        }
             
            
    # Funktion zum Schreiben in eine Datei 
            
    function sl_writeFile($file$data$mode 'a'){ 
                
    $fp fopen($file$mode); 
                
    fwrite($fp$data); 
                
    fclose($fp); 
            }

            
        } 
    # End Class MySQL_Control 
    ?>
    Wo ist hier der Fehler? Warum kann ich mich nicht mehr in meinen Useraccount einloggen?

    Zusatz: Ist dieses Script sicher? Was sollte ich verbessern?

    Vielen Dank im Voraus.

    MfG
    hab1cht
    Geändert von hab1cht (05.07.06 um 14:47 Uhr)
     

  2. #2
    Avatar von nkler
    nkler nkler ist offline Mitglied
    Registriert seit
    Jul 2004
    Ort
    Neuenkirchen (Niedersachsen)
    Beiträge
    17
    PHP-Code:
    $result $mc->mc_mysql_query($query); 
    Wo ist die Funktion mc_mysql_query bestimmt?

    PHP-Code:
    require('MySQLc.inc.php');
    $mc = new MySQL_Control
    Nebenbei ist das beabsichtigt 2x?
     
    Lächle, und fürchte dich nicht vor dem nächsten Tag.

  3. #3
    hab1cht hab1cht ist offline Mitglied Gold
    Registriert seit
    Aug 2005
    Ort
    (BW)
    Beiträge
    173
    Das habe ich ausversehen 2mal geschrieben, habe das wieder entfernt.

    Der Code für die Funktion "mc_mysql_query " lautet (ist auch in der 'MySQLc.inc.php'):
    PHP-Code:
            # Diese Funktion benutzen anstatt "mysql_query()" 
            
    function mc_mysql_query($sql){ 
                
    $sql_date date("d.m.y, H:i:s"); # Aktuelles Datum und aktuelle Zeit setzen 
                 
                # Überprüfen ob das Verzeichnis existiert in dem die Logdatei abgelegt werden soll.. Ansonsten Wird das Verzeichnis erstellt.. 
                
    if(!is_dir($_SERVER['DOCUMENT_ROOT'].'/MySQL_Control')){ 
                    
    mkdir ($_SERVER['DOCUMENT_ROOT'].'/MySQL_Control'0664); 
                } 
                 
                
    # Nur SQL Befehle loggen, die einen Datensatz verändern.. Also keine SELECT Befehle mitloggen 
                
    if(preg_match('/(^insert)|(^update)|(^alter)|(^create)|(^delete)/i'$sql$type)){ 
                    
    # SQL Befehl in die Logdatei schreiben.. Datum, Zeit und Zeilenumbruch werden angehängt.. 
                    
    $this->sl_writeFile(PATH.'sql_report.sql'$sql.';'."\t\t\t# ".$sql_date.CRLF); 
                } 
                return 
    mysql_query($sql); # "mysql_query()" wird ausgeführt 
            

     

  4. #4
    Registriert seit
    Dec 2002
    Ort
    Trier
    Beiträge
    17.502
    Blog-Einträge
    10
    Ist es möglich, dass du die „MySQLc.inc.php“-Skriptdatei mehrmals inkludierst? Denn anders kann ich mir die Fehlermeldung nicht erklären. Am besten arbeitest du bei einmalig einzubindenden Skriptdateien mit der include_once- oder noch besser mit der require_once-Anweisung.
     
    Markus Wulftange

  5. #5
    hab1cht hab1cht ist offline Mitglied Gold
    Registriert seit
    Aug 2005
    Ort
    (BW)
    Beiträge
    173
    Jop stimmt, hatte das 2mal drinstehen, habe es dann aber nur hier in meinem Post korrigiert und nicht in meiner login.php.
    Zur Sicherheit: kann man das so stehen lassen, oder sollte ich irgendetwas verbessern an dem Code, um Sicherheitslücken zu vermeiden.

    MfG
    hab1cht
     

  6. #6
    Registriert seit
    Dec 2002
    Ort
    Trier
    Beiträge
    17.502
    Blog-Einträge
    10
    Ja es gibt Sicherheitsmängel. Informiere dich mal über SQL-Injektionen. Zusätzlich solltest du alle Zeichen auch explizizt als solche auszeichnen. Weitere Anregungen zur Sicherheit in PHP findest du auch hier im Forum, du musst nur suchen.
     
    Markus Wulftange

  7. #7
    redX redX ist offline Mitglied Brokat
    Registriert seit
    Nov 2003
    Beiträge
    464
    require_once / include_once kannst du so schon stehen lassen.
    Wenn eine Datei mehrmals inkludiert wird, heisst das eventuell einfach das bei deinem Script irgendwo ein Fehelr unterlaufen ist. Denn mehrmals einbinden zeigt oft, das im Ablauf irgend wo etwas schiefläuft und unerwartet geschiet. Muss natürlich aber nicht sein. Habe auch scripts wo ich die gleichen Dateien mehrmals include, da es einfach nicht anderst geht. Aber sollte man vermeiden, wens geht

    PHP-Code:
        if($vorhanden != "1") {  
                
    $error true
            echo 
    "Dieser Benutzer ist in der Datenbank nicht registriert!"
            
    $result $mc->mc_registerfail($vorname$nachname$passwort$ip);       
            }      
        } 
    Ich würde beim Login dem User nicht solche Fehlermeldungen ausgeben. Denn wenn du detailierte Fehler ausgibt, weiss er, wann er einen Benutzername gefunden hat, welcher existiert. Und dann kann er versuchen sich mit dem Namen einzuloggen. Ich würde einfach nur ausgeben: Falsche Benutzerangaben. Oder so was in der Art.

    Pass noch auf SQL Injections auf: SQL-Injektion - Wikipedia
    Da die Daten, welche im Query verwendet werden vom User kommen würde ich sie mit PHP: mysql_real_escape_string - Manual escapen.

    Und wieso machst du stripslashes auf die $_GET[] Informationen? Das brauchst du erst wenn du Strings anzeigen möchtest, welche du escaped hast.

    Sonst fällt mir gerade nix ein.

     
    Es gibt ein leben vor dem Tod

Ähnliche Themen

  1. Antworten: 15
    Letzter Beitrag: 10.06.10, 17:48
  2. Script sicher ?
    Von Wipeout im Forum PHP
    Antworten: 8
    Letzter Beitrag: 14.01.08, 12:54
  3. Php Script sicher machen...
    Von freakcx im Forum PHP
    Antworten: 6
    Letzter Beitrag: 22.06.06, 22:41
  4. Wie mache ich ein Upload Script sicher
    Von PhoenixDH im Forum PHP
    Antworten: 20
    Letzter Beitrag: 26.09.04, 21:09
  5. Download Script Sicher?
    Von KristophS im Forum PHP
    Antworten: 6
    Letzter Beitrag: 16.06.04, 01:57