Sicherheit eines Internen Bereiches

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

  • Sicherheit eines Internen Bereiches

    Guten Abend alle miteinander

    Meine Frage bezieht sich auf einen von mir programmierten Internen-Bereich. Und zwar würde ich gern einige Dinge über die Sicherheit erfahren. Was kann ich verbessern, was muss ich anders machen etc...

    Mein System arbeitet mit Session-Cookies. Beim Login werden Benutzerdaten in die Session geschrieben. In allen internen Bereichen wird überprüft ob eine User_id gesetzt ist.(wird beim login natürlich gesetzt). Außerdem wird beim Login die Ip gespeichert und bei jeder Seite im internen Bereich diese mit der aktuellen verglichen. Wenn eine dieser Überprüfungen negativ ist wird man zur loginseite geleitet.(header) Um alle User zu verwalten habe ich einen Administrationsbereich gemacht. Dort werden die beiden Überprüfungen auch gemacht und hinzu kommt noch die Abfrage ob in der Datenbank bei dem User in einem Feld admin steht. Wenn nicht wird man in den Internen Bereich geleitet.

    Meine Fragen sind. Ist das System sicher? Wo ist es unsicher...
    Ich habe irgendwo gelesen, das es möglich ist mit include einfach eigene Scripte einzubinden etc. und man daher den include Befehl sicher machen sollte. Wie hab ich nicht herrausgefunden. (vlt mit einer abfrage ob die Datei in einem bestimmten festgelegtem Ordner liegt oder ähnlich).
    Außerdem habe ich von einem Schutz vor Bruteforceangriffen gelesen, der meiner Meinung sehr Userunfreundlich ist.(zeitliche Sperrung des Accounts bei einer bestimmter Anzahl von fehlerhaften Loginversuchen)

    einige Quellcodes:

    Login
    Code:
    include ("./connect.php");
    $user_pw=$_POST["user_pw"];
    $login_query = mysql_query("SELECT * FROM user_index where user_nick ='$user_nick' And user_pw ='$user_pw'");
    
    if (mysql_num_rows ($login_query) > 0) 
    { 
    $login = mysql_fetch_array($login_query);
    
      
      $_SESSION["session_user_id"] = $login["user_id"]; 
      $_SESSION["session_user_nick"] = $login["user_nick"];  
      $_SESSION["session_user_forename"] = $login["user_forename"];  
      $_SESSION["session_user_surname"] = $login["user_surname"];
      $_SESSION["session_user_ip"] =$_SERVER['REMOTE_ADDR'];
      $user_id=$login["user_id"];
      mysql_query("UPDATE user_index SET user_last = Now('') where user_id ='$user_id'"); 
      
      header ("Location: intern.php"); 
    } 
    else 
    { 
      header ("Location: index.php?error=1"); 
    }
    Intern-Check:
    Code:
    <?php 
    session_start (); 
    if (!isset ($_SESSION["session_user_id"])) 
    { 
      header ("Location: index.php?error=2"); 
    }
    if($_SESSION["session_user_ip"] != $_SERVER['REMOTE_ADDR'])
    { 
      header ("Location: index.php?error=2"); 
    }
    
    ?>
    Admin-Check(nur das Zusätzliche):
    Code:
    $user_id=$_SESSION["session_user_id"];
    $result = mysql_query("SELECT user_type FROM user_index where user_id = '$user_id'");
      $user_type = mysql_result($result, 0, 0);
    if ($user_type != "admin")
    { 
      header ("Location: ../intern.php?error=1"); 
    }
    Vielen Dank im Vorraus
    Aegnor

  • #2
    Re: Sicherheit eines Internen Bereiches

    Original geschrieben von Aegnor
    Login
    PHP-Code:
    include ("./connect.php");
    $user_pw=$_POST["user_pw"];
    $login_query mysql_query("SELECT * FROM user_index where user_nick ='$user_nick' And user_pw ='$user_pw'");
    ... 
    Hm, wenn du das Passwort einfach so in deinen Query verwendest ist es möglich deinen Query zu modifizieren (Stichwort: SQL-Injektion). Kannst ja mal bei google danach suchen. P.S für POSTund GET Varablen vwerwende ich eig. immer folgeden Syntax:

    PHP-Code:
    $pass = (isset($_POST['pass']) && strlen(trim($_POST['pass'])) > )
    mysql_escape_string(trim($_POST['pass'])) : ''
    Vielleicht etwas lang, aber kann ja alles net schaden

    Forumregeln!

    Gute PHP-(tutorial-)Seiten

    Kommentar


    • #3
      erstes Loch:
      PHP-Code:
      $user_pw=$_POST["user_pw"];
      $login_query mysql_query("SELECT * FROM user_index 
      where user_nick ='
      $user_nick' And user_pw ='$user_pw'"); 
      was passiert wohl, wenn ich als passwort

      ' or '1

      eingebe ?
      TBT

      Die zwei wichtigsten Regeln für eine berufliche Karriere:
      1. Verrate niemals alles was du weißt!


      PHP 2 AllPatrizier II Browsergame

      Kommentar


      • #4
        Re: Sicherheit eines Internen Bereiches

        Original geschrieben von Aegnor
        ... Außerdem wird beim Login die Ip gespeichert und bei jeder Seite im internen Bereich diese mit der aktuellen verglichen. Wenn eine dieser Überprüfungen negativ ist wird man zur loginseite geleitet....
        Es gibt zb. AOL Kunden, deren IP´s sich häufig ändern - die hast Du damit vergrault.
        (-:
        Bookmarks:·Bilder·Jobs·Recht·
        kostenloser Webkataloge-Assistent

        Kommentar


        • #5
          Vielen Dank schonmal:
          Ist es so sicherer?:
          PHP-Code:
          $login_query mysql_query("SELECT * FROM user_index where user_nick ='$user_nick' And user_pw ='".mysql_real_escape_string($_POST['user_pw'])."'"); 
          mysql_real_escape_string wusse Google als Gegenmaßnahme.

          Das mit der IP hab ich so gemacht um vor Sessionübernahmen zu schützen.

          Ist mit den abfragen alles soweit sicher?(abfragen ob man eingeloggt bzw. admin ist)

          MfG

          Aegnor

          Kommentar


          • #6
            Naja ich wüsste nicht wie man es anderst machen könnte (also die anderen abfragen)

            Forumregeln!

            Gute PHP-(tutorial-)Seiten

            Kommentar


            • #7
              schonmal gut

              Wird die SQL-Injektion mit der von Google gefundenen Gegenmaßnahme verhindert?(ist es das man z.B. 'or' 1 eingibt? oder ist das wieder was anderes)

              mfg

              Aegnor

              Kommentar


              • #8
                Öhm das hast du glaub faslch verstanden .

                Such hier im Forum (und / oder) Google mal nach "SQL-Injektion". Das hat Google nicht erfunden . Das mit dem 'or 1 kannst du so verstehen: sagen wir aml der User gibt seinen Username ein: z.B. hans
                als Passwort nimmt er wurst, dann ergibt sich ein Query:
                Code:
                SELECT * FROM user_index where user_nick ='hans' AND user_pw = 'wurst'
                Da ist ja alles noch OK. Nehmen wir mal an: Username: hans , Passwort: ' or 1='1

                dann ergibt sich ein Query:
                Code:
                SELECT * FROM user_index where user_nick ='hans' AND user_pw = '' or 1='1'
                Na verstanden?

                Forumregeln!

                Gute PHP-(tutorial-)Seiten

                Kommentar


                • #9
                  PHP-Code:
                  $login_query mysql_query("SELECT * FROM user_index where user_nick ='$user_nick' And 
                  user_pw ='"
                  .mysql_real_escape_string($_POST['user_pw'])."'"); 
                  Never trust the incoming data. imho würde ich die Usereingabe noch genauer prüfen, bevor du sie auf die DB loslässt.
                  Wenn du z.B. weisst, dass deine Passworte mindestens 3 Zeichen lang sind, dann prüfe danach.
                  Prüfe nach Zeichen (und verweigere die Anmeldung) wie ' und " ,welche Anzeichen für SQL-Injections sein könnten.
                  Das gleiche gilt für den User, auch diese Eingabe sollte geprüft werden, ehe du sie in eine MySql-Abfrage einbaust.

                  Gruss

                  tobi
                  Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                  [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                  Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                  Kommentar


                  • #10
                    Original geschrieben von jahlives
                    imho würde ich die Usereingabe noch genauer prüfen, bevor du sie auf die DB loslässt.
                    Wenn du z.B. weisst, dass deine Passworte mindestens 3 Zeichen lang sind, dann prüfe danach.
                    Prüfe nach Zeichen (und verweigere die Anmeldung) wie ' und " ,welche Anzeichen für SQL-Injections sein könnten.
                    Das gleiche gilt für den User, auch diese Eingabe sollte geprüft werden, ehe du sie in eine MySql-Abfrage einbaust.
                    Warum?
                    Wegen der Sicherheit?
                    mysql_real_escape_string reicht doch völlig aus, was könnte die Funktion übersehen, du aber nicht?
                    Ich denke, also bin ich. - Einige sind trotzdem...

                    Kommentar


                    • #11
                      ...was könnte die Funktion übersehen, du aber nicht?
                      Ich, wenn ich das Script geschrieben habe, weiss was ich für Mindestanforderungen an das Passwort stelle und darauf prüfe ich. Ok auf die ' und " zu kontrollieren ist überflüssig. Aber eine Prüfung auf die Minimalanforderungen an ein Passwort halte ich durchaus für angebracht.
                      Gruss

                      tobi
                      Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                      [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                      Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                      Kommentar


                      • #12
                        Das solltest du dann aber nicht bei jedem Login machen.
                        Vielmehr solltest du dafür Sorge tragen, dass der Benutzer kein deiner Meinung nach unsicheres Passwort wählen kann.
                        => Du solltest beim Passwort ändern prüfen

                        btw:
                        md5 auf den Buchstaben 'a' ergibt genauso 32 Zeichen wie md5 auf den Text 'wdcw765r34%&$§Evdsc5%'
                        Ich denke, also bin ich. - Einige sind trotzdem...

                        Kommentar


                        • #13
                          Du solltest beim Passwort ändern prüfen
                          Das mache ich in meinem Script auch. Dort prüfe ich Passwort und Username auf verbotene Zeichen.
                          Nur halte ich es bei der Prüfung der Daten mit folgendem Grundsatz: Was nicht sein kann, wird auch nicht weiter geprüft :-)
                          Ich weiss bei mir dass das PW mindestens eine Zahl und einen Grossbuchstaben/Sonderzeichen enthalten muss.
                          Auch der Benutzername muss einen Grossbuchstaben enthalten.
                          Wenn die Untersuchung der Eingabe negativ ist, dann mache ich
                          auch keine DB-Abfrage mehr.

                          Gruss

                          tobi
                          Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                          [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                          Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                          Kommentar


                          • #14
                            Das bleibt dir ja unbenommen, dachte du wolltest irgendwie auf eine Steigerung der Sicherheit beim SELECT hinaus
                            Ich denke, also bin ich. - Einige sind trotzdem...

                            Kommentar


                            • #15
                              ...dachte du wolltest irgendwie auf eine Steigerung der Sicherheit beim SELECT hinaus
                              Nein das wollte ich nicht, denn ich denke der Select ist sicher so. Ich habe das bei mir "eingeführt" damit ich einem User, der 3 mal ein PW eingibt das nicht der Minimalanforderung entspricht, mittels htaccess den Zugang verweigern kann (trage dann die IP ein und sperre so den Zugang, zumindest bis der User ne neue IP hat oder 20 min keinen Log-In mehr versucht)

                              Gruss

                              tobi
                              Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                              [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                              Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                              Kommentar

                              Lädt...
                              X