Frage zum Thema Sicherheit (PHP+HTML)

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

  • Frage zum Thema Sicherheit (PHP+HTML)

    heute steh ich irgendwie aufm schlauch. mir ist heute was aufgefallen und ich wollte fragen, ob das sogar eine sicherheitslücke sein kann.

    mal angenommen man hat ein skript ungefähr in der art:

    <HTML>
    <HEAD>
    </HEAD>
    <BODY>

    <FORM NAME="anmeldeformular" ACTION="eintragen.php" METHOD=POST>
    <input type="checkbox" name="bereich[]" value="Sport">&nbsp;Sport<br>
    <input type="checkbox" name="bereich[]" value="Kultur">&nbsp;Kultur<br>
    <input type="checkbox" name="bereich[]" value="Freizeit">&nbsp;Freizeit<br>
    <input type="checkbox" name="bereich[]" value="Soziales">&nbsp;Soziales<br>
    <input type="checkbox" name="bereich[]" value="Gesundheit">&nbsp;Gesundheit<br>
    <input type="checkbox" name="bereich[]" value="Schule">&nbsp;Schule<br>
    <input type="checkbox" name="bereich[]" value="Umwelt">&nbsp;Umwelt<br>
    <INPUT TYPE=SUBMIT NAME="button" VALUE="Absenden" ID="button">
    </FORM>

    </BODY>
    </HTML>

    Der dazugehörige PHP-Code wäre:

    <?php

    include("db_connect.php");

    $bereich1 = $_POST["bereich"];

    $bereich2 = implode ("<br><br>", $bereich1);
    $eintrag = "INSERT INTO ehrenamtswegweiser (bereich1) VALUES ('$bereich2')";
    $eintragen = mysql_query($eintrag);

    if($eintragen == true)
    {
    echo "Ihre Tätigkeitsbereiche wurden erfolgreich in die Datenbank eingetragen";
    }
    else
    {
    echo "Fehler beim Speichern der Tätigkeitsbereiche.";
    }
    ?>

    Also kurz gesagt: Man wählt checkboxen aus und die werden dann einfach jeweils durch <br> getrennt in die datenbank geschrieben. so jetzt meine frage. mal angenommen irgendein freak kommt auf die idee die html datei offline zu speichern und modifiziert sie folgendermaßen:

    <HTML>
    <HEAD>
    </HEAD>
    <BODY>

    <FORM NAME="anmeldeformular" ACTION="eintragen.php" METHOD=POST>
    <input type="checkbox" name="bereich[]" value="Sport">&nbsp;Sport<br>
    <input type="checkbox" name="bereich[]" value="Kultur">&nbsp;Kultur<br>
    <input type="checkbox" name="bereich[]" value="Freizeit">&nbsp;Freizeit<br>
    <input type="checkbox" name="bereich[]" value="Soziales">&nbsp;Soziales<br>
    <input type="checkbox" name="bereich[]" value="Gesundheit">&nbsp;Gesundheit<br>
    <input type="checkbox" name="bereich[]" value="Schule">&nbsp;Schule<br>
    <input type="checkbox" name="bereich[]" value="Umwelt">&nbsp;Umwelt<br>
    [COLOR=tomato]<input type="checkbox" name="bereich[]" value="irgendetwasverbotenes">&nbsp;irgendetwasverbotenes<br>[/COLOR]

    <INPUT TYPE=SUBMIT NAME="button" VALUE="Absenden" ID="button">
    </FORM>

    </BODY>
    </HTML>

    mal angenommen er leitet nun das skript per action="www.blablabla.de/eintragen.php" direkt auch auf die eintragen.php. würde die eintragen.php nun auch die zeile

    [COLOR=tomato]<input type="checkbox" name="bereich[]" value="irgendetwasverbotenes">&nbsp;irgendetwasverbotenes<br>[/COLOR]

    mit dem verbotenen inhalt aus der offline html-datei in die mysql datenbank eintragen.

    sorry, ist ein wenig unverständlich aber ich hoffe ihr könnt mir dennoch helfen. (das problem hat mir 1 bier und 1 asperin gekostet ::'-( )

  • #2
    klar.

    Kommentar


    • #3
      ich hab mal versucht das problem zu lösen. komm aber derzeit nicht weiter. ich post erstmal den php code:

      PHP-Code:
      class namesoundso{

          function 
      check_formular($wertedescheckboxenarrays '')
          {
                  
      $erlaubtewerte= array('erlaubt''wert auch erlaubt');
                  foreach (
      $wertedescheckboxenarrays as $wert) {
                      if (!
      in_array($wert$erlaubtewerte)) {
                      throw new 
      Formularcheck_Exception('Du musst g&uuml;ltige Werte angeben.');
                      }
                  }


          
          }


      Ich les also das array mit den werten der checkboxen einzeln aus und überprüf mittels in_array ob der wert gültig ist. die gültigen werte stehen jeweils im array das $erlaubtewerte zugewisen ist.

      wie findet ihr den ansatz ?
      oder hättet ihr einen besseren vorschlag. ich will später die gesäuberten checkboxenwerte durch implode in eine datenbank eintragen, sodass ich sie mittels explode wieder herausholen kann.

      habt ihr da ne gute idee ?

      Kommentar


      • #4
        die string-werte haben auch nichts in der db zu suchen (aus

        a) db-design-,
        b) normalisierungs- und,
        c) speicherverbrauchgründen

        ). das formular übermittelt höchstens ihre id - sie ist ganzzahlig und lässt sich einfacher kontrollieren.

        Kommentar


        • #5
          öhm ja das klingt plausibel. ^^
          meinst du im stil von:

          $element[0] = 'eigenschaft 1';
          $element[1] = 'eigenschaft 2';
          .
          .
          .

          das man dann über die datenbank jeweils werte für $i speichert, sie mit explode voneinander trennt und jeweils in:

          echo $element[$i];

          einsetzt ?

          wenn es dir nicht allzuviel aufwand macht, kannste mir vllt. dies anhand eines simplen beispiels zeigen. ^^ wäre echt super.

          Kommentar


          • #6
            hat nicht direkt mit arrays zu tun.

            du brauchst zum einen eine tabelle, z.b. `items`

            Code:
            id   | item
            --------------------------
            1   | freizeit
            2   | fussball
            3   | whatever
            die checkboxen übermitteln nur die ids an php.

            die zuordnung sollte u.u. (aber auch im idealfall) auch auf der db-ebene erfolgen:

            tabelle `user`
            Code:
            id  | name
            ---------------------
            1  | foo
            2  | bar
            tabelle `zuordnung`
            Code:
            user_id | item_id
            -------------------------
            1  | 1
            1  | 2
            1  | 3
            2  | 2
            2  | 3 
            
            etc.
            beim hinzufügen neuer zuordnungen ist nun lediglich zu überprüfen, ob die übermittelte id in `items` vorhanden ist.

            Kommentar


            • #7
              verstehe. joa das ist ne gute lösung. und man ist flexibler, da man schnell neue items in die datenbank adden kann. danke, dass du dir die mühe gemacht hast für das beispiel. ist echt n super tipp.

              Kommentar


              • #8
                http://de.wikipedia.org/wiki/Normali...28Datenbank%29

                Kommentar


                • #9
                  ich hab das problem hinbekommen, ohne eine extra zuweisungstabelle. es geht auch so:

                  - man speichert das array mit den ids der checkboxen über implode in der datenbank

                  - nun list man den string aus der datenbank aus. und gliedert die ids wieder in ein array mittels explode.

                  PHP-Code:
                  $blub explode(', '$neusobj->ausgebendesarraysdasalsstringvorliegt());

                  #Blub ist danach ein array mit den ids der checkboxen

                  /* Im nächsten Schritt wird dann für jede id der zugehörige wert aus dem listenarray zugewiesen. der schritt erspart eine 2. tabelle. */

                  $liste = array('erlaubter wert''auch erlaubter wert');
                  foreach (
                  $blub as $value) {
                      echo 
                  $liste[$value];

                  wenn man die werte aus der liste bestimmten ids zuweisen will macht man halt ein ' asoziales' xD array im stil von:

                  PHP-Code:

                  $blub 
                  explode(', '$neusobj->ausgebendesarraysdasalsstringinderdatenbankvorliegt());

                  $liste  = array( 1     => Hans,
                                          
                  2     => Mustermann,
                                          
                  56   => 01.01.01,
                                          
                  13   => Musterstadt);

                  foreach (
                  $blub as $value) {
                      echo 
                  $liste[$value];

                  ich habs mal nur der vollständigkeitshalber mal gepostet

                  der vorteil ist der, dass du die eigenschaften eines users (arrayids) alle sofort im blick hast und auch dem entsprechend besser ändern kannst. ebenfalls sparst du dir eine weitere tabelle und hast dadurch mehr übersicht und struktur. aber jedem das seine. ich finde deine methode auch ansprechend. wie gesagt. ich habs nur zur vollständigkeit hier nochmal gepostet.
                  Zuletzt geändert von class.matze; 31.12.2005, 11:41.

                  Kommentar


                  • #10
                    der vorteil ist der, dass du die eigenschaften eines users (arrayids) alle sofort im blick hast und auch dem entsprechend besser ändern kannst
                    stimmt, wozu braucht man denn da noch datenbanken?
                    ebenfalls sparst du dir eine weitere tabelle
                    sparen? warum sparen?
                    und hast dadurch mehr übersicht und struktur
                    bedingt.

                    wichtig: brich bitte deinen code um, damit man nicht horizontal scrollen muss.

                    Kommentar


                    • #11
                      schwaben sind nunmal sparsam :P

                      Kommentar

                      Lädt...
                      X