was ist sicherer/besser ?

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

  • was ist sicherer/besser ?

    hallo,

    was ist als code sicherer und/oder besser ? :

    PHP-Code:
    $eintrag "insert into tabelle (`id`, `alpha`, `bata`, `gamma`) 
    values ('', '" 
    .  $_POST['alpha'] . "', '" .  $_POST['beta'] . "',
     '" 
    .  $_POST['gamma'] . "')"
    oder

    PHP-Code:
    $alpha $_POST['alpha'];
    $beta $_POST['beta'];
    $gamma $_POST['gamma']; 

    $eintrag "insert into tabelle (`id`, `alpha`, `bata`, `gamma`) 
    values ('', 
    $alpha$beta$gamma)"
    ?

    viele grüße, skys
    Zuletzt geändert von skys; 24.02.2008, 08:07.

  • #2
    Beide Varianten setzen ja die Requestvariablen einfach nur in deine Query ein. Letztlich kommen beide Möglichkeiten zum selben Endergebnis, welches nicht besonders sicher ist.
    Wenn es dein Webserver zulässt, dann benutz doch PDO. Dort kann man auf einfache Weise Datenbankanfragen sicher übergeben und ausführen.

    Auf http://www.php.net/manual/de/ref.pdo.php ist das sehr gut dokumentiert.

    Kommentar


    • #3
      hm, beides nicht so sicher ?

      habe mir den link angesehen und auch schon einen teil gelesen - mir scheint, das ist etwas ähnliches wie zend oder gehört dazu ?
      auch scheinen dann wieder neue und andere befehle wie bei php nötig zu sein ?
      eigentlich wollte ich php lernen und ich denke, auch wenn ich so etwas nutze, käme ich nicht wirklich drumherum php zu lernen bzw kann es ohnehin vielleicht erst dann korrekt einsetzen, wenn die ich php-grundlagen einigermaßen könnte ? und letztere fehlen mir ja leider noch.

      was ich da so vor mich hincodel ist zum glück nichts größeres oder sehr öffentliches - es ist nur für ein paar freiwillige helferchen und zwecks besserer organisation (falls es denn mal klappen sollte).
      allerdings hätte ich schon nichts dagegen, wenn es wenigstens vom code her korrekt und einigermaßen sicher wäre... mal sehen.
      ich les dort noch etwas, vielleicht geht mir ja noch ein stern auf...

      Kommentar


      • #4
        PHP-Code:
        function sqlstr(&$addr){
         if(isset(
        $addr)){return mysql_real_escape_string($addr);}
         return 
        "";
        }
        $eintrag "INSERT INTO tabelle (id, alpha, bata, gamma) 
        VALUES('', '" 
        .  sqlstr($_POST['alpha']) . "', '" .  sqlstr($_POST['beta']) . "',
         '" 
        .  sqlstr($_POST['gamma']) . "')"
        So sollte es relativ sicher sein und ausserdem keine undefined indexes fehler geben. Deine erste Variante unten war übrigens etwas sicherer, da du dort einfache " ' " benutzt hast.

        Kommentar


        • #5
          vielen herzlichen dank jmc !

          den ersten teil deines codes verstehe ich noch nicht (noch nachlesen muß und hoffe, er funktioniert bei mir auch g).
          auf jeden fall aber schon etwas beruhigend

          danke und viele grüße, skys

          Kommentar


          • #6
            Ob die Variablen gesetzt sind, sollte vor dem Absetzen einer Query überprüft werden, so dass eine Query voller leerer Werte gar nicht erst abgesetzt wird!
            Funktioniert das mit der Referenz und isset überhaupt?

            Kommentar


            • #7
              Hallo skys,

              sicherer auf jedem fall mit mysql_real_escape_string

              In deinem Fall würde ich das so schreiben:
              PHP-Code:
              $alpha mysql_real_escape_string($_POST['alpha']);
              $beta  mysql_real_escape_string($_POST['beta']);
              $gamma mysql_real_escape_string($_POST['gamma']); 
              4cms.de

              Kommentar


              • #8
                Mal ne Frage dazu. Wenn man
                PHP-Code:
                mysql_real_escape_string 
                nutzt,wäre es da nicht auch angebracht mittels einer erstellten info.php zu erfahren ob beimprovider magic quotes auf on oder off gestellt ist?
                Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
                http://www.lit-web.de

                Kommentar


                • #9
                  Magic Quotes sollte man einfach direkt per .htaccess-Datei auf off stellen.
                  Existiert ab php6 eh nicht mehr.

                  Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                  bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                  Wie man Fragen richtig stellt

                  Kommentar


                  • #10
                    hallo,

                    kontrollfrage, ob ich es richtig verstanden habe :
                    if(isset($addr)){return mysql_real_escape_string($addr);}
                    return "";
                    könnte man so übersetzen :
                    existiert die für sql zurechtgemachte variable addr bzw ist sie nicht leer, dann weiter, sonst leere felder ausgeben ?

                    und während mysql_real_escape_string die eingaben in einem formular nur für einen sql-query brauchbar machen, ist aber der if-teil hier drüber für die sicherheit wichtig ?

                    und ersetzt es im prinzip dieses ? :
                    if ($_POST['hiddenstring'] != '')
                    { // wenn die post-variable nicht leer ist
                    mysql_close($connect);
                    header("Location: eintragen.php");
                    } else
                    { // die post-variable ist leer - also formular ausgeben
                    ...formular...
                    }

                    @ php desaster
                    Ob die Variablen gesetzt sind, sollte vor dem Absetzen einer Query überprüft werden, so dass eine Query voller leerer Werte gar nicht erst abgesetzt wird!
                    meinst du damit das von butschy ? :
                    $alpha = mysql_real_escape_string($_POST['alpha']);

                    Funktioniert das mit der Referenz und isset überhaupt?
                    keine ahnung was du damit meinst, falls du mich meintest

                    dann steht über magic quotes zwar etwas im manual, aber für mich noch chinesisch. ist das für mich auch relevant/sinnvoll ?
                    (aber ich vermute, das ist bei mir eh off, sonst gäbe es fehler, oder ?)

                    danke und viele grüße, skys
                    Zuletzt geändert von skys; 25.02.2008, 10:14.

                    Kommentar


                    • #11
                      @ php desaster
                      meinst du damit das von butschy ? :
                      $alpha = mysql_real_escape_string($_POST['alpha']);
                      Nein, ich meine sowas:
                      PHP-Code:
                      if( isset( $_POST['alpha'] ) ) {
                          
                      $query "...";
                          
                      // ...
                      }
                      else {
                          
                      // Da fehlt noch was!

                      dann steht über magic quotes zwar etwas im manual, aber für mich noch chinesisch. ist das für mich auch relevant/sinnvoll ?
                      (aber ich vermute, das ist bei mir eh off, sonst gäbe es fehler, oder ?)
                      Am besten ist es - wie ghostgambler schon sagte - die Einstellung einfach auf off zu stellen. Ansonsten würdest du vor Eingabewerten wie " oder \ ein \ bekommen.

                      Kommentar


                      • #12
                        nun warst du schneller als mein ps :

                        ist bzgl der automatisch erzeugten id und der zeit einer formulareingabe ebenfalls mysql_real_escape_string nötig ?
                        da bei beiden kein eingabefeld existiert, dürfte es doch auch keine möglichkeit geben, da etwas einzuschleusen (auch keine get-methode).
                        denke da an dieses beispiel :

                        PHP-Code:
                        $beta  mysql_real_escape_string($_POST['beta']);
                        function 
                        sqlstr(&$addr)
                        {
                         if(isset(
                        $addr)){return mysql_real_escape_string($addr);}
                         return 
                        "";
                        }
                        $eintrag "INSERT INTO tabelle (id, beta, zeit) 
                        VALUES ('', '" 
                        .  sqlstr($_POST['beta']) . "', '" time() . "')";
                        $eintragen mysql_query($eintrag)or die(__LINE__ .':'mysql_error()); 
                        müßte so dann alles stimmen, oder ?


                        bzgl deiner antwort schon mal danke, gleich nochmal abchecke *in einem haufen testdateien sitze und am sortieren bin*

                        viele grüße, skys

                        Kommentar


                        • #13
                          Deine Frage verstehe ich ehrlich gesagt nicht ganz. Ich nehme an, du meinst das Weiterreichen der Daten über ein Hidden-Field? Dort musst du trotzdem escapen. Merk dir einfach, dass du alle Daten, die von Außen kommen, potentiell böse sind und entsprechend behandelt werden müssen.

                          Wenn du sowas hast wie in deinem Beispiel grad mit der Insert-Query, dann kannst du die id auch aus der Query herauslassen, damit der nächste auto_increment-Wert verwendet wird. Also:
                          PHP-Code:
                          $eintrag "INSERT INTO tabelle (beta, zeit) 
                          VALUES ('" 
                          .  sqlstr($_POST['beta']) . "', '" time() . "')"
                          Für die Zeit in Datenbanken verwendest du auch bitte keinen Unix-Timestamp, wie time() ihn dir liefert, sondern einen Zeittypen der Datenbank. In Kombination mit der DateTime-Klasse in PHP ein unschlagbares Team!
                          EDIT:
                          Für PHP-Versionen ohne DateTime kannst du auch mal im Zend-Framework nachsehen

                          Kommentar


                          • #14
                            Deine Frage verstehe ich ehrlich gesagt nicht ganz. Ich nehme an, du meinst das Weiterreichen der Daten über ein Hidden-Field?
                            ja, ich glaube, genau das meinte ich

                            Dort musst du trotzdem escapen. Merk dir einfach, dass du alle Daten, die von Außen kommen, potentiell böse sind und entsprechend behandelt werden müssen.
                            genau. und da ich kein id und keine zeit eingebe, sondern das php alleine in die db schreibt, dachte ich, das käme gar nicht von außen.

                            dh, ich kann alle ids in den INSERT-queries und bei VALUES rausnehmen ?
                            wär ja prima, hatte die immer mit drin (db hatte dann ebenfalls einfach auto mitgezählt)

                            bzgl zeittypen etc mache ich einen extra thread auf, da mir schon wieder ein arm voller fragen dazu einfällt
                            (diverse zeitformate ausgeben geht, aber du meintest ja das speichern.)
                            trotzdem schon mal danke für den tip, daß es auch anders + besser geht

                            viele grüße, skys

                            *vergessen :
                            wollte doch noch fragen, ob dies beides gleich sicher/gut ist :

                            PHP-Code:
                            $eintrag "INSERT INTO tabelle (id, beta, zeit)
                            VALUES('', '" 
                            .  sqlstr($_POST['beta']) . "', '" time() . "')";
                            $eintragen mysql_query($eintrag)or die(__LINE__ .':'mysql_error()); 
                            und
                            PHP-Code:
                            mysql_query("INSERT INTO tabelle (`id` , `beta` , `zeit`)
                            VALUES ('', '" 
                            .  $_POST['beta'] . "', '" time() . "')"); 
                            nu hab ich alles g
                            Zuletzt geändert von skys; 25.02.2008, 11:01.

                            Kommentar


                            • #15
                              wollte doch noch fragen, ob dies beides gleich sicher/gut ist :
                              Nein, da du bei der zweiten Abfrage kein Escaping vornimmst!

                              Kommentar

                              Lädt...
                              X