So, endlich finde ich die Zeit mich weiter um die Sicherheit meiner Skripte zu kümmern.
Als erstes würde ich noch einmal kurz auf die Sicherheit meines Skriptes, mit den Datenbankdaten eingehen. Ich habe zuerst einmal mit .htaccess das Verzeichnis, in welchem diese Datei auf dem Server liegt, vor Zugriffen geschützt.
Dann habe ich Gumbos Code mit dort eingefügt. Ich gehe davon aus, dass es richtig es daran nichts zu verändern? Nun sieht das Skript im Vergleich zu oben wie folgt aus und es funktioniert auch auf dem Server.:
PHP:
<?php
//Zuerst die Abfrage, ob das Skript aus einem anderen aufgerufen wird
if( realpath($_SERVER['SCRIPT_FILENAME']) === realpath(__FILE__) ) {
header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found');
exit;
}
//Paramter fuer die Datenbankverbindung
$server = "localhost";
$user = "root";
$passwd = "";
$datenbank = "votum";
// Versuchen, die DB-Verbindung herzustellen
$verbindung = mysql_connect ($server, $user, $passwd);
if(!$verbindung) die("Datenbankverbindung konnte nicht hergestellt werden. Fehler " . mysql_errno() .": ". mysql_error());
//Auswahl der entsprechenden Datenbank
if (!mysql_select_db ($datenbank)) die("Datenbankverbindung konnte nicht hergestellt werden. Fehler " . mysql_errno() .": ". mysql_error());
?>
Dazu habe ich also KEINE Fragen mehr, es sei denn ich hätte irgendwas falsch gemacht? Vielen Dank schon einmal dafür!
Dann ein schönes Beispiel für die Maskierung von Formulareingaben beim Speichern in die Datenbank (SQL-Injektion-Schutz) - und zwar mein Feedbackformular mit dem User einige Angaben machen können, wie Ihnen das Angebot gefällt. Sie enthält sowohl Text (Strings) als auch Zahlenwerte, die aus einem Drop-Down Menu stammen.
Zuerst werden die mittels POST übertragenen Variablen eingelesen:
PHP:
//Variabeln einlesen aus dem Formular
$beurteilung = trim(@$_POST["beurteilung"]);
$verbesserung = trim(@$_POST["verbesserung"]);
$anmerkung = trim(@$_POST["anmerkung"]);
$wieder = trim(@$_POST["wieder"]);
$empfehlen = trim(@$_POST["empfehlen"]);
//Variable aus der Session verfuegbar machen
$besitzerid = $_SESSION["besitzerid"];
Bislang wurden diese Variablen dann einfach ungeprüft in die Datenbank geschrieben, nämlich:
PHP:
<?php
//Diese Daten werden jetzt in die Datenbanktabelle kontakt geschrieben
$result = mysql_query("insert into kontakt (besitzerid, beurteilung, verbesserung, anmerkung, wieder, empfehlen) values('$besitzerid', '$beurteilung', '$verbesserung', '$anmerkung', '$wieder', '$empfehlen')");
if(!$result) die("Die Kontaktformulardaten konnten nicht gespeichert werden. Fehler " . mysql_errno() .": ". mysql_error());
?>
Und nun habe ich es folgendermaßen geändert. Dabei ist noch wichtig zu erwähnen, dass ich die
magic_quotes abgeschaltet habe!
PHP:
<?php
$result = mysql_query("INSERT INTO kontakt (besitzerid, beurteilung, verbesserung, anmerkung, wieder, empfehlen) values('".mysql_real_escape_string($besitzerid)."', ".intval($beurteilung).", '".mysql_real_escape_string($verbesserung)."', '".mysql_real_escape_string($anmerkung)."', '".mysql_real_escape_string($wieder)."', '".mysql_real_escape_string($empfehlen)."')");
?>
Aber irgendwas scheint da nicht zu funktionieren. Denn in meiner Datanbank landen die Daten in genau der selben Form wie mit ohne den Maskierungsfunktionen. Außerdem habe ich die Variable $beurteilung mal als string eingegeben und der Wert wird trotz ".intval($beurteilung).", auch als String in der Datenbank gespeichert.
Ist das richtig so ? Oder muss ich wirklich INSERT INTO SET verwenden und es geht nicht mit INSERT INTO VALUES ?
Fehlermeldungen habe ich jedenfalls keine bekommen. Ich hoffe Gumbo oder jemand anderes erbarmt sich erneut und hilft mir auf die Sprünge.