SQL Syntax Error bei Update Befehl

Don Stefano

Erfahrenes Mitglied
Hallo zusammen,

ich komme an einer Stelle meiner Programmierung nicht weiter und weiß einfach nicht mehr woran das liegt.

In einem HTML Formular werden verschiedene persönliche Angaben des Users erfasst (z.B. Geschlecht, Alter, Einkommen usw.).

Das Formular ruft dann eine Seite auf, die diese Daten mittels "update" Befehl in die betreffenden Spalten einer MySQL Tabelle schreiben soll. Doch das tut sie nicht. Hier der Code an dem es wohl liegen muss:

PHP:
$db->query("update ergebnisbio SET alter='$alter', geschlecht='$geschlecht', sprache='$sprache', schule='$schule', beruf='$beruf', taetigkeit='$taetigkeit', position='$position', erfahrung='$erfahrung', einkommen='$einkommen', schulnote='$schulnote', berufnote='$berufnote' where besitzerid='$besitzerID'"); 
    		  
    if ($db->errno) die (mysqli_error($db));

Und hier dann die Fehlermeldung die erscheint:

HTML:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'alter='1', geschlecht='1', sprache='1', schule='1', beruf='1', taetigkeit='1', p' at line 1

Da ich ja leider kein professioneller Programmierer bin weiß ich nicht was diese Meldung bedeutet. Meines Wissens nach müßte die Syntax des Update Befehls stimmen.

Was ist also das Problem ? Wieso stehen in der Fehlermeldung nur die Variablen bis $taetigkeit und nicht mehr die danach ? Was heißt das p' am Ende und was meint die Meldung mit "line 1" ? Kann mir jemand einfach erklären was ich falsch gemacht habe ?

Herzlichen Dank
Don Stefano
 
Probier mal Folngedes:
PHP:
<?php

	[…]

	$query = "
		UPDATE
		        `ergebnisbio`
		  SET
		        `alter`      = '".mysql_real_escape_string($alter)."',
		        `geschlecht` = '".mysql_real_escape_string($geschlecht)."',
		        `sprache`    = '".mysql_real_escape_string($sprache)."',
		        `schule`     = '".mysql_real_escape_string($schule)."',
		        `beruf`      = '".mysql_real_escape_string($beruf)."',
		        `taetigkeit` = '".mysql_real_escape_string($taetigkeit)."',
		        `position`   = '".mysql_real_escape_string($position)."',
		        `erfahrung`  = '".mysql_real_escape_string($erfahrung)."',
		        `einkommen`  = '".mysql_real_escape_string($einkommen)."',
		        `schulnote`  = '".mysql_real_escape_string($schulnote)."',
		        `berufnote`  = '".mysql_real_escape_string($berufnote)."'
		  WHERE
		        `besitzerid` = '".mysql_real_escape_string($besitzerID)."'
		";
	$db->query($query);
	if( $db->errno ) die(mysqli_error($db));

	[…]

