Ankündigung

Einklappen
Keine Ankündigung bisher.

Variabel aus GET nicht als INT weitergeben

Einklappen

Neue Werbung 2019

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

  • Variabel aus GET nicht als INT weitergeben

    Hallo,

    ich hab leider nichts per SuFu gefunden, aber ich möchte nicht ausschließen, dass ich falsch suche. :/

    Ich habe folgendes Problem:
    ich möchte per userinput eine Eingabe in eine Variabel schreiben. ($
    Bezeichnung) Dann soll diese Variable per GET weitergegeben und für SQL verarbeitet werden. Beim späteren weiterverarbeiten in die SQL Datenbank kann ich nur Zahlen, aber keine Buchstaben übergeben. Ich vermute mal, dass ich noch etwas konvertieren muss, aber meine bisherigen Versuche schlugen dabei fehl.

    Die file mit dem Input:
    Code:
    $id = $_GET["id"];
    $sql = "SELECT id, Bezeichnung, CMDBstatus, model, sn FROM client WHERE id='$id'";
    $result = $conn->query($sql);
    if ($result->num_rows > 0) {
        // output data of each row
        while($row = $result->fetch_assoc()) {
      echo '<form action="clientdata_change_insert.php" method="get"><p>
         <label for="Bezeichnung">Bezeichnung: </label>
         <input type="text" name="Bezeichnung" id="Bezeichnung" value="' . $row["Bezeichnung"]. '"></p><input type="hidden" name="id" value="' . $id. '"><input type="submit" value="Submit"></form>';
        }
    } else {
        echo "0 results";
    }
    echo '</table>';
    Die File mit dem verarbeiten in die SQL:
    Code:
        $Bezeichnung = $_GET["Bezeichnung"];
       $id = $_GET["id"];
        // attempt insert query execution
        $sql = " UPDATE client SET Bezeichnung=$Bezeichnung WHERE id=$id ";
     if ($conn->query($sql) === TRUE) {
        echo 'Record updated successfully<br><a href="clientdata.php?id='  . $id. '">back</a>';
     } else {
        echo "Error updating record: " . $conn->error. '<br><a href="clientdata.php?id='  . $id. '">back</a>' ;
     }
    Ich hoffe ihr könnt mir helfen, vielen Dank schon mal im Vorraus!

    Liebe Grüße, Andy

  • #2
    Lass das erstmal mit der SQL-Injection (<-- Stichwort, suchen) wenn dir nicht einfach jemand deine Datenbank löschen soll. Du kannst das vor Verwendung konvertieren

    http://php.net/manual/de/language.ty...e-juggling.php
    [I]You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.[/I]

    Kommentar


    • #3
      Erstmal vielen Dank für die Antwort.

      Wenn ich dich richtig verstehe, möchtest du mich mit der "SQL-Injection" auf die Sicherheitslücke aufmerksam machen, die ich durch die GET Methode habe. Die Datenbank soll nur von intern erreichbar sein und wird niemals online gehen, aber vielen dank für den hinweis Zu dem Code:

      Code:
      $a    = 'car'; // $a is a string
      Dieses Prinzip müsste ich ja auch auf meine variabel anwenden

      Code:
      $Bezeichnung = $_GET["Bezeichnung"];
      aber wie deklariere ich das Ergebnis von GET codemäßig? vielleicht stehe ich auch einfach aufm schlauch..

      //edit:

      Code:
      $string = (string) $Bezeichnung;
      dahinter funktioniert auch nicht, aber vielleicht macht es das klarer was ich aussagen möchte

      Kommentar


      • #4
        GET dient dazu Daten abzufragen und nicht um Daten zu speichern. Für letzteres gibt es POST. Und Werte, die du in SQL-Code einfügst, musst du immer escapen. Die Sicherheit ist nur ein Nebeneffekt davon. Ohne Escaping ist der Code jedenfalls fehlerhaft.

        Kommentar


        • #5
          Wende dazu mysqli_real_escape_string.auf die einzutragenden Parameter an.
          Umwandeln machst du mit intval($id) oder (int) davor schreiben.

          Kommentar


          • #6
            Code:
              $Bezeichnung = $_POST["Bezeichnung"];
                string mysqli_real_escape_string ( mysqli $link , string $Bezeichnung );
            Code:
            Parse error: syntax error, unexpected 'mysqli_real_escape_string' (T_STRING)
            Wir schaffen das schon zusammen Könnt ihr mir mein Fehler sagen? Vielen Dank für die Geduld mit mir

            Kommentar


            • #7
              Schau noch mal ins Handbuch

              unten unter Examples

              Kommentar


              • #8
                hab ich gemacht und bin damit zu dieser Lösung gekommen:

                Code:
                    $Bezeichnung = $_POST["Bezeichnung"];
                    $Bezeichnungsql = mysqli_real_escape_string($link, $Bezeichnung);
                Code:
                 $sql = " UPDATE client SET Bezeichnung=$Bezeichnungsql WHERE id=$id ";
                aber auch hier:

                Code:
                Error updating record: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE id=1' at line 1

                Kommentar


                • #9
                  Strings werden bei SQL in Hochkomma geschrieben. Du solltest dich erstmal mit den SQL-Grundlagen vertraut machen, bevor du was mit PHP machst.

                  Kommentar


                  • #10
                    Code:
                    $sql = "UPDATE `clientv` SET `Bezeichnung`='" .  $Bezeichnungsql . "' WHERE `id`=" . $id;
                    sollte funktionieren. Schreibe Tabellen- und Spaltennamen besser immer mit Backtics drumherum.

                    Kommentar


                    • #11
                      Guten Morgen,

                      vielen dank für den Code und die Hinweise, ich hatte SQL/PHP vor längerer Zeit, doch bin leider zu sehr raus, aber es kommt nach und nach zurück merke ich. ;D

                      Der Code scheint mir absolut logisch, auch wenn ich ein paar Minuten brauchte um das sicher aussagen zu können. Nur leider funktioniert es nicht. :/

                      Code:
                      // Create connection
                      $conn = new mysqli($servername, $username, $password, $dbname);
                      // Check connection
                      if ($conn->connect_error) {
                          die("Connection failed: " . $conn->connect_error);
                      }
                          // Escape user inputs for security
                          //$Bezeichnung = $_POST["Bezeichnung"];
                          $Bezeichnungsql = mysqli_real_escape_string($conn, $_POST['Bezeichnung']);
                          $CMDBstatus = $_POST["CMDBstatus"];
                          $model = $_POST["model"];
                          $sn = $_POST["sn"];
                         $id = $_POST["id"];
                          // attempt insert query execution
                          $sql = "UPDATE `client` SET `Bezeichnung`='" .  $Bezeichnungsql . "' WHERE `id`=" . $id;
                       if ($conn->query($sql) === TRUE) {
                          echo 'Record updated successfully<br><a href="clientdata.php?id='  . $id. '">back</a>';
                       } else {
                          echo "Error updating record: " . $conn->error. '<br><a href="clientdata.php?id='  . $id. '">back</a>' ;
                       }
                      
                       $conn->close();
                      Ich bekomme zwar keine Fehlermeldung, sondern "'Record updated successfully", aber an der Tabelle verändert sich nichts. Sprich: php sagt Ok, SQL sagt: hier kommt nichts an.

                      //edit:
                      http://b2b.myidle.eu/CMDB/

                      Kommentar


                      • #12
                        Dann lass dir doch mal die Abfrage mit var_dump ausgeben und probiere diese in der DB direkt aus.

                        PHP-Code:
                        $sql "UPDATE `client` SET `Bezeichnung`='" $Bezeichnungsql "' WHERE `id`=" $id;
                        var_dump($sql); 
                        Auch hier muss maskiert werden,
                        PHP-Code:
                        $id $_POST["id"]; 
                        Das blosse umkopieren ist natürlich nicht nötig, da du während der gesamten Scriptlaufzeit auf $_POST[] zugreifen kannst,
                        ausserdem willst du doch eine ID vergleichen, also eine Zahl.
                        PHP-Code:
                        $id = (int) $_POST["id"]; 
                        Du prüfst auch nicht ob die Parameter überhaupt gesetzt sind, Das macht man mit isset().

                        Kommentar


                        • #13
                          Bei mir funktioniert nun alles, vielen dank!

                          Das Thema kann geschlossen werden.

                          Kommentar

                          Lädt...
                          X