Variable überprüfen
Mirko
- php
0 codeslayer2 dedlfix0 Mirko
Tach zusammen,
ich habe eine kurze Frage. Ich will von einem Formular eine Variable nehmen und diese mit PHP in einer MySQL Datenbank speichern. Nun würde ich mich gern vor möglichen Angriffen schützen. Gibt es eine Funktion, die ich drüberlaufen lassen kann, und die mir alle gefährlichen Sachen (MySQL Injection, Javascript, etc. ) rausfiltert oder muss ich von Hand suchen? Ich möchte soviel wie möglich an Eingaben zulassen, jedoch alles gefährliche rausfiltern. Ein paar Schlagworte würden mir weiterhelfen, mit regulären AUsdrücken bin ich nicht so weit gekommen...
viele Grüße,
der Mirko
mein workflow sieht dabei ungefähr so aus: beim eintragen der daten in die tabelle wird nur eine sql-injection verhindert und zwar mit hilfe von mysql_real_escape_string.
beim auslesen wird dann je nach "ausgabemedium" gefiltert. soll die eingabe in html-code erscheinen, kannst du entweder den kompletten String escapen (mit htmlspecialchars oder htmlentities) oder auch einen string-parser (eventuell mal mit google suchen) benutzen, der bestimmte elemente wie <a href="...">...</a> oder <b>...</b> zulässt. dabei ist zu beachten, dass du auch link-ziele kontrollieren musst, nicht dass dann so etwas wie
<a href="javascript:alert('0wned!')">Klick mich</a>
in deinem schönen HTML steht.
Gruß,
Niklas
echo $begrüßung;
Ich will von einem Formular eine Variable nehmen und diese mit PHP in einer MySQL Datenbank speichern.
Ein Formular liefert dir Werte zurück, keine Variablen. Das Formular kommt aus dem HTML-Kontext und da gibt es keine Variablen. Auch während der Übertragung im HTTP-Kontext werden daraus keine Variablen. Dass PHP so freundlich ist, dir die Werte in Variablen zur Verfügung zu stellen, steht auf einem anderen Blatt.
Nun würde ich mich gern vor möglichen Angriffen schützen.
Nicht nur das ist ein Beweggrund. Allgemein formuliert muss jeder Wert, der in einen bestimmten Kontext gebracht werden soll, gemäß dieses Kontexts behandelt werden. Dieses Muss ist unabhängig von irgendwelchen Angriffsszenarien.
Gibt es eine Funktion, die ich drüberlaufen lassen kann, und die mir alle gefährlichen Sachen (MySQL Injection, Javascript, etc. ) rausfiltert oder muss ich von Hand suchen?
Jeder Kontext hat seine eigenen Regeln. PHP stellt einige Funktionen zur Verfügung. Die wichtigsten und ihre jeweiligen Kontexte sind:
Wenn du etwas in eine Datenbank schreiben möchtest, kümmere dich nur um den Datenbank-Kontext. Wenn du jetzt bereits einen speziellen Ausgabekontext mit zu berücksichtigen versuchst, lassen sind deine Daten später vielleicht nicht mehr so umwandeln, dass sie in einem neuen Ausgabekontext verwendet werden können.
Ich möchte soviel wie möglich an Eingaben zulassen, jedoch alles gefährliche rausfiltern. Ein paar Schlagworte würden mir weiterhelfen, mit regulären AUsdrücken bin ich nicht so weit gekommen...
Und dann gibt es noch
strip_tags(). Diese Funktion verspricht das Entfernen von HTML-Code, geht dabei aber ziemlich grob vor. Notwendig ist das nicht, weil ein bei der Ausgabe in den HTML-Kontext verwendetes htmlspecialchars() schon dafür sorgt, dass eventuell eingegebener HTML-Code keine Wirkung mehr hat. Eine Inhaltskontrolle lässt sich technisch sowieso nicht fehlerfrei realisieren. Um eine manuelle Kontrolle von z.B. Gästebucheinträgen kommst du nicht herum.
Magic Quotes. Dieses Feature, dass es ab PHP6 nicht mehr geben wird, verspricht SQL-Injektionen vorzubeugen. Es setzt aber bei der Dateneingabe an und "versaut" sie somit für jegliche Form der Ausgabe, und arbeitet noch nicht einmal für MySQL korrekt. Am besten ist es also, dieses Feature zu deaktivieren.
Außerdem gibt es noch mehrere Kapitel im PHP-Handbuch zum Thema Security.
echo "$verabschiedung $name";
Hallo ihr beiden,
also wenn ich das jetzt richtig verstehe:
mysql_real_escape_string() beim Speichern der Daten in der Datenbank
und:
htmlspecialchars() beim Auslesen der Datenbank und Einfügen der Werte in die Webseite (HTML).
Reicht das? Fange ich damit alles gefährliche ab? Und ihr redet immer von Ausgabekontext. Ich will die Daten eigentlich nur aus der Datenbank in eine HTML Seite schreiben. Was gibts denn da sonst noch? Kann ich htmlspecialchars() dann nicht gleich beim Reinschreiben verwenden?
viele Grüße,
der Mirko
Hallo Mirko,
also wenn ich das jetzt richtig verstehe:
mysql_real_escape_string() beim Speichern der Daten in der Datenbank
und:
htmlspecialchars() beim Auslesen der Datenbank und Einfügen der Werte in die Webseite (HTML).Reicht das?
Wenn du mit den Daten nichts anderes tust, als sie in in eine MySQL-Datenbank zu schreiben und innerhalb einer HTML-Seite auszugeben. Aber wenn du andere Dinge damit anstellst, musst du auch dort dafür sorgen, dass die Werte richtig maskiert sind. Würdest du sie beispielsweise mit exec() o.ä. als Argument einem Programm übergeben, müsstest du die Funktion escapeshellcmd() verwenden. Für andere Kontexte gibt es wieder eigenen Funktionen.
Und ihr redet immer von Ausgabekontext. Ich will die Daten eigentlich nur aus der Datenbank in eine HTML Seite schreiben.
Das nennt man ausgeben.
Was gibts denn da sonst noch? Kann ich htmlspecialchars() dann nicht gleich beim Reinschreiben verwenden?
Nein, man sollte Daten immer nur dann escapen, wo man es auch braucht. Wenn du z.B. irgendwann die gleichen Daten nicht in eine HTML-Seite sondern eine Text-Datei schreiben wölltest, müsstest du die HTML-Maskierungen erst wieder rückgängig machen.
Schöne Grüße,
Johannes