Ja, MySQL kann jede Art von Text technisch sicher speichern. Das heißt, MySQL speichert den Text wie er ist und gibt ihn wieder zurück, ohne Daten zu verlieren.
Mysql unterscheidet nicht zwischen dem Inhalt des Textes, also macht es keinen Unterschied, ob es sich um HTML, CSS, JS-Code oder die letzte E-Mail Ihres Freundes handelt.
Wenn Sie den Text jedoch später ausgeben, sollten Sie darauf achten, dass keine unerwünschte Code-Injektion erfolgt, nachdem Sie die Daten aus mysql gezogen haben. Aber das hat eigentlich nichts mit MySQL zu tun.
Um Ihr SQL sicherer zu machen, übergeben Sie das Datenbank-Handle an mysql_real_escape_string
oder noch besser verwenden Sie MySQLi
und/oder PDO
und vorbereitete Erklärungen.
Ihr Code
Ihr Code sieht so aus, als würden Sie viel versuchen, etwas zu verhindern, aber am Ende stellt er sich als ziemlich nutzlos heraus:
function filter($data) {
$data = trim(htmlentities(strip_tags($data)));
if (get_magic_quotes_gpc())
$data = stripslashes($data);
$data= strip_tags($data);
$data = mysql_real_escape_string($data);
return $data;}
Normalisieren Sie die Daten, bevor Sie sie verarbeiten
Zunächst sollten Sie die Position des Häkchens für get_magic_quotes_gpc
ändern um die Daten zu normalisieren, an denen die Funktion arbeitet. Es wäre sogar noch besser, wenn Ihre Anwendung sich nicht darauf verlassen würde, sondern nur die Arbeit verweigert, wenn diese Option aktiviert ist - hier finden Sie diese wichtigen Informationen dazu
wenn Ihnen Sicherheit am Herzen liegt.
Aber für die Sicherheit Ihres geposteten Codes sollten wir zuerst den Eingabewert für die Funktion normalisieren, bevor wir ihn weiter verarbeiten. Dies geschieht durch Verschieben des Häkchens an den Anfang der Funktion.
function filter($data)
{
// normalize $data because of get_magic_quotes_gpc
$dataNeedsStripSlashes = get_magic_quotes_gpc();
if ($dataNeedsStripSlashes)
{
$data = stripslashes($data);
}
// normalize $data because of whitespace on beginning and end
$data = trim($data);
// strip tags
$data = strip_tags($data);
// replace characters with their HTML entitites
$data = htmlentities($data);
// mysql escape string
$data = mysql_real_escape_string($data);
return $data;
}
In dieser modifizierten Funktion wurden die magischen Anführungszeichen (die Sie nicht verwenden sollten) an den Anfang verschoben. Dadurch wird sichergestellt, dass unabhängig davon, ob diese Option aktiviert oder deaktiviert ist, die Daten immer gleich verarbeitet werden. Ihre Funktion hat dies nicht getan, sie hätte unterschiedliche Ergebnisse für dieselben übergebenen Daten erzeugt. Das wurde also behoben.
Weitere Probleme mit Ihrer Funktion
Auch die Funktion sieht jetzt besser aus, hat aber noch viele Probleme. Zum Beispiel ist unklar, was die Funktion tatsächlich tut. Es macht viele Dinge auf einmal und einige davon sind widersprüchlich:
- Es entfernt HTML-Tags, was ein Zeichen dafür ist, dass
$data
sollte kein HTML enthalten - Aber dann konvertieren Sie den Text von
$data
tatsächlich HTML-Entitäten enthalten haben.
Was sollen denn die Daten sein? HTML oder nicht? Es bringt nicht mehr Sicherheit, wenn Dinge unklar werden, weil dies dazu beiträgt, dass Fehler in Ihr Programm kommen und am Ende sogar Ihre Sicherheitsvorkehrungen passieren.
Sie sollten den Code also einfach wegwerfen und Folgendes berücksichtigen:
- Wenn die Eingabe in Ihre Anwendung ungültig ist, filtern Sie sie nicht. Verhindern Sie stattdessen die weitere Verwendung ungültiger Eingaben. Sie brauchen also eine Funktion, um Eingaben zu validieren, bevor Sie sie verwenden.
- Ändern Sie keine Daten, nur weil Sie denken Dies könnte etwas sicherer machen. Ändern und kodieren Sie stattdessen Daten dort, wo sie benötigt werden und angemessen sind.
- Stellen Sie sicher, dass Ihre Anwendung nur funktioniert, wenn magische Anführungszeichen deaktiviert sind. Es wird dringend davon abgeraten, sich auf diese Funktion zu verlassen. Und dann brauchen Sie das nicht überall in Ihrem Code zu überprüfen.
- Um etwas sicher in der Datenbank zu speichern, maskieren Sie die Daten, bevor Sie sie nur in der Abfrage verwenden. Nicht an einer anderen Stelle Ihrer Anwendung. Verwenden Sie dazu vorbereitete Anweisungen.
- Die Daten müssen nicht bearbeitet werden, bevor Sie sie in die Datenbank eingeben, wenn sie gültig sind. Aber Sie müssen es richtig codieren, wenn Sie es auf der Webseite ausgeben . Und nur dort weiß eine Anwendung, in welcher Codierung dies sein muss. Das wissen Sie nicht, wenn Sie die Daten in die Datenbank eingeben.
Wenn Sie also Ihren Code sicherer machen möchten, geht es nicht darum, eine Reihe von Funktionen auf einige Daten zu werfen, weil Sie denken, dass diese sicherheitsrelevant sind. Dadurch machen Sie Ihre Software nicht sicherer, sondern weniger sicher.
- Vertraue niemals Benutzerdaten.
- Stellen Sie sicher, dass die Daten vor der Verarbeitung in dem Format vorliegen, in dem Sie sie benötigen .
- Verwenden Sie das richtige Tool für den Job am richtigen Ort.
- Verwenden Sie niemals Tools auf Raten. Holen Sie sich stattdessen Wissen, das sich nicht nur sicherheitstechnisch auszahlt.