dedlfix: Variable überprüfen

Beitrag lesen

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";