Datenbank Sicherheit & Zeichensatz
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abfrage
anfang
ansatz
code
eingabe
entfernen
fehler
funktion
paar
post
set
show
sicher programmieren
sicherheit
sinnvolle angaben
sonderzeichen
tip
url
verzichten
zeichensatz
-
Hallo zusammen,
als Neuling in Sachen PHP fällt es mir schwer Sicherheitslücken zu finden und zu verbessern. Mein Wissen ist da sehr begrenzt und daher brauch ich ein paar erfahrene User mit Tipps. Folgend habe ich ein paar spezielle Fragen aufgelistet, die mir bitte mit entsprechenden Code-Beispielen erklärt werden. Auf "bloße" Linklisten kann ich verzichten!
Zeichensatz:
Momentan sieht es so aus, dass ich einfach alles in die Datenbank schreibe ohne vorher auf den Zeichensatz zu achten. Ich gehe davon aus, dass das ganze in utf-8 hineingeschrieben wird und auch wieder so ausgegeben.
Also meine Frage: Wie leg ich den Zeichensatz sinnvoll fest?
(Bisher erhalte ich keine merkwürdigen Zeichen, was mich etwas verwundert.)
Weiterhin ist mir unklar: Wenn ich in einer Tabelle eine Suchanfrage abgebe, müsste ja auch auf Sonderzeichen geachtet werden. Also gerade bei den üblichen Umlauten dürfte das doch Probleme machen? Wie stelle ich das also an: Kann ich es getrost ignorieren oder muss ich vorher mit "htmlentities" die Suchanfrage umwandeln?
Sicherheit:
Von SQLInjections habe ich schon gehört. Bisher habe ich salopp geschrieben:
Wenn ich jetzt gegen diese Injections vorbeugen möchte, stehen mir verschiedenen Funktionen zur Auswahl: addslashes(), mysql_real_escape_string(), ...$query = "INSERT INTO `table` (`one`,`two`,`three`) VALUES ('".$_POST[one]."','".$_POST[two]."','".$_POST[three]."');"; $db=mysql_query($query);
Welche dieser Funktionen sollte angewandt werden?
Zudem finde ich es sehr unschick, die Abfrage durch zusätzliche Funktionen noch weiter aufzublähen. Kann man das ganze überprüfen geschickt lösen?
Ein weiteres Beispiel: Eine Suchanfrage möchte ich über $_GET lösen. Wie könnte ich jetzt schon bevor die Suchanfrage abgeschickt wird überprüfen ob sinnvolle Angaben gemacht werden. Also mit der oben angegebenen Methode könnte ich ja eine SQLInjection verhindern - allerdings sagt das ja nichts darüber ob die Eingabe sinnvoll war. Also kann man vllt. solche Injections auch frühzeitig erkennen?
Zum Abschluss noch eine etwas allgemeiner gefasste Frage: Mit welchen Themen sollte man sich zur Sicherheit noch beschäftigen. Welche Tipps/Erfahrungen könnten mir helfen Fehler zu vermeiden? -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Zudem finde ich es sehr unschick, die Abfrage durch zusätzliche Funktionen noch weiter aufzublähen. Kann man das ganze überprüfen geschickt lösen?
z.B. so und dann halt mit post('name') statt $_POST['name'] drauf zugreifen
function post ($value)
{
return mysql_real_escape_string ($_POST[$value]);
}
oder direkt für alle Werte in $_POST
foreach ( $_POST as $var => $val )
{
$_POST[$var] = mysql_real_escape_string ( $val );
}
Ich hab auch noch nen ganz netten Buchtip zu dem Thema: PHP-Sicherheit: PHP/MySQL-Webanwendungen sicher programmieren von Christopher Kunz und Stefan Esser
Gruß
netzzitrone
-
netzzitrone schrieb:
Also dieser Ansatz gefällt mir ganz gut. Dadurch wird es doch sehr einfach. Was mir dabei noch fehlt ist die Überprüfung ob die Eingabe sinnvoll ist. Allerdings hängt dies wohl vom Eingabefeld ab (Email, Zahl, ...)function post ($value) { return mysql_real_escape_string ($_POST[$value]); }
Was ich ja fast vergessen hatte, dass ich nun auch die zusätzlichen "\" wieder entfernen muss:
$sql = "SELECT * FROM sniplet WHERE ID = 1"; $query = mysql_query($sql); $show = mysql_fetch_object($query); $show = stripslashes($show);
Die letzte Zeile erzeugt einen Fehler, da $show ja so etwas wie ein Array ist. Allerdings müsste ich ja dann vor jede Ausgabe wie "$show->title" das stripslashes einfügen, was auch wieder sehr aufwändig und ungeschickt wirkt. Gibt es da auch eine bessere Variante? -
Ein Paar Stichworte:
@Zeichensatz: Ich hasse Zeichensätze. Wie ich das zur Zeit mache: Alle Dateien als UTF-8 speichern und am Anfang meiner Seite einen Query mit "SET CHARACTER SET utf8", sonst bekomme ich die Daten iwie nicht in utf8.
@escaping: Ich würde am Anfang die magic quotes killen, dann bekommst du keine doppelten Escapes. http://php.net/manual/en/security.magicquotes.disabling.php. Insbesondere der erste Kommentar interessiert dich.
Anschließend kannst du dann mit mysql_real_escape_string escapen (das stripslashes brauchst du nicht...). Besser noch du nutzt PDO oder mysqli in Verbindung mit Prepared Statements. (Ich empfehle PDO, weil es noch eine DB-Abstraktionsebene bietet.) -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage