kostenloser Webspace werbefrei: lima-city


Loginformular ist unsicher!!!!! HILFE!!!!!

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    technofan

    Moderator Kostenloser Webspace von technofan

    technofan hat kostenlosen Webspace.

    Hallo Leute... ich hab rausgefunden, dass mein Loginformular unsicher ist... wenn man Benutzername und Passwort frei lässt und dann auf anmelden klickt, kommt man trozdem in den geschützten Bereich rein...

    hier ist mal mein Script:

    if($_POST['anmelden']==true)
    {
    
    $username = $_POST['anmeldung_user']; 
    $passwort = $_POST['anmeldung_passwort']; 
    $loginabfrage = "SELECT * FROM user WHERE username LIKE '$username' LIMIT 1"; 
    $loginergebnis = mysql_query($loginabfrage); 
    $row = mysql_fetch_object($loginergebnis);
    if($row->passwort == "$passwort") 
        { 
        $_SESSION['username'] = $username;  
        echo "Login war erfolgreich.";
        } 
    	else 
        { 
        echo "Benutzername und/oder Passwort waren falsch."; 
        }
    
    }


    einen unbenannten User ohne Passwort gibt es nicht... was stimmt da jetzt nicht???
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Vielleicht solltest du in die Bedingung aufnehmen

    if Username!='' und Passwort!='' dann Login erfolgreich.
    if Username=='' und Passwort=='' dann Login nicht erfolgreich.

    Genau weiss ich auch nicht wo der Fehler steckt.
    Aber durch die oben genannte Methode kannst du den Fall 'keine Angaben' als erfolglos verarbeiten lassen.
  4. Autor dieses Themas

    technofan

    Moderator Kostenloser Webspace von technofan

    technofan hat kostenlosen Webspace.

    Das mit der If-Anweisung zu machen, ist ja ok, aber trozdem... normalerweise dürfte das nicht sein, weil es so einen "unsichtbaren" User ja nicht gibt... was also ist da falsch?
  5. $_SESSION['username'] = $username;

    Liegt das Problem vielleicht hier in deinem Code?
    Soll das ein Vergleich oder eine Zuweisung sein?
    Wenn Vergleich dann muss es heissen:

    $_SESSION['username'] == $username;

    EDIT: Ich sehe grad, es ist vermutlich eine Zuweisung und damit in Ordnung.

    Hatte aber das gleiche Problem und es nur über den von mir genannten Lösungsweg behoben.

    Beitrag geaendert: 20.2.2007 11:01:17 von karpfen
  6. t*****b

    Das ist Unsinnig:
    $loginabfrage = 'SELECT * FROM user WHERE username LIKE '$username' LIMIT 1';

    Besser ist:
    $loginabfrage = "SELECT * FROM user WHERE username = \"".$username."\" AND passwort = \"".$passwort."\"";

    Somit hohlst du den Datensatz, bei dem das Passwort mit dem Username übereinstimmt. Wenn Abfrage erfolgreich Cookie setzen, ansonsten Login fehlgeschlagen.


  7. ...
    $loginabfrage = "SELECT * FROM user WHERE username LIKE '$username' LIMIT 1"; 
    $loginergebnis = mysql_query($loginabfrage); 
    $row = mysql_fetch_object($loginergebnis);


    So ist das Skript generell unsicher da jemand über den Befehl
    "DROP username;" durch Magicquotes problemlos deine Tabelle Löschen bzw. manipulieren kann.
    Prüfe vorher die Eingaben auf entsprechende Zeichen, so dass ein solche Angriff gleich garnicht möglich ist.

    PS.: Zur Information: auch POST Variablen Lassen sich Clientseitig Manipuleren.

    Beitrag geaendert: 20.2.2007 14:46:14 von keiax
  8. Autor dieses Themas

    technofan

    Moderator Kostenloser Webspace von technofan

    technofan hat kostenlosen Webspace.

    Oha, da gibt's ja mehr zu beachten, als gedacht... was gibt's denn noch für Zeichen bzw. Befehle, die eventuell was anstellen können. und das mit dem Passwort werde ichnicht machen, da ich es nicht mit einem md5 verschlüsselt habe, und dann genau wie beim login alles abfragen kann, was in der session ist, indem er den sessionbefehl in ein Eingabefeld eingibt...
  9. Am besten selektierst du die Zeilen aus der Datenbank, wo Passwort und Name übereinstimmen. Dann zählst du einfach die Ergebnisse und wenn es (nur) eins gibt, dann war der Login erfolgreich.
    <?php
    if($_POST['anmelden']==true){
      $username      = $_POST['anmeldung_user']; 
      $passwort      = $_POST['anmeldung_passwort']; 
      $loginabfrage  = "SELECT * FROM user WHERE username LIKE '$username' AND passwort LIKE '$passwort'"; 
      $loginergebnis = mysql_query($loginabfrage); 
      $num = mysql_num_rows($loginergebnis);
      if($num == 1){ 
        $_SESSION['username'] = $username;  
        echo "Login war erfolgreich.";
      }else{ 
        echo "Benutzername und/oder Passwort waren falsch."; 
      }
    }?>


    Übrigens solltest du noch eine MD5-Verschlüsselung o.ä. für das Passwort einbauen und per mysql_real_escape_string() die Usereingaben noch entwerten.
    http://www.php.net/manual/de/function.mysql-real-escape-string.php

    Beitrag geaendert: 20.2.2007 17:57:31 von i-spacke
  10. Autor dieses Themas

    technofan

    Moderator Kostenloser Webspace von technofan

    technofan hat kostenlosen Webspace.


    Am besten selektierst du die Zeilen aus der Datenbank, wo Passwort und Name übereinstimmen. Dann zählst du einfach die Ergebnisse und wenn es (nur) eins gibt, dann war der Login erfolgreich.
    if($_POST['anmelden']==true){
      $username      = $_POST['anmeldung_user']; 
      $passwort      = $_POST['anmeldung_passwort']; 
      $loginabfrage  = "SELECT * FROM user WHERE username LIKE '$username' AND passwort LIKE '$passwort'"; 
      $loginergebnis = mysql_query($loginabfrage); 
      $num = mysql_num_rows($loginergebnis);
      if($num == 1){ 
        $_SESSION['username'] = $username;  
        echo "Login war erfolgreich.";
      }else{ 
        echo "Benutzername und/oder Passwort waren falsch."; 
      }
    }


    Übrigens solltest du noch eine MD5-Verschlüsselung o.ä. für das Passwort einbauen und per mysql_real_escape_string() die Usereingaben noch entwerten.
    http://www.php.net/manual/de/function.mysql-real-escape-string.php


    Wenn ich dieses mysql_real_escape_string() verwende, werden die Daten in ihrer eingegebenen Form gespeichert, oder in der umgewandelten Form? Weil ich die Daten gerne so ausgeben möchte, wie se eingegeben wurden ^^
  11. Das ist grundsätzlich richtig, aber wenn sich jemand mit einer SQL-Injection als Nickname anmeldet, dann bist du froh, dass es nicht so als Query übermittelt wurde, wie er es eingegeben hat. Es werden ja auch nur möglicherweise gefährliche Zeichen maskiert, was für die Ausgabe kein Problem darstellt. Der User sieht es dann so, wie er es eingegeben hat und du hast einen sichereren Code.
  12. Autor dieses Themas

    technofan

    Moderator Kostenloser Webspace von technofan

    technofan hat kostenlosen Webspace.


    Das ist grundsätzlich richtig, aber wenn sich jemand mit einer SQL-Injection als Nickname anmeldet, dann bist du froh, dass es nicht so als Query übermittelt wurde, wie er es eingegeben hat. Es werden ja auch nur möglicherweise gefährliche Zeichen maskiert, was für die Ausgabe kein Problem darstellt. Der User sieht es dann so, wie er es eingegeben hat und du hast einen sichereren Code.


    Und wenn ich die eingegebenen Daten dann als Textfeld value wieder ausgeben möchte auch?
    Am besten, ihr sacht mir mal alles, was ihr über Sicherheit bei PHP wisst... mir fällt gerade auf, dass ich gefährlich programmieren. x.x aber anders hab ichs net gelernt.
  13. Du hast dir den Link gar nicht angesehen? Da steht eigentlich alles, was du wissen musst zu mysql_real_escape_string. Du solltest lernen, mit php.net umzugehen. Fortgeschrittene Sachen habe ich mir via php.net selbst erarbeitet, was wirklich nicht schwer ist.
    http://www.php.net/manual/de/function.mysql-real-escape-string.php

    Google einfach nach irgendwelchen Tutorials für Sicherheit...
  14. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!