dedlfix: Hilfe - SQL syntax

Beitrag lesen

Hi!

Ist das denn jetzt von eurer Seite so i.O.?

Von i.O. ist es meiner Meinung nach noch recht weit entfernt. Du hast immer noch nicht die Problematik des Kontextwechsels verstanden und so klaffen noch weitere Sicherheitslücken in deinem Code.

<form action="<?php echo $PHP_SELF; ?>" method="post">

$PHP_SELF existiert zum einen nur, wenn register_globals aktiv ist, was aber schon seit Jahren nicht mehr empfohlen wird. Zudem ist das unbehandelte Einfügen als Formularziel schon die erste Lücke. htmlspecialchars() zu verwenden ist das mindeste, $_SERVER['SCRIPT_NAME'] wäre eine weitere Möglichkeit. Du kannst aber auch einfach, problemlos und ohne Sicherheitsrisiko action="" notieren, um das Formular an sich selbst zu senden.

error_reporting(E_ALL);ini_set('display_errors', 1);

Das solltest du nur für das Entwickeln aktiviert haben. Im Produktivbetrieb will man Informationen zu Fehlern nicht an alle möglichen Besucher  rausgeben. Vielen werden sie nichts nützen und die anderen lesen daraus Informationen, die sie gegen dich verwenden können.

$conID = mysql_connect( $db_host, $db_user, $db_pass ) or die( "Momentan leider keine Verbindung zum Server. Wir bitten um Ihr Verstaendnis!" );
mysql_select_db( $db_name, $conID ) or die ( "Server Error. Wir bitten um Ihr Verstaendnis" );

"or die()" - schnell und schmerzhaft - gern genommen und meist keine akzeptable Art, auf Fehler zu reagieren. Was machen deine Kunden, wenn sie diesen Fehler sehen? Wirklich Verständnis haben oder zur Konkurrenz laufen (mal angenommen dass das eine Alternative wäre)?

if(isset($_POST["submitted"])) {
$_sql = "UPDATE FW_Fehlerbericht
SET M_NAME = '".$_POST["M_NAME"]."',
    SCHICHT = '".$_POST["SCHICHT"]."',
    ORT = '".$_POST["ORT"]."',
    KURZBESCHREIBUNG = '".$_POST["KURZBESCHREIBUNG"]."'
    WHERE ID = ".$_POST["ID"]."";
mysql_query($_sql,$conID);

Kontextwechsel beachten!

echo mysql_error();
echo "<pre>$_sql</pre>";

Was macht denn das hier noch?

$ergebnis = mysql_query( "SELECT * FROM FW_Fehlerbericht WHERE ID = ".intval($_GET["ID"]));

Wenigstens das ist einigermaßen in Ordnung.

echo mysql_error();
echo "<pre>$ergebnis</pre>";

Wenn ein Fehler auftritt, musst du den Programmablauf komplett ändern. "or die()" ist keine schöne Möglichkeit dazu.

while ( $datensatz = mysql_fetch_array( $ergebnis ) ) {

Aber einfach mit der Abfrage fortzufahren erzeugt nur Folgefehler.

$ID = $datensatz["ID"];
$M_NAME = $datensatz["M_NAME"];
$SCHICHT = $datensatz["SCHICHT"];
$ORT = $datensatz["ORT"];
$KURZBESCHREIBUNG = $datensatz["KURZBESCHREIBUNG"];

Hat diese Umkopiererei aus deiner Sicht einen Nutzen?

Datensatz Nr.:&nbsp;<?=$datensatz["ID"]?><p>
<td valign="top"><input type="text" id="ID" name="ID" size="35" value="<?php echo $ID; ?>"></td>
<td valign="top"><input type="text" id="M_NAME" name="M_NAME" size="35" value="<?php echo $M_NAME; ?>"></td>
<td valign="top"><input type="text" id="SCHICHT" name="SCHICHT" size="35" value="<?php echo $SCHICHT; ?>"></td>
<td valign="top"><input type="text" id="ORT" name="ORT" size="35" value="<?php echo $ORT; ?>"></td>
<td valign="top"><input type="text" id="KURZBESCHREIBUNG" name="KURZBESCHREIBUNG" size="35" value="<?php echo $KURZBESCHREIBUNG; ?>"></td>

Auch hier sind wieder die Kontextwechsel zu HTML nicht beachtet worden. Man muss ja noch nicht mal was böses wollen, es reicht einfach schon, als Kurzbeschreibung etwas mit "Anführungszeichen" eingegeben zu haben, um das value=" zu beenden. Und dann wunderst du dich, dass nur ein Teil angezeigt wird.

<input type="submit" name="submitted" value="&Uuml;bernehmen">

Es ist fast immer besser, eine Zeichencodierung zu benutzen, die es erlaubt, die Zeichen in ihrer normalen Form zu verwenden, anstatt Zeichen-Entity-Referenzen oder numerische Zeichenreferenzen zu verwenden.

Lo!