Bademeister: PHP / MySQL Sicherheit

Beitrag lesen

Hi Sub.

Dass man GET / POST / REQUEST / SESSION Variablen und Werte niemals ungeprüft zur Datenbank weiterleiten soll weiß ich also bereits!

Oje. Was meinst Du denn mit "pruefen"? Da hast Du diesen Slogan aufgeschnappt, der gut gemeint, aber Unsinn ist.

*Dann*, wenn ein Wert in einer dieser Variablen (also ein vom Client uebergebener Wert) kein beliebiger String sein darf (also nicht alles sein darf, was er technisch sein kann), *dann* musst Du pruefen, ob das, was drin steht, etwas ist, was drinstehen darf.

Wenn andersherum ein User einen beliebigen String angeben darf, worauf willst Du dann pruefen? Was Du lediglich tun musst, ist etwas ganz anderes:

Du musst Dir im klaren sein, dass ein String, der in eine DB geschrieben werden soll, im dafuer verantwortlichen SQL-Statement selber (i.a.) nicht auftaucht - um aus dem String das Statement zu bilden, musst Du sein SQL-Literal bilden, d.h. eine Funktion wie mysqli_real_escape_string anwenden. Das ist alles. Pruefen tut die Funktion gar nichts.

magic_quotes_gpc und register_globals sind von Strato Standardmäßig ausgeschaltet und die per POST übergebenen Variablen werden mit drei Arrays (alle die dürfen Array, Pflicht Array und Kann Array) verglichen und falls Unstimmigkeiten existieren, wird das Script sofort abgebrochen.

Warum wird denn gleich das Skript abgebrochen? Das klingt nicht sehr benutzerfreundlich.

Auch prüfe ich ob in den übergebenen Werten unerlaubte Zeilenumbrüche vorhanden sind.

Was sind es denn eigentlich fuer Werte? Warum ist es ein Problem, wenn einer einen Zeilenumbruch eingibt?

Jetzt zu meinen Verständnisproblemen;

  1. Da ich bei DB Abfragen nicht nur mit Zahlen (ID) arbeite sondern auch mit Buchstaben / Wörter, weiß ich nicht wie ich diese behandeln soll zwecks einer Prüfung.

Schreibe mal auf einem Blatt Papier *exakt* auf, was Du eigentlich pruefen willst, d.h. welche Strings erlaubt und welche nicht erlaubt sind. Wenn Du das weisst, dann ist es hoechstwahrscheinlich nicht schwierig, die Pruefung zu implementieren.

was mache ich aber bei Wörter (Wörter mit Apostroph wie Bistro's), wäre da preg_match Sinnvoll oder habt Ihr einen besseren Vorschlag?

Warum sind denn keine Apostrophe erlaubt?

  1. Aus Testzwecken frage ich die Datenbank momentan so ab:

$sich = "Op's";

$abfrage="SELECT ID,Kategorie,Sich,Event,Bild FROM 01_daten WHERE Sich LIKE BINARY'".mysql_real_escape_string($sich)."' AND Kategorie = '".mysql_real_escape_string($_POST[‘koi’])."' AND Event != '".mysql_real_escape_string($_POST[‘eve’])."' ORDER BY Event ASC";

Aber sicher nicht allzu erfolgreich, weil das so geblidete SQL-Statement Syntax-Fehler enthaelt. Vom Ansatz her ist es aber sicher der bessere Weg, als die Variablen erst noch separat umzukopieren. Dafuer gibt es keinen guten Grund.

Viele Gruesse,
der Bademeister