Ankündigung

Einklappen
Keine Ankündigung bisher.

Sicherer Login

Einklappen

Neue Werbung 2019

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

  • Sicherer Login

    Hallo zusammen,
    ich möchte gerne einen möglichst sicheren Login bauen.
    Dazu verwende ich unter anderem "mysql_real_escape_string", hashe mit "sha256", nutze Sessions, aber keine Cookies, nutze "htmlspecialchars", lasse bei der Eingabe des Namens & Passwort nur Zahlen & Buchstaben zu und prüfe bei jedem Aufruf, ob die IP des Users noch mit der des Logins übereinstimmt.
    Dennoch habe ich eben noch etwas über XSS Attacken, Injections und Session Hijacking gelesen. Reichen meine Methoden gegen solche Attacken?

    Grüße,
    xkevin96x


  • #2
    http://www.php.de/php-einsteiger/113...tenbanken.html
    Sollte alles wichtige drinstehen, einfach mal den Links folgen
    Relax, you're doing fine.
    RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

    Kommentar


    • #3
      Dazu verwende ich unter anderem "mysql_real_escape_string"
      Die mysql_ Erweiterung funktioniert nicht mehr lange.. nutze besser gleich PDO mit prepared Statements

      hashe mit "sha256
      Nein, technisch überholt, siehe: http://php.net/manual/de/faq.passwor...words.fasthash (unten auf der Seite steht was du verwenden sollst)

      nutze Sessions, aber keine Cookies
      Sessions basieren per default auf Cookies - sollte man bei so einer Aussage ev. besser wissen. Für Sessions sind Cookies besser als die transid per URL

      lasse bei der Eingabe des Namens & Passwort nur Zahlen & Buchstaben zu
      Warum auch beim Passwort? dadurch verkleinerst du die erlaubte /mögliche Komplexität der Passworter

      prüfe bei jedem Aufruf, ob die IP des Users noch mit der des Logins übereinstimmt.
      Das ist Blösdinn, wenn ich in der Fa. bin will ich mich auch einloggen können, oder vom Smartphone aus etc.... Ausserdem IP speichern ist Datenschutzrechtlich glaube ich(!) nicht unbedenklich.

      XSS Attacken
      Nein, da geht es um den Ausgabekontext, dh das was an den Browser von deiner Seite raugeht und vom Browser dann ausgeführt wird: http://php-de.github.io/jumpto/cross-site-scripting/

      LG
      Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
      PHP.de Wissenssammlung | Kein Support per PN

      Kommentar


      • #4
        Kurze Zusammenfassung: Nein

        Lange Fassung:
        1. Du Verwendest mysql_real_escape_string, darauf lässt sich schließen das du mysql_* verwendest. Diese Erweiterung ist veraltet und sollte nichtmehr verwendet werden. Du solltest also auf mysqli_* oder PDO umstellen.
        2. Du verwendest sha256 zum Passwort hashen auch das ist "falsch".
        Hier findest du die bessere Lösung: http://php.net/manual/de/faq.passwords.php
        3.htmlspecialcars für sich genommen schützt dich nicht zuverlässig vor den o.g. Angriffsarten
        4. CSRF z.B. wird vermutlich garnicht von dir behandelt?,
        nutze Sessions, aber keine Cookies
        die Sessionwerte werden auf Nutzerseite per Default in einem Cookie abgelegt, insofern nutzt du schon Cookies was jedoch dem Grunde nach nicht weiter schlimm ist.

        Kommentar


        • #5
          Zitat von xkevin96x Beitrag anzeigen
          Dazu verwende ich unter anderem "mysql_real_escape_string",
          Falsch. die mysql_*-Funktionen sind veraltet, verwende mysqli oder PDO.

          nutze Sessions, aber keine Cookies,
          Warum nicht? Wenn die Session-ID über die URL übertragen wird besteht die Gefahr dass ein User (unabsichtlich) eine URL mit einer gültigen Session weitergibt.

          nutze "htmlspecialchars",
          Ob du die Kontextwechsel zu HTML richtig behandelst lässt sich so nicht sagen.

          lasse bei der Eingabe des Namens & Passwort nur Zahlen & Buchstaben zu
          Warum? Beim Benutzernamen mag es ja noch sinnvoll sein nur bestimmte Zeichen zuzulassen um ihn auch als Dateinamen o.ä. verwenden zu können aber bei Passwörtern gibt es imho keinen Grund irgendwelche Zeichen nicht zuzulassen - im Gegenteil, die Passwörter werden nur unsicherer wenn du nur Buchstaben und Zahlen zulässt.

          und prüfe bei jedem Aufruf, ob die IP des Users noch mit der des Logins übereinstimmt.
          Keine gute Idee. IPs können wechseln, es gibt/gab Provider bei denen die IP bei jedem Seitenaufruf gewechselt hat aber auch bei Mobilgeräten wechselt die IP wenn man einen Bereich verlässt in dem man W-Lan hat und dann über das Handynetz weitersurft (bzw. andersrum genauso).

          Kommentar


          • #6
            zusätzoich zu allem angesprochenen?
            hau doch noch ein auth cert mit rein, wenn du unbedingt willst.
            http://www.phpgangsta.de/client-zert...r-login-ersatz

            //OT:

            das mit der ip hab ich unlängst von einem geschätzten mitforisten hier gelesen, verzeiht also dem TE.

            Kommentar


            • #7
              das ding ist, dass die wenigstens versuchen den login script zu hacken, man macht es meistens über Bruteforce attacke.

              der Account eines users bringt einem so gut wie nichts(kommt auf die webseite an), eher will man hinter die Anwendung reinkommen, es bringt also nichts beim login auf alles zu achten und dann bei einer suche plötzlich SQL injections erlauben.

              PHP-Code:
              mysql_real_escape_string 
              bringt nicht immer was, wenn in deinem SQL string die hochkommas fehlen dann kann man dennoch rankommen(mysql_* generell sollte man nicht mehr benutzen)

              PHP-Code:
              sha256 
              bei einer bruteforce attacke bringt es nicht viel

              ob die IP des Users noch mit der des Logins übereinstimmt
              ?? was wenn ich 2 tage deine webseite nicht besucht habe, oder mal von der Arbeit aus mich einloggen will?


              Dennoch habe ich eben noch etwas über XSS Attacken, Injections und Session Hijacking gelesen.
              XSS = Cross Site Scripting, ich war mal auf einer webseite, angemledet, dort konnte man seinen user account mit account_delete.php einfach löschen wenn man eingeloggt ist. Ich habe dann bei meinem Profil als Profil Informationen simples <script>window.location = "account_delete.php";</script>

              eingetragen und jeder der mein Account besucht hat, wurde gelöscht. es hat mir persönlich nicht viel gebracht,war aber witzig

              konzentrier dich nicht nur auf hacking angriffe, es gibt auch logik überprüfungen die oft vergessen werden.

              ich habe zum Beispiel in einem Browsergame mir rohstoffe gutgeschrieben, in dem ich einfach rohstoffe an gegner geschickt habe, einfach ins input feld -10000 geschickt und schon hat der gegner rohstoffe verloren.

              wenn ich "sha256" und "mysql_real_escape_string" lese, gehe ich stark davon aus dass es schwierig wird für dich an alles zu denken.
              apt-get install npm -> npm install -g bower -> bower install <package> YOLO https://www.paypal.me/BlackScorp | Mein Youtube PHP Kanal: https://www.youtube.com/c/VitalijMik

              Kommentar


              • #8
                ich habe zum Beispiel in einem Browsergame mir rohstoffe gutgeschrieben, in dem ich einfach rohstoffe an gegner geschickt habe, einfach ins input feld -10000 geschickt und schon hat der gegner rohstoffe verloren.
                Das gefällt mir besonders. Wobei die Account Löschung natürlich auch nett ist.

                Kommentar


                • #9
                  Ich danke schonmal für eure Antworten.
                  Ich setze mich aktuell mit MySQLi auseinander und versuche es mir anzueignen.
                  Zum Glück habe ich in meinem Projekt aktuell nur das
                  Design umgesetzt und noch keine Abfragen eingebaut
                  Danke auch für den Hinweis mit Passwörtern, gewisse Zeichen müssen dort
                  zugelassen werden. Ich würde gerne noch wissen, wie ich nun am besten (oder am sichersten?) Variablen escapen kann. Ich meine hierbei nicht Datenbankabfragen sondern beispielsweise gegen XSS und co.

                  Kommentar


                  • #10
                    Zitat von TessaKavanagh Beitrag anzeigen
                    Das gefällt mir besonders. Wobei die Account Löschung natürlich auch nett ist.
                    Nice, ich hatte mal bei einem renommierten onlinespiel ein "unsicheres" virtuelles Bank-Script. Man konnte mehr Geld anlegen als man selbst besaß, die Zinsen kassieren und den Betrag wieder zurückholen. Zwar hatte man einen Tag lang -9Trillionen Dollar, aber bei 10% Zinsen, die man davon einen Tag später bekommen hat
                    Also selbst Profis vergessen manchmal was.
                    Current Projects: http://www.welten-buch.de, http://neu.zooadoo.de

                    Kommentar


                    • #11
                      Zitat von xkevin96x Beitrag anzeigen
                      ... Variablen escapen kann. Ich meine hierbei nicht Datenbankabfragen sondern beispielsweise gegen XSS und co.
                      Generell - das hier ist im Grunde (ausser BruteForce, schwache Passwörter/Hash-Algos etc..) die Mutter allen Übels. Wenn du immer den jeweiligen Kontextwechsel richtig behandelst, bist du gut unterwegs.

                      http://php-de.github.io/jumpto/kontextwechsel/
                      http://wiki.selfhtml.org/wiki/Artikel:Kontextwechsel

                      LG
                      Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                      PHP.de Wissenssammlung | Kein Support per PN

                      Kommentar


                      • #12
                        Wäre dies eine sichere Abfrage?
                        PHP-Code:
                        $username htmlspecialchars("username");
                        $passwort htmlspecialchars("passwort");
                        $sql sprintf("SELECT username,passwort FROM test WHERE username='%s' AND passwort='%s'",
                                    
                        mysql_real_escape_string($username),
                                    
                        mysql_real_escape_string($passwort)); 

                        Kommentar


                        • #13
                          Zitat von xkevin96x Beitrag anzeigen
                          PHP-Code:
                          $username htmlspecialchars("username");
                          $passwort htmlspecialchars("passwort");
                          $sql sprintf("SELECT username,passwort FROM test WHERE username='%s' AND passwort='%s'",
                                      
                          mysql_real_escape_string($username),
                                      
                          mysql_real_escape_string($passwort)); 
                          Mal abgesehen davon dass du vermutlich nicht »$username = htmlspecialchars("username");« meinst sondern »$username = htmlspecialchars($_POST["username"]);«: ja, aber: htmlspecialchars() hat an der Stelle nichts verloren. Der Kontextwechsel zur Datenbank ist mit mysql_real_escape_string() (beachte die Hinweise bzgl. mysql/mysqli/PDO!) erschlagen, htmlspecialchars() brauchst du nur wenn du irgendwas als HTML an den Browser ausgibst.

                          Kommentar


                          • #14
                            Zitat von tk1234 Beitrag anzeigen
                            Mal abgesehen davon dass du vermutlich nicht »$username = htmlspecialchars("username");« meinst sondern »$username = htmlspecialchars($_POST["username"]);«: ja, aber: htmlspecialchars() hat an der Stelle nichts verloren. Der Kontextwechsel zur Datenbank ist mit mysql_real_escape_string() (beachte die Hinweise bzgl. mysql/mysqli/PDO!) erschlagen, htmlspecialchars() brauchst du nur wenn du irgendwas als HTML an den Browser ausgibst.
                            Also wenn ich beispielsweise ein Feld mache, bei dem User einen Bildlink einfügen können und jemand auf die Idee kommt, dort "<script>alert('XSS')</script>" einzufügen, kann ich dies mit htmlspecialchars beseitigen, oder benötigt das noch mehr?
                            Und ich hätte noch eine Frage: Ich verwende nach dem Login beispielsweise $_SESSION['username'] = 'UserXY';, aber einige
                            haben etwas von Sessionid oder Sessionlink gesagt. Was genau sind das?

                            Kommentar


                            • #15
                              Jeder Kontextwechsel ist individuell ja nachdem von wo - nach wo zu behandeln und PHP bietet dafür auch für alles Funktionen an, machen muss man es nur. Dazu wurde eh schon einiges nun erwähnt und auch den Kontextwechsellink hast du dir sicher angesehen.

                              oder benötigt das noch mehr?
                              http://php-de.github.io/jumpto/cross...site-scripting

                              Ich verwende nach dem Login beispielsweise $_SESSION['username'] = 'UserXY';, aber einige
                              haben etwas von Sessionid oder Sessionlink gesagt. Was genau sind das?
                              -> Doku
                              https://php.net/manual/de/intro.session.php

                              http://php.net/manual/de/session.idpassing.php

                              LG
                              Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                              PHP.de Wissenssammlung | Kein Support per PN

                              Kommentar

                              Lädt...
                              X