Robert B.: PHP: Bedingung wird nie erfüllt

Beitrag lesen

Moin Yadgar,

Damit im Auswahlmenü das der übernommenden Indexzahl aus STICHWORT (also STICHWORT_DATUM.stichwoerter_nr) entsprechende Stichwort im Klartext anzeigt wird, schicke ich folgende Query ab:

$sql3 = "SELECT STICHWOERTER.stichwort FROM STICHWOERTER, STICHWORT_DATUM WHERE STICHWORT_DATUM.stichwoerter_nr = STICHWOERTER.nr AND STICHWORT_DATUM.nr = '".$req."'";

$req nimmt hier den Wert von $_GET["edit"] auf.

Das ist so keine gute Idee, weil das eine astreine SQL-Injection-Lücke ist. Man braucht dein Script nur mit dem URL-Parameter ?edit=' or ''=' aufrufen und es wird einfach mal alles SELECTiert. Du möchtest Escaping oder besser prepared statements verwenden!

Der komplette relevante Code sieht so aus:

<?php
// …

  while($zeile1 = $res1->fetch_array()) 
  {
    if ($zeile1[0] == $_GET["edit"])
    {
       $entry2 = $zeile1[1]; // vorselektierter Eintrag für Datum
      break;
    }
  }

// …

  $entry1 = $res3->fetch_array(); // Eintrag für Stichwort im Auswahlmenü
}

// …

?>

<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="POST">
	Stichwort:<br>

Das Stichwort möchte wohl ein label sein.

  <select name="stichwort">
    <?php
      $zusatz="";
      while ($zeile2 = $res2->fetch_array())
      {
        if (!empty($_GET["edit"]) && $zeile2[0] == $entry1)
        {
          echo "Bedingung erfüllt!<br>"; // Kontrollausgabe
          $zusatz = " selected";
        }
        echo "<option".$zusatz.">".$zeile2[0]."</option>\n";
      }
    ?>
  </select><br>
  • Wenn die Bedingung einmal erfüllt ist, wird $zusatz gesetzt, es wird aber nie zurückgesetzt, falls die Bedingung nicht mehr erfüllt ist.
  • $zeile2[0] ist vermutlich ein Skalar, $entry1 ist ein Array.
  • $zeile2[0] wird unbehandelt in den HTML-Kontext gesetzt. Damit besteht die Gefahr von Cross Site Scripting.

⇒ Du möchtest dich mit dem Thema Kontextwechsel beschäftigen.

  Datum<br>

  <?php
    echo '<input type="text" name="datum" size="10" value="'.$entry2.'">';
  ?>

$entry2 wird unbehandelt in den HTML-Kontext gesetzt. Damit besteht die Gefahr von Cross Site Scripting.

Die Kontrollausgabe von $entry1 zeigt den korrekten String... aber trotzdem wird die Bedingung (!empty($_GET["edit"]) && $zeile2[0] == $entry1) nie erfüllt! Warum?

Vermutlich ist der Vergleich eines Skalars mit einem Array false.

Viele Grüße
Robert