?>
Der Begriff alter gehört zu den von MySQL reserverten Wörtern und muss daher – wenn überhaupt – mit so genannten „Backticks“ (`, U+0060) als Datenbank-, Tabellen-, Index-, Spalten- und Alias-Namen gekennzeichnet werden.
 
Vielen Dank für den Hinweis und die Mühe! Aber reicht es dann nicht aus, wenn ich die Variable "$alter" umbenenne und ansonsten alles gleich lasse ?

Mir ist leider noch nicht klar, warum ich bei allen Variablen.mysql_real_escape_string eingeben sollte, bzw. wozu das genau gut ist.

Vermutlich damit künftig in keinem Fall dieses Problem bei einem Variabelnnamen auftauchen kann ?

Oder war meine "Update Syntax" auch noch in anderer Weise fehlerhaft ? Ich frage das des Verständnisses wegen - einfach weil ich ungern etwas übernehmen möchte, was ich nicht richtig (oder gar nicht) verstehe.

Viele Grüße
Don

ps. Mit der Umbenennung der Variablen $alter klappt es übrigens wirklich schon
 
Zuletzt bearbeitet:
Nicht die PHP-Variable $alter, sondern der in der MySQL-Abfrage befindliche Begriff alter gehört zu den von MySQL reservierten Wörtern, daher heißt es auch „You have an error in your SQL syntax; […]“.

Die PHP-Funktion mysql_real_escape_string() „maskiert spezielle Zeichen innerhalb eines Strings für die Benutzung in einer SQL-Anweisung“. Diese speziellen Zeichen können dazu missbraucht werden, um so genannte SQL-Injektionen zu verursachen, die schwere Schäden verursachen können. Daher sollte bei Benutzereingaben immer diese Funktion zur Entschärfung benutzt werden.
 
Hallo Gumbo,

vielen Dank für die Aufklärung dieses Sicherheitsproblems. Wenn ich das richtig verstehe sollte ich die PHP-Funktion mysql_real_escape_string() also überall verwenden, wo der Nutzer EIngaben machen kann.

Ist das denn auch notwendig bei Eingaben, die mittels Radiobutton oder Auswahllisten gemacht werden ? Denn diese haben doch eigentlich einen vordefinierten Inhalt.

Braucht man das Prozedere dann nicht eingentlich nur bei Freitexteingaben ?

Viele Grüße
Don
http://www.php.net/manual/de/function.mysql-real-escape-string.php
 
Don Stefano hat gesagt.:
Ist das denn auch notwendig bei Eingaben, die mittels Radiobutton oder Auswahllisten gemacht werden ? Denn diese haben doch eigentlich einen vordefinierten Inhalt.

Braucht man das Prozedere dann nicht eingentlich nur bei Freitexteingaben ?
Nein, da ein bösartiger User sich nicht daran halten muss. Er kann Werte seiner Wahl selbst in die Adressleiste eingeben oder selbst ein Formular mit Textfeldern anstatt Radiobuttons auf Dein auswertendes Skript verweisen lassen.
 
Auch bei vordefinierten Werten sollten die Eingaben validiert werden, denn mit etwas Wissen lassen sich auch POST-Anfragen selbst schreiben und damit auch manipulieren.
 
Ok vielen Dank. Dann muss ich am Ende sämtliche Eingabemasken noch einmal daraufhin anpassen.

Schon seltsam, dass ich inzwischen 3 PHP Bücher gelesen habe (als Anfänger wohlgemerkt) wo beim Thema Sicherheit nicht einmal auf diese Problematik eingegangen wurde. Zwar wird empfohlen die Eingaben zu überprüfen (z.B. auf Länge oder ob eine E-Mail Adresse auch ein @ enthält) ansonsten aber nichts. Dies zeigt wohl mal wieder die Unzulänglichkeit solcher Literatur.

Gruß
Don
 
Ich muss nun leider aus Interesse und mangelndem Verständnis doch noch einmal nachfragen:

Was genau macht denn nun die PHP-Funktion mysql_real_escape_string() ?

Oder anders gefragt, wie verhindert diese Funktion, dass die bösen Buben (wie auch immer) irgendwas mit meiner Datenbank anstellen ? Was maskiert diese Funktion und wieso können andere dann nicht mehr so leicht in meine Datenbank einbrechen ?

Nochmals Danke falls sich jemand erbarmt mir das noch einmal etwas genauer zu erklären.

Don
 
Sie maskiert z.B. Anführungszeichen und andere Sonderzeichen. Durch diese Maskierung, mit einer Escape-Sequenz (backslash), wird verhindert, dass man mit einer einfachen Eingabe, das Script aushebeln kann. Ein Beispiel:
Es wird der Name abgefragt und deine Eingabe ist: abc'--
Dann gibt es noch eine Passwortabfrage, die beantwortest du mit einem beliegen Wert, z.B.
xyas

Das würde nun folgend im Sql-Query aussehen:
Code:
SELECT 
    `Name`,
    `Blafasel` 
FROM 
   `Benutzer_Daten`
WHERE
   `Name` = 'abc'--
   `Pw`      = 'xas'
Was passiert hier? Durch das nicht escapte ', wird dieses Feld beendet und man kann etwas neues hinzufügen, in diesem Fall den Kommentar-Strich. Nun wird alles ignoriert was danach kommt und man kann sichauch ohne PW einloggen.

Gumbos Link erklärt das aber auch sehr gut.
 
Zuletzt bearbeitet:
Zurück