Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Probleme mit isset/NULL/leeren Strings

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Probleme mit isset/NULL/leeren Strings

    Heya,

    ich habe derzeit ein Problem mit dem Umgang mit "leeren" Datenbankfeldern.

    Derzeit benutze ich den Ausdruck
    if (isset($currententry['reviewen3name'])

    Das funktioniert auch, zumindest solange, wie ich die Einträge in der Datenbank manuell eingetragen habe. Das heisst die leeren Felder weiterhin auf NULL stehen.

    Sobald ich allerdings eine Variable an die Datenbank schicke (auch wenn diese leer ist), dann wird der eintrag von NULL auf einen leeren String gesetzt (oder auf 0 im Falle von Integer).

    Meine Frage ist nun, wie ich entweder vermeiden kann, das dieser NULL Wert mit "nichts" überschrieben wird, zumal sich da bei mir ein ganzer Batzen an variablen angesammelt hat und ich nicht weiss, ob es so clever ist da jede einzelne zu "bearbeiten", oder ob es da eine (einfache) möglichkeit gibt, den isset Befehl irgendwie soweit auszudehnen, dass er auch prüft ob die Variable einen "realen" wert hat.

    Hier noch ein Code Schnipsel zum Eintrag in die DB:
    PHP-Code:
        if (isset($_GET["edit"])) 
        {
           
    $edit $_GET["edit"];
        echo 
    $edit;
        }
        if (
    $edit== "delete")
        {
        
    $object $_GET["object"];
        
    $command="DELETE FROM movies WHERE object_ID=$object";
        
    $bool=mysql_query($command);
        if(
    $bool==1) echo "<center><b>DELETED</b></center>";
        if(
    $bool<>1) echo "<SCRIPT LANGUAGE=JavaScript>window.alert('Error while deleting')</SCRIPT>";    
        }

        if (
    $edit== "insert")
        {
        
    $name_de $_GET["name_de"];
        
    $name_en $_GET["name_en"];
        
    $genre_de $_GET["genre_de"];
        
    $genre_en $_GET["genre_en"];
        
    $releasedate $_GET["releasedate"]; 
        
    $amazonde $_GET["amazonde"];
        
    $amazoncouk $_GET["amazoncouk"];
        
    $amazonus $_GET["amazonus"];
        
    $titledir $_GET["titledir"];

        
    $reviewde1name $_GET["reviewde1name"];
        
    $reviewde1link $_GET["reviewde1link"];
        
    $reviewde1rating $_GET["reviewde1rating"];

        
    $reviewde2name $_GET["reviewde2name"];
        
    $reviewde2link $_GET["reviewde2link"];
        
    $reviewde2rating $_GET["reviewde2rating"];

        
    $reviewde3name $_GET["reviewde3name"];
        
    $reviewde3link $_GET["reviewde3link"];
        
    $reviewde3rating $_GET["reviewde3rating"];    

        
    $reviewen1name $_GET["reviewen1name"];
        
    $reviewen1link $_GET["reviewen1link"];
        
    $reviewen1rating $_GET["reviewen1rating"];

        
    $reviewen2name $_GET["reviewen2name"];
        
    $reviewen2link $_GET["reviewen2link"];
        
    $reviewen2rating $_GET["reviewen2rating"];
        
        
    $reviewen3name $_GET["reviewen3name"];
        
    $reviewen3link $_GET["reviewen3link"];
        
    $reviewen3rating $_GET["reviewen3rating"];


        
    $command="INSERT INTO movies (
        name_de,name_en,
        genre_de,genre_en,
        releasedate,
        titledir,
        amazon_de,amazon_couk,amazon_com,
        reviewde1name,reviewde1link,reviewde1rating,
        reviewde2name,reviewde2link,reviewde2rating,
        reviewde3name,reviewde3link,reviewde3rating,
        reviewen1name,reviewen1link,reviewen1rating,
        reviewen2name,reviewen2link,reviewen2rating,
        reviewen3name,reviewen3link,reviewen3rating
        ) VALUES (
        '
    $name_de','$name_en',
        '
    $genre_de','$genre_en',
        '
    $releasedate',
        '
    $titledir',
        '
    $amazonde','$amazoncouk','$amazonus',
        '
    $reviewde1name','$reviewde1link','$reviewde1rating',
        '
    $reviewde2name','$reviewde2link','$reviewde2rating',
        '
    $reviewde3name','$reviewde3link','$reviewde3rating',
        '
    $reviewen1name','$reviewen1link','$reviewen1rating',
        '
    $reviewen2name','$reviewen2link','$reviewen2rating',
        '
    $reviewen3name','$reviewen3link','$reviewen3rating'

        )"
    ;
        
    $bool=mysql_query($command);
        if(
    $bool==1) echo "<center><b>INSERTED</b></center>";
        if(
    $bool<>1) echo "<SCRIPT LANGUAGE=JavaScript>window.alert('Error while inserting')</SCRIPT>";    
        
        } 
    Relevant sind, wie man dem ersten Code Schnipsel entnehmen kann vor allem die Variablen reviewXYZname.


  • #2
    Code:
    if (isset($var) && trim($var) != '') {
      // ...
    }
    Sowas?
    http://hallophp.de

    Kommentar


    • #3
      Das Ding nun 20 mal zu ergänzen hat zwar gerade ein wenig gedauert, aber es funktioniert perfekt. Vielen Dank!

      Kommentar


      • #4
        Code:
            $object = $_GET["object"];
            $command="DELETE FROM movies WHERE object_ID=$object";
        Kann böse enden, da kann jeder alle Einträge auf einen hui aus der Datenbank löschen...
        Signatur:
        PHP-Code:
        $s '0048656c6c6f20576f726c64';
        while(
        $i=substr($s=substr($s,2),0,2))echo"&#x00$i;"

        Kommentar


        • #5
          Inwiefern?

          Davon abgesehen habe ich hier nicht den gesamten Code gepastet, sondern nur das, was ich für relevant gehalten habe.
          Um die ganze Geschichte ist zB noch ein
          if ($context['user']['is_admin'])
          drumrum. Aber klär mich bitte auf, wenn ich da was übersehe.

          Kommentar


          • #6
            Code:
                $object = $_GET["object"];
                $command="DELETE FROM movies WHERE object_ID=$object";
            xxx.php?object=1 OR 1=1
            => DELETE FROM movies WHERE object_ID=1 OR 1=1
            Der 1=1 Teil stimmt immer, dadruch wird das Query auf jeden datensatz angewendet.

            Das mit dem Adminbereich mag sein, aber stell dir vor du bist bei deiner Seite eingeloggt und
            jemand stellt hier ein Bild rein mit der URL: http://example.com/xxx.php?object=1 OR 1=1 und dann führt dein Browser die Anfrage aus.
            Außerdem sollte man auch den Adminbereich sicher machen und nicht nach dem Motto: "Da kommt eh keiner hin!" dort die Sicherheit vergessen...

            Cross-Site Request Forgery – Wikipedia
            Signatur:
            PHP-Code:
            $s '0048656c6c6f20576f726c64';
            while(
            $i=substr($s=substr($s,2),0,2))echo"&#x00$i;"

            Kommentar


            • #7
              Wie wird es denn richtig gemacht?

              Sollte man da vielleicht vorher $object checken ob es sich hierbei um einen Integer handelt oder etwas ähnliches?

              Kommentar


              • #8
                PHP: mysql_real_escape_string - Manual

                Und wenn du nen Integer erwartest kannst natürlich ganz einfach gucken ob in dem $_GET['object'] auch wirklich nur Zahlen drinn sind...
                Signatur:
                PHP-Code:
                $s '0048656c6c6f20576f726c64';
                while(
                $i=substr($s=substr($s,2),0,2))echo"&#x00$i;"

                Kommentar


                • #9
                  Also wenn ichs richtig verstehe reicht jetzt ein einfaches

                  $object=mysql_real_escape_string($object);

                  bevor ich

                  $command="DELETE FROM movies WHERE object_ID=$object";

                  nutze, um einen etwaigen Angriff unschädlich zu machen?

                  Kommentar


                  • #10
                    Nein, das reicht nicht. mysql_real_escape_string ist für den Kontext INT nicht geeignet. Das habe ich schon x-fach hier im Board erklärt.
                    --

                    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                    --

                    Kommentar


                    • #11
                      Ich denke
                      $object=(int)$object;
                      sollte aber dann doch alles abtöten. ^^

                      Kommentar


                      • #12
                        Naja, haste ja oben nicht geschrieben
                        --

                        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                        Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                        --

                        Kommentar


                        • #13
                          Zitat von nikosch Beitrag anzeigen
                          Nein, das reicht nicht. mysql_real_escape_string ist für den Kontext INT nicht geeignet. Das habe ich schon x-fach hier im Board erklärt.
                          Wenn ein Wert per $_GET oder $_POST reinkommt, dann sind es doch Grundsätzlich strings, oder irre ich mich ?
                          Signatur:
                          PHP-Code:
                          $s '0048656c6c6f20576f726c64';
                          while(
                          $i=substr($s=substr($s,2),0,2))echo"&#x00$i;"

                          Kommentar


                          • #14
                            für den Kontext INT
                            Es geht nicht darum, was rein kommt, sondern in welche Form es zu überführen ist. Eine Kontrolle über den Eingangsdatentyp hast Du nicht.
                            --

                            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                            Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                            --

                            Kommentar

                            Lädt...
                            X