Umgehen des Passwortschutzes verhindern?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Umgehen des Passwortschutzes verhindern?

    Hallo,

    ich habe folgendes Problem:
    ich habe für eine Website einen Passwortschutz eigerichtet der so aussieht:

    PHP-Code:
    <?php 
    session_start
    (); 
    ?> 

    <?php 
    $verbindung 
    mysql_connect("xxxx""xxxx" "xxxx"
    or die(
    "Verbindung zur Datenbank konnte nicht hergestellt werden"); 
    mysql_select_db("xxxx") or die ("Datenbank konnte nicht ausgewählt werden"); 

    $username $_POST["username"]; 
    $passwort md5($_POST["password"]);
    $hostname $_SERVER['HTTP_HOST'];
    $path dirname($_SERVER['PHP_SELF']); 

    $abfrage "SELECT username, passwort FROM login WHERE username LIKE '$username' LIMIT 1"
    $ergebnis mysql_query($abfrage); 
    $row mysql_fetch_object($ergebnis); 

    if(
    $row->passwort == $passwort
        { 
        
    $_SESSION["username"] = $username
        
    header('Location: http://'.$hostname.($path == '/' '' $path).'/geheim.php'); 
        } 
    else 
        { 
        
    header('Location: http://'.$hostname.($path == '/' '' $path).'/index.html'); 
        } 
    ?>
    Nun wird man danach auf geheim.php weitergeleitet :

    PHP-Code:
    <?php 
    session_start
    (); 
    ?> 
    <?php 
    $hostname 
    $_SERVER['HTTP_HOST'];
    $path dirname($_SERVER['PHP_SELF']); 

    if(!isset(
    $_SESSION["username"])) 
       { 
       echo 
    "Bitte erst <a href=\"index.html\">einloggen</a>"; } 
       else {
    header('Location: http://'.$hostname.($path == '/' '' $path).'/News.html');}     
    ?>
    und dann kommt man zur geschützten Seite.

    Jedoch wenn jemand einfach einen Link zu einer der eigendlich geschüzten Seiten, z.b http://...news.html in die Suchleiste des Browsers eingibt so umgeht er die index.html und der Passwortschutz brigt garnichts.

    Kann mir jemand einen Tipp geben wie ich das verhindern kann?
    Kenne mich leider nicht so gut mit php aus.

    Mit freundlichen Grüßen Alpha0493

  • #2
    Die Seite mit PHP ausliefern.

    Davon abgesehen hat dein "Passwortschutz" noch einige weitere scheunentorgroße Löcher:

    - Verwende nicht LIKE, um den Benutzernamen zu prüfen.
    - Du hast SQL-Escaping vergessen (Grundlagen!).

    Du prüfst übrigens nirgendwo, ob die Datenbankabfrage erfolgreich war. Was ist, wenn sie mal fehlschlägt?

    Kommentar


    • #3
      Erstmal vielen Dank für die schnelle Antwort.

      Wie gesgt bin ein totaler Anfänger mit php

      kannst du das mit dem "ausliefern" etwas näher erläutern ? ich nehme an ich muss dazu etwas in den header der einzelnen seiten schreiben?


      Was schlägst du denn als Alternative zu 'Like' vor?


      Wenn Benutzername und Passwort nicht gefunden werden wird man zurück zur Login Seite geleitet (index.html)

      Schonmal Danke im Voraus
      Zuletzt geändert von Alpha0493; 06.12.2011, 21:16.

      Kommentar


      • #4
        Zitat von Alpha0493 Beitrag anzeigen
        kannst du das mit dem "ausliefern" etwas näher erläutern ? ich nehme an ich muss dazu etwas in den header der einzelnen seiten schreiben?
        Das hat nichts mit dem Header zu tun.

        deliver_page.php
        PHP-Code:
        session_start();

        if (empty(
        $_SESSION['username'])) {
            
        header('Location: http://example.org/login.php');
        } else {
            
        $pageWhitelist = array(
                
        'news''foo''bar''baz'
            
        );

            if (isset(
        $_GET['page']) && in_array($_GET['page'], pageWhitelisttrue)) {
                include 
        '/www/content_folder/' $_GET['page'] . '.html';
            }

        Und dann die Seite zB. mit ./deliver_page.php?page=news aufrufen

        Zitat von Alpha0493 Beitrag anzeigen
        Was schlägst du denn als Alternative zu 'Like' vor?
        Was spricht gegen "="?

        Kommentar


        • #5
          Ich denke es spricht nichts gegen ein '='

          hab den php-code jetzt so :
          PHP-Code:
          <?php
          session_start
          (); 

          $hostname $_SERVER['HTTP_HOST'];
          $path dirname($_SERVER['PHP_SELF']); 

          if (empty(
          $_SESSION['username'])) { 
              
          header('Location: http://'.$hostname.($path == '/' '' $path).'index.html');
          } else { 
              
          $pageWhitelist = array( 
                  
          'News''Gaestebuch''Kontakt''Links' 
              
          ); 

              if (isset(
          $_GET['page']) && in_array($_GET['page'], $pageWhitelisttrue)) { 
                  include (
          'meineSeite' $_GET['page'] . '.html'); 
              } 

          ?>
          nur das include funktioniert nicht in zeile 15
          kommt eine warnung das der Wrapper ausgeschalten ist in der Server config und das die Adresse nicht gefunden werden kann
          warum das?

          Danke
          Zuletzt geändert von Alpha0493; 06.12.2011, 21:57.

          Kommentar


          • #6
            Du zeigst Fantasiecode und nicht den tatsächlichen. Die Fehlermeldung kann bei diesem Code niemals auftreten.

            Kommentar


            • #7
              So hab das 'meineSeite' (also den path) wegenommen und nun funktioniert es:

              PHP-Code:
              <?php
              session_start
              (); 

              $hostname $_SERVER['HTTP_HOST'];
              $path dirname($_SERVER['PHP_SELF']); 

              if (empty(
              $_SESSION['username'])) { 
                  
              header('Location: http://'.$hostname.($path == '/' '' $path).'index.html');
              } else { 
                  
              $pageWhitelist = array( 
                      
              'News''Gaestebuch''Kontakt''Links' 
                  
              ); 

                  if (isset(
              $_GET['page']) && in_array($_GET['page'], $pageWhitelisttrue)) { 
                      include ( 
              $_GET['page'] . '.html'); 
                  } 

              ?>
              Wahrscheinlich bin ich einfach nur zu blöd aber was hindert mich den jetzt daran die seite immernoch über http://meineseite/News.html aufzurufen?

              Kommentar


              • #8
                Gar nichts. Du musst diese Datei in einen nicht öffentlichen Ordner verschieben, der nicht über HTTP erreicht werden kann.

                Kommentar


                • #9
                  wie lege ich einen solchen ordner an ?
                  habe einen ordner erstellt der sich schutz nennt, der kann aber auch ohne probleme erreicht werden


                  um noch mal auf das sql-escaping zurück zu kommen: reicht es wenn ich das einfach so einfüge unter der Abfrage?
                  PHP-Code:
                  mysql_real_escape_string($username);
                  mysql_real_escape_string($passwort); 

                  Kommentar


                  • #10
                    Hallo,

                    google mal nach „htaccess Verzeichnisschutz“.

                    Zu deiner anderen Frage: Ja, das reicht. In einer Datenbankabfrage rufst du diese Funktion für jede Benutzereingabe auf und kannst das Ergebnis dann sicher verwenden. Besser und auch einfacher sind allerdings Prepared Statements und die Verwendung von PDO.

                    Gruß,

                    Amica
                    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                    Super, danke!
                    [/COLOR]

                    Kommentar


                    • #11
                      Zitat von Alpha0493 Beitrag anzeigen
                      wie lege ich einen solchen ordner an ?
                      Indem du aus dem Document-Root-Ordner rausgehst und einen neuen anlegst?

                      Zitat von Alpha0493 Beitrag anzeigen
                      habe einen ordner erstellt der sich schutz nennt, der kann aber auch ohne probleme erreicht werden
                      Dann hast du ihn an der falschen Stelle erstellt.

                      Zitat von Alpha0493 Beitrag anzeigen
                      um noch mal auf das sql-escaping zurück zu kommen: reicht es wenn ich das einfach so einfüge unter der Abfrage?
                      PHP-Code:
                      mysql_real_escape_string($username);
                      mysql_real_escape_string($passwort); 
                      Unter der Anfrage bringts nix. In der Abfrage schon eher.

                      Kommentar


                      • #12
                        Da du ja mit Session arbeitest, setze dir nach dem Erfolgreichen Login einfach eine Session[var] und prüfe diese nach dem vorhanden sein und nach dem Inhalt in deiner news.html, ist die Session[var] nicht vorhanden oder hat den falschen Inhalt, schickst du den User einfach wieder auf die Loginseite zurück, ansonsten zeigst du den User eben die news.html an.
                        *winks*
                        Gilbert
                        ------------------------------------------------
                        Hilfe für eine Vielzahl von Problemen!!!
                        http://www.1st-rootserver.de/

                        Kommentar


                        • #13
                          Kann den das php-script dann noch ohne probleme auf den ordner zugreifen wenn ich ihn mit "htaccess Verzeichnisschutz" versehe?
                          wenn das geht wäre das eine super möglichkeit


                          hmm ich benutze zur zeit nur einen kostenlosen server auf cwsurf.de un da habe ich nur zugriff auf ein verzeichnis in welchem sich standarmäßig die ordner "bot", "botconfig" und "useragent" befinden
                          bisher habe ich meine dateien einfach nur in das selbe verzeichnis gespeichert
                          soll ich nun verher noch einen root ordner anlegen? oder ist auf dem server ein unerreichbarer ordner nicht realisierbar?


                          bei login.php sieht nun wie folgt aus :
                          PHP-Code:

                          <?php 
                          session_start
                          (); 
                          ?> 

                          <?php 
                          $verbindung 
                          mysql_connect("dxxxx""xxxxx" "xxxx"
                          or die(
                          "Verbindung zur Datenbank konnte nicht hergestellt werden"); 
                          mysql_select_db("xxxxx") or die ("Datenbank konnte nicht ausgewählt werden"); 

                          $username $_POST["username"]; 
                          $passwort md5($_POST["password"]);
                          $hostname $_SERVER['HTTP_HOST'];
                          $path dirname($_SERVER['PHP_SELF']); 

                          $abfrage "SELECT username, passwort FROM login WHERE username = '$username' LIMIT 1"
                          mysql_real_escape_string($username);
                          mysql_real_escape_string($passwort);
                          $ergebnis mysql_query($abfrage); 
                          $row mysql_fetch_object($ergebnis); 

                          if(
                          $row->passwort == $passwort
                              { 
                              
                          $_SESSION["username"] = $username
                              
                          header('Location: http://'.$hostname.($path == '/' '' $path).'/deliver_page.php?page=News'); 
                              } 
                          else 
                              { 
                              
                          header('Location: http://'.$hostname.($path == '/' '' $path).'/index.html'); 
                              } 
                          ?>
                          ist das nun so richtig mit dem sql-escaping?

                          Zuletzt geändert von Alpha0493; 07.12.2011, 10:23.

                          Kommentar


                          • #14
                            @ wotan
                            aber diese prüfung geschieht doch auch durch ein php.script oder?
                            kann ich das einfach mit in ein html-dokument schreiben?
                            Zuletzt geändert von Alpha0493; 07.12.2011, 10:25.

                            Kommentar


                            • #15
                              Kann den das php-script dann noch ohne probleme auf den ordner zugreifen wenn ich ihn mit "htaccess Verzeichnisschutz" versehe?
                              .htaccess Dateien werden vom Webserver gelesen und ausgewertet.
                              Dem PHP sind die völlig wurscht.

                              ist das nun so richtig mit dem sql-escaping?
                              Nein!
                              Wir werden alle sterben

                              Kommentar

                              Lädt...
                              X