Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Session, isset und mysql

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Session, isset und mysql

    Hallo zusammen,

    Ich habe 3 Fragen zu denen ich momentan keine Antwort finde oder die Antworten nicht verständlich formuliert wurden.

    Ich beginne mal mit meiner ersten Frage:
    1. Was muss alles beachtet werden, wenn ich so sicher wie möglich mit sessions arbeiten möchte ? z.B. beim überprüfen, ob ein User bereits eingeloggt ist oder nicht...

    2. Wie würdet ihr diese Code vereinfachen ?
    PHP-Code:
    function abc($str1$str2)
    {
        if(!isset(
    $str1) || !isset($str2) || empty($str1) || empty($str2))
        {
            return 
    false;
            break;
        }
        else
        {
            if(
    strlen($str1) >= 26 || strlen($str) >= 26)
            {
                return 
    false;
            }
            else
            {
                return 
    true;
            }
        }

    3. Nach prüfung der strings in Frage2, benutze ich noch mysql_real_escape_string um die strings vorzubereiten, damit ich sie nachher in einer SQL-Abfrage verwenden kann. Reicht das um mich vor SQL-Injections zu schützen ?

  • #2
    1. Was muss alles beachtet werden, wenn ich so sicher wie möglich mit sessions arbeiten möchte ? z.B. beim überprüfen, ob ein User bereits eingeloggt ist oder nicht...
    Dafür gibt es Tutorials. Das hier nochmal alles nieder zu schreiben, ist es leider nicht wert. Wenn du konkretere Fragen hast, gerne

    Wie würdet ihr diese Code vereinfachen?
    PHP-Code:
    if(!isset($str1) || !isset($str2) || empty($str1) || empty($str2)) 
    kann vereinfacht werden zu
    PHP-Code:
    if(empty($str1) || empty($str2)) 
    empty() enthält nämlich bereits die Prüfung, ob eine Variable existiert und ob sie NULL ist (die Variablen sind aber hier sowieso immer vorhanden, da sie Funktionsparameter sind).

    PHP-Code:
    return false
    break; 
    Nach einem Return wird kein Code mehr ausgeführt. Das break ist vollkommen überflüssig.

    if(strlen($str1) >= 26 || strlen($str) >= 26)
    Die Variable $str existiert nicht, vermutlich meinst du $str2.

    Insgesamt würde ich es so kürzen:
    PHP-Code:
    function abc($str1$str2

        if (empty(
    $str1) || empty($str2)) {
            return 
    false;
        }

        if (
    strlen($str1) >= 26 || strlen($str2) >= 26) {
            return 
    false;
        } 

        return 
    true;

    Man könnte die Bedingungen der beiden ifs noch zusammenfassen zu einem einzigen if, aber ich finde es so schon recht übersichtlich.

    3. Nach prüfung der strings in Frage2, benutze ich noch mysql_real_escape_string um die strings vorzubereiten, damit ich sie nachher in einer SQL-Abfrage verwenden kann. Reicht das um mich vor SQL-Injections zu schützen ?
    Müsste man konkret sehen, aber hört sich zumindest vernünftig an.

    VG

    Kommentar


    • #3
      Erstmal danke für die schnelle Antwort

      Momentan sind die wichtigsten fragen für mich beantwortet. Werde mich jetzt etwas ausführlicher mit sessions beschäftigen und sobald ich konkretere fragen habe werde ich sie stellen.

      LG

      Kommentar


      • #4
        Die Funktion ist komplett überflüssig.

        Wenn du nämlich im Programmfluss wissen möchtest, ob eine Variable länger ist als 26 Zeichen, dann kannst du das mit strlen() direkt prüfen. Zu beachten ist ferner, , dass empty('0') auch true liefert.

        Mach das doch einfach so:
        PHP-Code:
        if (!isset($str1) or strlen($str1)>25) {
          
        // Fehlerbehandlung $str1
        }
        if (!isset(
        $str1) or strlen($str2)>25) {
          
        // Fehlerbehandlung $str2

        Kommentar


        • #5
          Die Funktion ist komplett überflüssig.

          Wenn du nämlich im Programmfluss wissen möchtest, ob eine Variable länger ist als 26 Zeichen, dann kannst du das mit strlen() direkt prüfen.
          Das ganze nennt sich dann aber Code-Duplizierung. Was machst du, wenn die Parameter mal einer weiteren Prüfung unterzogen werden sollen (z.B. nur bestimmte Zeichen enthalten dürfen)? Dann braucht man nur eine zentrale Funktion anpassen und muss die neue Prüfung nicht an zig Stellen nachträglich hinzufügen.

          Da die Prüfung für beide Strings die selbe ist, könnte man die oben geschriebene Funktion auf einen einzelnen zu prüfenden String reduzieren und dann für beide Strings aufrufen. Also z.B.
          PHP-Code:
          function isValidString($str) {
              if (empty(
          $str) || strlen($str) > 25) {
                  return 
          false;
              }

              return 
          true;
          }

          if (!
          isValidString($str1) || !isValidString($str2)) {
              
          // Fehlermeldung

          Der Fall, dass eine Variable tatsächlich nicht gesetzt ist, sollte bei einer sauberen Programmierung eigentlich nicht eintreten. Deshalb kann man auf das isset() meist verzichten.

          Mach das doch einfach so:
          PHP-Code:
          if (!isset($str1) or strlen($str1)>25) {
            
          // Fehlerbehandlung $str1

          Würde bei einem leeren String aber keine Fehlermeldung geben. Isset prüft nämlich nur, ob die Variable gesetzt ist und ungleich NULL (was aber halt etwas anderes ist als ein leerer String).

          VG

          Kommentar


          • #6
            Dennoch - die o.g. Funktion ist nur ein Wrapper für strlen. Wenn man schon so was baut, dann kann man die erlaubte Stringlänge ja auch noch als Parameter übergeben... irgendwann hat man die eierlegende Wollmilchsau.
            Und nochmal: Empty() ist zweifelhaft - das meldet bei einem Inhalt "0" auch true.

            Dein Vorschlag
            if (!isValidString($str1) || !isValidString($str2)) {
            ist auch deshalb unflexibel, weil nun nicht klar ist, welches der Felder nun falsch war. Man will dem Nutzer ja nicht unbedingt ausgeben: "Irgendwo im Formular hast du irgendwas falsch eingegeben"


            Kommentar


            • #7
              Danke erstmals für eure Bemühungen!

              Ich hatte natürlich auch zuerst den Gedanken, das ganze in eine Funktion zu schreiben und die beiden Strings nacheinander durchlaufen zu lassen.

              Ich möchte aber spezifische Fehlermeldungen ausgeben. Das heisst, wenn einer der beiden Strings leer ist, soll die Fehlermeldung "bitte alle Felder ausfüllen" erscheinen.
              Wenn beide Felder nicht leer sind wird auf die länge geprüft und bei bedarf die Fehlermeldung "Eingabe zu lang" ausgespuckt.

              Mache ich das ganze nun mit einer Funktion bei der die Strings nacheinander durchlaufen, und das erste Feld ist zu lang (also mehr als 25 Zeichen) und das zweite ist leer so, gibt er mir die Fehlermeldung "Eingabe zu lang" obwohl eigentlich "bitte alle Felder ausfüllen" erscheinen soll.

              Habe das ganze jetzt so gelöst:
              PHP-Code:
              functioncheckstring($str1$str2)
              {
                  if(empty(
              $str1) || empty($str2))
                  {
                      echo 
              "<p>Bitte f&uuml;llen sie alle felder aus!</p>";
                      return 
              false;
                  }
                  if(
              strlen($str1) >= 26 || strlen($str2) >= 26)
                  {
                      echo 
              "<p>Eingabe ist zu lange!</p>";
                      return 
              false;
                  }
                  return 
              true;

              später kommen eventuell noch einige Prüfungen hinzu....

              Kommentar


              • #8
                Dennoch - die o.g. Funktion ist nur ein Wrapper für strlen. Wenn man schon so was baut, dann kann man die erlaubte Stringlänge ja auch noch als Parameter übergeben... irgendwann hat man die eierlegende Wollmilchsau.
                Als einen Wrapper würde ich es bezeichnen, wenn die Funktion das gleiche tun würde wie strlen(), tut sie aber nicht. Sie prüft nämlich auf empty() und zusätzlich die maximal zulässige Länge. Das ist meiner Meinung nach etwas anderes als nur die Länge zurückzugeben

                Und nochmal: Empty() ist zweifelhaft - das meldet bei einem Inhalt "0" auch true.
                Das streite ich auch gar nicht ab. Die Frage ist nur, wie die Anforderungen hier lauten. Eventuell ist es ja auch gewünschtes Verhalten. Man weiß es nicht.

                Dein Vorschlag
                if (!isValidString($str1) || !isValidString($str2)) {
                ist auch deshalb unflexibel, weil nun nicht klar ist, welches der Felder nun falsch war. Man will dem Nutzer ja nicht unbedingt ausgeben: "Irgendwo im Formular hast du irgendwas falsch eingegeben"
                Uff ... wieso interpretierst du so viele neue Anforderungen hinein? Im ersten Post ging es darum, zwei Variablen zu prüfen. Die ursprüngliche Funktion hatte auch nur den Rückgabewert TRUE oder FALSE. Somit konnte man auch nicht unterscheiden, welche der beiden Variablen nun einen ungültigen Wert enthielt. Die Frage des TEs war, wie man die Funktion vereinfachen kann. Warum soll man nun also das ganze erweitern und unterscheiden, welcher der Strings ungültig ist, wenn es doch gar nicht Teil der Vereinfachung ist?

                VG

                Kommentar


                • #9
                  Ich habe noch eine Frage bezüglich SQL-Injections.
                  Bevor ich meine strings in das SQL-Select-Statement einfüge, überprüfe ich sie mit dem forher genannten funktion auf länge u.s.w. Anschliessen lasse ich sie noch mit mysql_real_escape_string entschärfen. Ist es noch nötig b.z.w sinnvoll, diverse Zeichen aus den strings zu entfernen ? Wenn ja, welche und wie ?

                  Besten dank !

                  Kommentar


                  • #10
                    Bevor ich meine strings in das SQL-Select-Statement einfüge, überprüfe ich sie mit dem forher genannten funktion auf länge u.s.w. Anschliessen lasse ich sie noch mit mysql_real_escape_string entschärfen. Ist es noch nötig b.z.w sinnvoll, diverse Zeichen aus den strings zu entfernen ?
                    Nö. Du prüfst ja bereits vorher, ob die Daten deinen Anforderungen entsprechen. Warum sollte man dann noch irgendwelche Zeichen löschen?

                    VG

                    Kommentar


                    • #11
                      Zitat von BR2012 Beitrag anzeigen
                      Nö. Du prüfst ja bereits vorher, ob die Daten deinen Anforderungen entsprechen. Warum sollte man dann noch irgendwelche Zeichen löschen?

                      VG
                      Ich habe mich nur gefragt, ob mysql_real_escape_string wirklich alle Gefahren von sql-injections eliminiert.

                      Danke & LG

                      Kommentar


                      • #12
                        Hallo zusammen,

                        Mir stellen sich noch einige Fragen zu denen ich aktuell keine Antwort finde. Ich verschlüssele mein Passwort momentan mit MD5. Ich habe aber zufällig gelesen, dass MD5 nicht mehr sehr sicher sei, wegen Rainbowtabels oder so...

                        Jetzt habe ich mir überlegt die MD5 Verschlüsselung durch ein hash mit salt zu ersetzten. Meine Frage dazu lautet: ist es sinnvoll für jedes Passwort einen eigenen salt zu generieren ? und wie ? sah256 ? oder befinde ich mich hier total auf dem Holzweg ? und were es sinnvoll auch peper zu verwenden ?

                        So da sind jetzt doch ein paar Fragen zusammengekommen

                        LG

                        Kommentar


                        • #13
                          Ich habe aber zufällig gelesen, dass MD5 nicht mehr sehr sicher sei
                          Derzeit ist MD5 nur bezüglich der Kollisions-Angriffe gebrochen. Deswegen besteht noch keine akute Gefahr für Passwörter, die als MD5-Hash gespeichert wurden. Diese Kollisionen sind eher eine Gefahr für digitale Signaturen. Zum sicheren Speichern von Passwörtern sollten aber auch Algorithmen in Betracht gezogen werden, die speziell für diesen Zweck entwickelt wurden, z. B. bcrypt.
                          Das Problem besteht aber auch vorallem darin, dass man Datenbanken mit Millionen von gespeicherten MD5-Hashs auf Google findet.


                          Jetzt habe ich mir überlegt die MD5 Verschlüsselung durch ein hash mit salt zu ersetzten.
                          MD5 ist keine Verschlüsselung, es ist ein Hashverfahren.
                          Message-Digest Algorithm 5 (MD5) ist eine weit verbreitete kryptographische Hashfunktion, die aus einer beliebigen Nachricht einen 128-Bit-Hashwert (Prüfsumme) erzeugt.
                          Deshalb sind derzeit oft neuere Hashalgo's in Verwendung (http://php.net/manual/en/function.hash-algos.php) - sehr oft sha256. Da man aber nicht nur das reine Passwort hashen möchte und somit deinen genannten Rainbowtables verfallen könnte verwendet man oftmals Script- und Benutzersalt (Einmal in Datenbank und einmal im Script). Man baut also einen im Script definierten String und einen individuellen String für jeden Benutzer in den zu hashenden String ein.

                          Kommentar

                          Lädt...
                          X