PHP: Bedingung wird nie erfüllt
bearbeitet von
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:
>
> ~~~php
> $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 `SELECT`iert. 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`](https://wiki.selfhtml.org/wiki/HTML/Elemente/label) sein.
> ~~~php
> <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](https://wiki.selfhtml.org/wiki/Programmiertechnik/Kontextwechsel) beschäftigen.
> ~~~php
> 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