PHP/MySQL - Praxistutorial 2 - Daten absichern Teil 2
1. Die Abschnitte
- Überblick
- Notices
- Notices abfangen
- Daten überprüfen Teil 1
- Daten überprüfen Teil 2
- Daten absichern Teil 1
- Daten absichern Teil 2
2. Selber escapen
Kommt jetzt bloß nicht auf die Idee und fangt an, das selber zu machen. Also im Stile von
$_POST['zulieferer'] = str_replace("'", "\'", $_POST['zulieferer']);
$_POST['zulieferer'] = str_replace('"', '\"', $_POST['zulieferer']);
Nein
Dafür gibt es eine wunderbare Funktion namens mysql_real_escape_string
. Dazu müsst ihr in der data/hersteller.php
nur den Query entsprechend anpassen.
$query = 'UPDATE
hersteller
SET
zulieferer = \''.mysql_real_escape_string($_POST['zulieferer']).'\',
telefon = \''.mysql_real_escape_string($_POST['telefon']).'\',
fax = \''.mysql_real_escape_string($_POST['telefax']).'\',
strasse = \''.mysql_real_escape_string($_POST['strasse']).'\',
plz = \''.mysql_real_escape_string($_POST['plz']).'\',
ort = \''.mysql_real_escape_string($_POST['ort']).'\'
WHERE
id = '.$_POST['id'];
3. Wirkungsweise
Wenn ihr jetzt zum Beispiel den Namen eines Herstellers ändert (nehmt ruhig wieder unseren "arabischen" Namen), so seht ihr nach dem
Abspeichern im Hauptmenü auf einmal ein fettes rotes Al Hr\'Abiri
. Denn im Gegensatz
zur Einstellung magic_quotes_gpc
wird bei mysql_real_escape_string
das Escape-Zeichen \
mit in die
Tabelle geschrieben. Klickt mal im Hauptmenü spaßeshalber mehrmals auf unseren "Araber" und dann immer wieder auf "Eingeben". Nach dem
dritten Mal steht dann da ein Al Hr\\\\\\\'Abiri
. In dem Fall wird dann auch noch
jedes Mal der Backslash \
escaped.
4. Gegenmaßnahme
Um das zu verhindern, muss man die vorbelegten value
-Werte vorher umwandeln. Und das geschieht mit der Funktion
stripslashes
. Denn die entfernt das Escape-Zeichen \
aus einer Zeichenkette. Aus Anschauungsgründen nehmen
wir die Änderung mal nur an zwei Stellen vor.
inc/functions.inc.php
$ausgabe .= stripslashes($list[$i]['list']);
data/hersteller.php
<input type="text" name="zulieferer" class="feld"
value="<?php echo stripslashes($hersteller[1]); ?>">
Wem es Spaß macht, der kann das natürlich überall einbauen.
5. mysql_escape_string
Auch diese Funktion gibt es und sie fast identisch mit mysql_real_escape_string
. Es existieren nur zwei Unterschiede, die
aber sehr wichtig sind.
Eigenschaft | mysql_escape_string |
mysql_real_escape_string |
---|---|---|
Verwendeter Zeichensatz | wird nicht berücksichtigt | wird berücksichtigt |
Verbindungs-Kennung | wird nicht berücksichtigt | wird berücksichtigt |
Besonders wegen der Berücksichtigung des Zeichensatzes solltet ihr meiner Meinung nach immer mysql_real_escape_string
benutzen. Zu dem Problem komme ich aber später in disem Tutorial.
6. Fazit
Das ist noch lange nicht alles, besonders wenn es um das Thema Sicherheit geht. Daher gibt es dazu das schon erwähnte Tutorial.
Aber!
Bisher haben wir immer nur mit einer Tabelle gearbeitet. Es gibt also keinen Bezug untereinander. Wie will man also ein Produkt einem Hersteller zuordnen. Oder wie man herausfindet, welcher Kunde was bestellt hat. Nun, dazu komme ich im nächsten Tutorial.