kostenloser Webspace werbefrei: lima-city


Benutzersicherung mit Session sicher?

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    leipzigergegend

    leipzigergegend hat kostenlosen Webspace.

    Hallo Leute.

    jetzt hab ich eine Frage an die jenigen die sich wirklich auskennen.
    bch hab ein benutzeroerfläche gemacht die in meinen augen relativ sicher ist.
    das ganze fujtioniert mit sessions, doch hab ich eine sondersicherung erstellt die es einen den zugrieff auf andere accounts verweigert wen man nicht den richtigen sessionnamen hat. Es ist praktisch doppelt gesichert. nun will ich die sicherheit testetn bzw. beurteilen lassen. vielleicht kann mich jemand auf eine sehr große sicherheitslücke aufmerksam machen die ích übersehn hab.

    da es verboten ist daten zu hacken werde ich mal die scripts dazu jetzt veröffentlichen. das sind jetzt auch nur kleine schnipsel vom ganzen php bzw html code

    Die Registrieren html.

    <form action="eintragen.php" method="post"><big
     style="font-weight: bold;"><big><big><big>Registrierung</big></big></big></big><br />
      <br />
      <big><big>Dein Username:</big></big><br />
      <input size="24" maxlength="50" name="username"
     type="text" /><br />
      <br />
      <big><big> Dein Passwort:</big></big><br />
      <input size="24" maxlength="50" name="passwort"
     type="password" /><br />
      <big><big> Passwort wiederholen:</big></big><br />
      <input size="24" maxlength="50" name="passwort2"
     type="password" /><br />
      <br />
      <input value="Registrieren" type="submit" /> </form>


    die registrieren.php

    <?php 
    $username = $_POST["username"]; 
    $password = $_POST["passwort"]; 
    $password2 = $_POST["passwort2"]; 
    
    
    
    if ($password == $password2) 
       { 
       $user_vorhanden = array(); 
       $passwort = md5($password); 
    
    
       $userdatei = fopen ("user.php","r"); 
       while (!feof($userdatei)) 
          { 
          $zeile = fgets($userdatei,5000); 
          $userdata = explode("|", $zeile); 
          array_push ($user_vorhanden,$userdata[0]); 
          } 
       fclose($userdatei); 
    
    
    
       if (in_array($username,$user_vorhanden)) 
          { 
          echo "Username schon vorhanden <br> <a href=\"eintragen.html\">zurück</a>"; 
          } 
    
       else 
          { 
          $userdatei = fopen ("user.php","a"); 
          fwrite($userdatei, $username); 
          fwrite($userdatei, "|"); 
          fwrite($userdatei, $passwort); 
          fwrite($userdatei, "\n"); 
          fclose($userdatei);
    if ( mkdir ( "/home/webpages/lima-city/leipzigergegend/html/User/_$username/", 0700 ) )
          $userdatei = fopen ("/home/webpages/lima-city/leipzigergegend/html/User/_$username/username.php","a+");
          fwrite($userdatei, $username); 
          fclose($userdatei);
          copy ("Anmelden.php","/home/webpages/lima-city/leipzigergegend/html/User/_$username/Anmelden.php");
          copy ("index.php","/home/webpages/lima-city/leipzigergegend/html/User/_$username/Index.php");
    
                echo "$username, deine Anmeldung war erfolgreich<br><a href=\"Weiter.php\">zum Login</a>"; 
          } 
       } 
    
    else 
      { 
      echo "Die Passwörter sind nicht identisch<br> <a href=\"eintragen.html\">zurück</a> "; 
      } 
    
    ?>


    die login.html

    <form method="post" action="login.php"><font
     face="Tahoma" size="2">Name:</font>
    &nbsp; &nbsp; &nbsp; <small><small><font
     face="Tahoma" size="2"><small><small><input
     name="username" size="20" type="text" /></small></small></font></small></small><font
     face="Tahoma" size="2">&nbsp; Passwort: </font>
      <small><small><font face="Tahoma" size="2"><small><small><input
     name="password" size="20" type="password" /></small></small></font></small></small>&nbsp;<small><small><small><input
     value="Einloggen" name="B1" type="submit" /></small></small></small>&nbsp;&nbsp;
      <small><small><input value="L&ouml;schen" name="B2"
     type="reset" /></small></small>
    </form>


    die login.php

    <?php
    session_start(); 
    $username = $_POST["username"]; 
    $passwort = $_POST["password"]; 
    $passwort = md5($passwort); 
    $log=0; 
    
    $userdatei = fopen ("Registrieren/user.php","r"); 
    while (!feof($userdatei)) 
       { 
       $zeile = fgets($userdatei,1024); 
       $userdata = explode("|", $zeile); 
    
       if ($userdata[0]==$username and $passwort==trim($userdata[1])) 
          { 
          $_SESSION['username'] = $username; 
            $Nachricht = "Login war erfolgreich. <a href=\"user/_$username/Anmelden.php\">Zum Profil</a>"; 
          $log = 1; 
          } 
       } 
    fclose($userdatei); 
    
    if ($log==0) 
       { 
       echo "Zugriff verweigert <a href=\"login.html\">Zurück</a>"; 
       } 
    ?>


    Die user index.php

    <?php 
    session_start(); 
    if(!isset($_SESSION['username']))
       { 
       echo "<a href=http://leipzigergegend.lima-city.de/Login.html>Du bist nicht Eingelogt!</a>"; 
       exit; 
       } 
    ?>
    
    <?php
    $userdatei = fopen("username.php","r");
    while(!feof($userdatei))
       {
       $zeile = fgets($userdatei,1024);
       }
    fclose($userdatei);
    
    if($username == $zeile)  
        {
        echo "";
         }
      else
        {
        echo "Dieser Vorgang ist Verboten. Du wirst jetzt von diesen Server gekickt!</a>";
         exit;
        }
    
    ?>


    <?php
    session_start();
    if(!isset($_SESSION['Admin']))
    {
    echo "Bitte erst <a href=\"login.html\">einloggen</a>";
    exit;
    }
    ?>

    hier dann die userdaten

    in der username.php steht nur der name des users

    in jedem verzeichniss liegt eine index.html und leitet immer auf die startseite weiter.

    also leutz was sagt ihr dazu.

    Bitte keine dummen komentare ich bin php anfäger brauche noch ein bischen unterstützung.

    wenn jemand sich die seite anschauen will kann es dies unter http://leipzigergegend.lima-city.de/

    Danke im vorraus.

  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

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

  3. Gehört doch in PHP rein?
    Und benutzt du keine Datenkbank und schreibst alles in eine Text-Datei??
    Das würd ich unsicher finden.

  4. h******g

    Wie machst du das jetzt mit der doppelten Sicherheit und was steht in der username.php und user.php - werde aus den geposteten Scripts nicht so richtig schlau.
    Ich würde noch in die Registrieren-Dateien eine Captcha einbauen, dass sich sicher ein Mensch registriert.
    Außerdem schreibt man "Einloggen" mit zwei g und es heißt "von diesem Server".
  5. Autor dieses Themas

    leipzigergegend

    leipzigergegend hat kostenlosen Webspace.

    mit doppelte sicherung meine ich folgendes. ich hab mit sessoin die erfahrung gemacht das wen sich jemand registr. und einggelogt hat problehmlos durch verändern der url sich bei anderen users einlogen kann. zb. wenn da jetzt der url blablabla/users/_Admin/index.php steht könnte der user einfach stadt admin peter reinschreben und dann auch beim user peter einlogen ohne ein passwort anzugeben. das ist fast der gleiche fehler wie bei meinvz.de. deswegen habe ich mir meine gedanken gemacht wie ich dieses prob umgehen kann. deswegen wird bei der registrierung praktisch in die username.php der name geschrieben. wenn sich der user anmelden will macht das script folgendes.

    login.php es prüft zuerst ob der user registriert ist und ob name und passwort übereinstimmen.

    danach wird mann auf die user index.php weitergeleitet und dort findet noch eine prüfung stadt.

    $userdatei = fopen("username.php","r");

    es wird geprüft ob der sessoin name mit dem namen in der username.php wirklich übereinstimmt.

    auf diese art würde der url trick nicht mehr funktionieren. denke ich mir....!?

    Ehhmmmm was ist ein captch?
    ich bin ein php anfäger und kenne mich mit solchen begriefen nicht wirklich aus.
    ist es sowas wie " geben sie die folgenden buchstaben wie in der box gezeigt sind ein".
    Wenn ja ist es bestimmt eine gute idee....
    nur muss ich das zuerst einmal zusammenbasteln...


    Zitat:
    Und benutzt du keine Datenkbank und schreibst alles in eine Text-Datei??

    Antwort:
    Janein..... die daten werden in eine user.php geschrieben. die user.php ist eigentlich download gesichert und wegen der einsicht hab ich folgendes in die user.php geschrieben.

    <?php 
    session_start(); 
    if(!isset($_SESSION['Admin'])) 
       { 
       echo "Bitte erst <a href=\"login.html\">einloggen</a>"; 
       exit; 
       } 
    ?>


    rein teoretisch könnte nur ich auf die datei zugreifen... oder?

    hab ihr noch weitere vorschläge? ich bin für alles offen und freu mich über jeden beitrag.

    Danke euch
  6. h******g

    mit doppelte sicherung meine ich folgendes. ich hab mit sessoin die erfahrung gemacht das wen sich jemand registr. und einggelogt hat problehmlos durch verändern der url sich bei anderen users einlogen kann. zb. wenn da jetzt der url blablabla/users/_Admin/index.php steht könnte der user einfach stadt admin peter reinschreben und dann auch beim user peter einlogen ohne ein passwort anzugeben. das ist fast der gleiche fehler wie bei meinvz.de. deswegen habe ich mir meine gedanken gemacht wie ich dieses prob umgehen kann. deswegen wird bei der registrierung praktisch in die username.php der name geschrieben. wenn sich der user anmelden will macht das script folgendes.

    login.php es prüft zuerst ob der user registriert ist und ob name und passwort übereinstimmen.

    danach wird mann auf die user index.php weitergeleitet und dort findet noch eine prüfung stadt.

    $userdatei = fopen("username.php","r");

    es wird geprüft ob der sessoin name mit dem namen in der username.php wirklich übereinstimmt.

    auf diese art würde der url trick nicht mehr funktionieren. denke ich mir....!?

    ok, verstehe, funktioniert natürlich nicht mehr.

    Ehhmmmm was ist ein captch?
    ich bin ein php anfäger und kenne mich mit solchen begriefen nicht wirklich aus.
    ist es sowas wie " geben sie die folgenden buchstaben wie in der box gezeigt sind ein".
    Wenn ja ist es bestimmt eine gute idee....
    nur muss ich das zuerst einmal zusammenbasteln...

    Ja genau. Unbedingt notwendig ist es in deinem Fall sicher nicht aber trotzdem nicht schlecht. Sonst könnte ein Bot beispielsweise 1000000000000000000000 Accounts bei dir registrieren (aber eher unwahrscheinlich, weil es keinen Nutzen hat). Es gibt bereits fertige Captcha-Scripte z.B. http://www.stoppt-den-spam.info/webmaster/captcha-tutorial/zahlen-cpatcha/captcha-php-script.html

    rein teoretisch könnte nur ich auf die datei zugreifen... oder?

    ja. ich schreib in solche dateien die Accounts gleich als Array rein, damit kommt es sowieso nie zu einer Ausgabe und die Benutzername/Passwort-Abfrage geht leicht über include(). Bsp:
    $ac[01]["login"]="Benutzername1";
    $ac[01]["pass"]="Passwort1";
  7. Zwei Denknanstösse:
    - Was passiert, wenn der Benutzer als Benutzernamen "bla | 1234 \n root" und als Passwort "1234" eingibt?
    bzw. Was passiert, wenn der Benutzer als Benutzernamen "bla" und als Passwort "1234 \n root | 1234" eingibt?
    - Was passiert wenn der Benutzer als Benutzernamen "../" eingibt?


    Also merke:
    Für alle Benutzereingaben musst du wissen, wie sie im Script verarbeitet werden.
    D.h. welchen Zweck sie haben. Auf Grund dieses Zwecks gibt es meist besondere Zeichen, die nicht enthalten sein dürfen.
    Diese sollten, wenn nur irgendwie möglich, durch eine Whitelist gefiltert werden.
    Bisher kenne ich nur einen Fall, wo eine Blacklist sinnvoller war - ich glaube, ttobsen wollte die Mathefunktionen von PHP anbieten. Bei Interesse mal im Forum suchen. ;-)

    Als weiteren Verbesserungspunkt würde ich dir Klassen oder Funktionen nahe legen.
    Dein Code ist nämlich leider nicht intuitiv zu verstehen. Sobald man zu einer else Anweisung scrollen muss ist es in meinen Augen schon nicht mehr optimal. => Dadurch entstehen schnell logische Fehler im Script.

    Deshalb sollte man in if Abfragen nicht zu viel Code schreiben.
    if (passwordsEqual ($password1, $password2)) {
      if (userExists ($username)) {
        if (somethingElse ($username, $password)) {
        } else {
          // fehelrmeldung 3
        }
      } else {
         // Fehlermeldung 2
      }
    } else {
      // Fehlermeldung 1
    }


    Idealerweise kommst du dann irgendwann zu dem Punkt, wo du einfach einen Block mit Funktionen hast. Alle diese Funktionen müssen erfüllt sein, damit eine bestimmte Aktion eintritt (z.B. das Eintragen in die User Tabelle).
    Wenn in diesen Funktionen dann Fehler auftreten, dann wird eine Exception geworfen und der Block wird direkt übersprungen und es wird eine entsprechende Fehlermeldung ausgegeben.
    Wenn du Interesse hast, setze dich mit Exception(try&catch) auseinander.

    Viel Erfolg
    Lucas

    Beitrag zuletzt geändert: 13.2.2010 20:36:21 von lucas9991
  8. Autor dieses Themas

    leipzigergegend

    leipzigergegend hat kostenlosen Webspace.

    Danke für den Link. Ist ne feine Sache. Werds noch einbauen. Das wär natürlich auch ne möglichkeit die Accounts zu schützen. naja. Danke für eure antworten. Falls jemanden noch was gutes einfahlen sollte schreibt doch. DANKE!!!!!!
  9. leipzigergegend schrieb:
    Danke für den Link. Ist ne feine Sache. Werds noch einbauen. Das wär natürlich auch ne möglichkeit die Accounts zu schützen. naja. Danke für eure antworten. Falls jemanden noch was gutes einfahlen sollte schreibt doch. DANKE!!!!!!

    Trotzdem musst du die Sonderzeichen für Pfade und die Sonderzeichen innerhalb von Dateien und das "|" escapen.
    Ich hoffe, dass vergisst du nicht.
    Sonst ist es ohne Probleme möglich in jedem Verzeichnis von deinem Webspace die Index.php und die Anmelden.php zu überschreiben.
    Darüber hinaus kann man sich mit jedem beliebigen Benutzernamen anmelden.

    [...] // gelöscht
    Bevor jemand anderes die Sicherheitslücke ausnutzt.

    Beitrag zuletzt geändert: 13.2.2010 23:55:59 von lucas9991
  10. Autor dieses Themas

    leipzigergegend

    leipzigergegend hat kostenlosen Webspace.

    Ich danke dir. du bist mein gott!!!!! ich werds gleich morgen oder übermorgen machen.
  11. Also bisher fällt auf: Textdateien sind oftmals die wahrscheinlich unsicherste Methode. Ich würde ernsthaft auf MySQL umsteigen. Dies macht den Zugriff komfortabler usw.

    Als nächstes würde ich die jeweilige Session mit der IP des Benutzers sichern. Wenn sich jemand die Session-ID von jemandem klaut, hat dieser dennoch freien zugriff. Dies macht das ganze zwar noch immer nicht unendlich sicher, aber schon einen ganzen schritt sicherer.

    Ich würde empfehlen, mal das Quakenet PHP&MySQL-Tutorial durchzuarbeiten. (Das hat mir damals geholfen, als ich auch noch in der Richtung vorgegangen bin wie du.)

    Code-Injection wurde ja schon ausreichend angesprochen.
  12. Autor dieses Themas

    leipzigergegend

    leipzigergegend hat kostenlosen Webspace.

    Na gut dan wer ich mir mal die mysql anschauen und auch einbauen..... wird warscheinlich besser sein..... noch mehr arbeit... :cool::slant::confused:

    ähhmmmm muss den die mysql datenbank auf einen extra server liegen oder läst sich das ganze von einem Server verwalten?
  13. 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!