Tangotänzerin: Sicherheit in Formularen

Hallo und guten Abend allerseits,

konnte im Netz keine Antwort finden, aber vielleicht habt Ihr einen Rat für mich. Es geht um folgendes:

Ich erstelle ein Formular in HTML.
Auswerten möchte ich es mit PHP und zwar in der Zeile 1 des Formulars
<form action="[code lang=php]<?php if(isset($_POST['liste'])){include("db.php");$NR = $_POST['liste'];$del= "DELETE FROM TEST WHERE id= '".$NR."' ";$del = mysql_query($del, $connection);}?>" method="post">[/code]

das funktioniert auch, aber meine Frage lautet gibt es hierfür Sicherheitsbedenken, da z. B. Name der Datenbank-Datei angegegeben ist und wenn auch nur in PHP??? Wäre es besser für ... action=... eine separate Datei anzulegen?

Danke schon mal für Eure Kommentare und beste Grüße
Tangotänzerin

  1. Hi!

    <form action="[code lang=php]<?php if(isset($_POST['liste'])){include("db.php");$NR = $_POST['liste'];$del= "DELETE FROM TEST WHERE id= '".$NR."' ";$del = mysql_query($del, $connection);}?>" method="post">[/code]

    Formatier das doch mal so, dass man das lesen kann - das wäre wichtiger als die Farbunterstützung des Forums zu verwenden.

    <form action="<?php
      if(isset($_POST['liste'])){
        include("db.php");
        $NR = $_POST['liste'];
        $del= "DELETE FROM TEST WHERE id= '".$NR."' ";
        $del = mysql_query($del, $connection);}
    ?>" method="post">

    das funktioniert auch,

    Wenn du im action-Attribut nichts stehen haben willst, solltest du das so notieren, dass das eindeutig ist und nciht irgendwelchen PHP-Code darein verstecken. Strukturiere am besten nach dem EVA-Prinzip (Eingabe, Verarbeitung, Ausgabe). Erst Daten sammeln, dass die Ausgabe in einem Block.

    aber meine Frage lautet gibt es hierfür Sicherheitsbedenken,

    Natürlich. Wieder mal den Kontextwechsel nicht beachtet. (Und ein sinnloses Umkopieren von $_POST['liste'] nach $NR.)

    da z. B. Name der Datenbank-Datei angegegeben ist und wenn auch nur in PHP???

    Welche Bedenken hast du denn und welche Datenbank-Datei meinst du? Du fragst einen MySQL-Server, der für dihc eine Blackbox ist. Wie der seine Daten verwaltet und ob der dazu Dateien nimmt, ist für dich nicht von Belang. Da du eine SQL-Injection-Lücke mit DELETE eingebaut hast, kann man alle Daten der Tabelle löschen.

    Wäre es besser für ... action=... eine separate Datei anzulegen?

    Für welchen Anwendungsfall eigentlich? Was willst du mit dem Code im action-Attribut erreichen?

    Lo!

    1. Moin!

      <form action="<?php
        if(isset($_POST['liste'])){
          include("db.php");
          $NR = $_POST['liste'];
          $del= "DELETE FROM TEST WHERE id= '".$NR."' ";
          $del = mysql_query($del, $connection);}
      ?>" method="post">

      Fein. Ich baue ein Formular mit:

      <form method="POST" action="http://DeinServer/DeinSkript.php">  
      <input type="text" name="liste" value="1' OR id > '0" />  
      </form>
      

      und sende dieses ab. (Glaube nicht, dass dies nicht geht oder zu verhindern ist ...)

      Dann steht in $del:

      DELETE FROM TEST WHERE id= '1' OR id > '0'

      Damit dürfte Deine Tabelle überraschend schnell leer sein und Du meinst dann zwar ich sei ganz BÖSE, kannst aber nicht mal wissen oder beweisen dass ich es war.

      Wenn Du eine Zahl erwartest, dann solltest Du die Eingaben entgiften in dem Du nur eine Zahl benutzt. intval() und floatval() sind dann Deine Freunde. Erwartest Du einen String dann solltest Du diesen wenigstens mit mysql_real_escape_string() behandeln.

      $del= "DELETE FROM TEST WHERE id= '".intval($_POST['liste'])."'";

      dürfte das sein sein, was Du hier notieren willst.

      MFFG (Mit freundlich- friedfertigem Grinsen)

      fastix

      1. Hallo!

        Fein. Ich baue ein Formular mit:

        <form method="POST" action="http://DeinServer/DeinSkript.php">

        <input type="text" name="liste" value="1' OR id > '0" />
        </form>

        
        >   
        > und sende dieses ab. (Glaube nicht, dass dies nicht geht oder zu verhindern ist ...)  
          
        Klar das geht, aber lohnt der Aufwand für die paar Zeilen extra eine neue Datei anzulegen? Warum ist diese (Deine) Vorgehensweise sinnvoll oder sinnvoller????  
          
        Viele Grüße  
        Tangotänzerin
        
        1. Hi,

          <input type="text" name="liste" value="1' OR id > '0" />

          und sende dieses ab. (Glaube nicht, dass dies nicht geht oder zu verhindern ist ...)

          Klar das geht, aber lohnt der Aufwand für die paar Zeilen extra eine neue Datei anzulegen?

          Hä? Von was für einer Datei redest du?

          Warum ist diese (Deine) Vorgehensweise sinnvoll oder sinnvoller????

          Sie ist nicht sinnvoll*er* als deine, sondern sinnvoll im *Gegensatz* zu deiner - weil jeder Nutzer bei deiner Version gleich alle Daten auf einmal löschen kann, wenn er will.

          Hast du dieses Argument überhaupt *verstanden*?

          MfG ChrisB

          --
          The most exciting phrase to hear in science, the one that heralds new discoveries, is not “Eureka!” but “That's funny...” [Isaac Asimov]
        2. 'ǝɯɐu$ ıɥ

          Klar das geht, aber lohnt der Aufwand für die paar Zeilen extra eine neue Datei anzulegen? Warum ist diese (Deine) Vorgehensweise sinnvoll oder sinnvoller????

          Wieso extra Datei? Googel mal nach Affenformular.

          ssnɹƃ
          ʍopɐɥs

          --
          I like children. If they're properly cooked.
          - W.C. Fields
        3. Moin!

          Klar das geht, aber lohnt der Aufwand für die paar Zeilen extra eine neue Datei anzulegen?

          Nicht zwingend, was ich vorhabe geht nämlich auch mit wget.

          Ich habe das so gemacht damit es das Publikum auch versteht und bin davon ausgegangen, dass die bisherige "Sicherheit" darin besteht, dass dort im Original ein SELECT steht und dass, wenn ich geschrieben hätte "dann trage ich eben [1' OR id > '0] in Dein Input-Feld ein" die nicht sinntragende Antwort gekommen wäre: "Ätsch, das ist eine SELECT-Box, das geht gar nicht."

          Womit wir dann wieder bei Zeile 1 angekommen wären, weil ich dann nochmals hätte antworten müssen: Dein Formular interessiert mich nicht, ich baue mir selbst eines oder sende gleich mit wget - und zwar was ich will. Ich bin nämlich ein böser und kein strunzdummer Angreifer.

          Warum ist diese (Deine) Vorgehensweise sinnvoll oder sinnvoller?

          Weil das
          $del= "DELETE FROM TEST WHERE id= '".intval($_POST['liste'])."'";
          Dein Sicherheitsloch verkleinert in dem es dort, wo nur eine ganze Zahl erwartet wird, auch nur eine ganze Zahl statt eine Erweiterung des gesamten Befehls zulässt.

          MFFG (Mit freundlich- friedfertigem Grinsen)

          fastix

          1. Hi,

            Weil das
            $del= "DELETE FROM TEST WHERE id= '".intval($_POST['liste'])."'";
            Dein Sicherheitsloch verkleinert

            aber nicht wesentlich verkleinert. Dann schickt man halt viele Requests mit jeweils unterschiedlichen Werten für "liste".

            cu,
            Andreas

            --
            Warum nennt sich Andreas hier MudGuard?
            O o ostern ...
            Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
            1. Hi!

              Weil das
              $del= "DELETE FROM TEST WHERE id= '".intval($_POST['liste'])."'";
              Dein Sicherheitsloch verkleinert
              aber nicht wesentlich verkleinert. Dann schickt man halt viele Requests mit jeweils unterschiedlichen Werten für "liste".

              Das ist kein SQL-Injection-Problem mehr. Die Berechtigung, wer was löschen darf, gehört zwar auch zum Thema Sicherheit, muss aber anderweitig geprüft werden.

              Lo!

              1. Hi,

                $del= "DELETE FROM TEST WHERE id= '".intval($_POST['liste'])."'";
                Dein Sicherheitsloch verkleinert
                aber nicht wesentlich verkleinert. Dann schickt man halt viele Requests mit jeweils unterschiedlichen Werten für "liste".

                Das ist kein SQL-Injection-Problem mehr.

                Hab ich ja auch nicht behauptet.

                cu,
                Andreas

                --
                Warum nennt sich Andreas hier MudGuard?
                O o ostern ...
                Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.