PHP.de Wissenssammlung

Kontextwechsel

Als Zeichenmaskierung oder Escaping wird ein Verfahren bezeichnet, um in einem sprachlichen Kontext ein Zeichen darstellen zu können, das Teil der verwendeten Syntax ist und damit ohne spezielle Auszeichnung eine Doppeldeutigkeit erzeugen könnte. Zeichenmaskierung erfolgt im Allgemeinen durch die Definition einer speziellen Zeichensequenz (Kombination von Zeichen), die per Definition dann als ein anderes Zeichen interpretiert wird.

Eine zweite Anwendung für Zeichensequenzen ist die Abbildung von fremden Zeichen auf einen eingeschränkten Sprachraum.

Beispiele

HTML

HTML benutzt wenige Sonderzeichen, wie " < > &, die immer maskiert werden sollten. Ansonsten können Situationen entstehen, die für den Parser nicht eindeutig sind.

Normale Definition einer Textbox in HTML:

<textarea name="Textangabe">
   Dies ist ein Testinhalt.
</textarea>

Definition einer Textbox in HTML mit problematischen Inhalt:

<textarea name="Textangabe">
  Textareas benutzen "</textarea>", um das Ende des Eingabefeldes zu notieren.
</textarea>

PHP-Strings

Strings in PHP haben zwei relevante Ebenen. Auf der einen Seite werden Strings syntaktisch mit Hochkommata notiert, weshalb dieses Zeichen nicht „unbehandelt“ im String selbst vorkommen kann. Ein PHP-Parser würde in diesem Fall an dieser Stelle die Definition des Stringwertes abbrechen. Desweiteren kennen PHP-Strings diverse Zeichensequenzen, die Zeilenumbrüche, Tabs oder ähnliche spezielle Zeichensequenzen darstellen.

Zeichenkollisionen Wert und Stringbegrenzer:

$foo = 'It's a problem.';
$foo = "Ich sagte "Hallo" zu Ihnen.";

Zeichenmaskierung eines Tab-Zeichens:

$foo = "Vor und \t nach dem Tab.";

SQL

Ebengesagtes gilt genauso für Angaben von SQL-Strings (CHAR-Typen). Zusätzlich kann bei einer SQL-Query in PHP sowohl ein String-Escaping (für PHP), als auch ein CHAR-Escaping für die Query selbst nötig sein. Das Problem tritt auch bei regulären Ausdrücken und HTML auf, insofern diese als String in PHP definiert werden.

Zeichenkollisionen Wert und Stringbegrenzer:

INSERT INTO Foo (id , bar) VALUES (47 , 'It's a problem')

Zeichenkollisionen PHP-String und SQL-Stringbegrenzer:

$query = 'INSERT INTO Users (id , name) VALUES (23 , 'Horst')';

Reguläre Ausdrücke

Reguläre Ausdrücke haben eine komplexe Syntax mit sehr vielen Zeichen-„Operatoren“. Insofern diese Zeichen nicht als Operator (Quantifizierer, Klammer, …) fungieren sollen, müssen alle Zeichen escaped werden. Zusätzlich verwenden PCRE-basierte Ausdrücke (preg_*) ein äußeres Begrenzerzeichen, für das Zeichenmaskierung ebenfalls nötig wird. Typische problematische Zeichen sind: + . ( ) - | * $ ^ [ ] { }, die je nach Position im Ausdruck unmaskiert zu unerwarteten Ergebnissen führen können.

Relevanz

Zeichenmaskierung wird immer dann wichtig, wenn die Gefahr besteht, dass Eingabewerte und syntaktischer Sprachraum in einem Kontext kollidieren. Viele Bugs und Angriffsszenarien auf Software basieren auf dieser Problematik. Gerade deshalb werden Maßnahmen wie das Verwenden von mysql_real_escape_string oft dem Securitybereich zugeordnet, obgleich sie eigentlich eher dem allgemeinen Syntaxbereich zuzurechnen sind. Sicherheitsrelevante Verbesserungen sind eigentlich nur Abfall von Escaping-Prozeduren.

Oben wurden verschiedene Beispiele gezeigt, in denen die Problematik offensichtlich ist. Da PHP eine dynamische Sprache ist, besteht die eigentlich Problematik darin, dass Zeichen von Variableninhalten, die zu einer Query, einem HTML-Fragment oder einem regulären Ausdruck kombiniert werden, erst dort einen unerwarteten Effekt erzeugen. So könnten Variablenwerte bspw. durch Usereingaben entstehen, die durchaus gültig und typisch sein können. Eine Namensangabe Wie O'Brian, die sprachliche Verwendung von Auslassungszeichen oder die Auszeichnung wörtlicher Rede, sind Anwendungsfälle, die, auch ohne ein Angriffsszenario vorauszusetzen, unbehandelt zum Crash einer Applikation führen können. Das Bewußtsein um Syntaxkollisionen ist also entscheidend für eine Anwendung, die mit Usereingaben und dynamischen Ausdrücken hantiert.

Lösung

Referenzen

Dieser Beitrag wird zur Zeit von mermshaus bearbeitet.

Beiträge die sich in Bearbeitung befinden enthalten mitunter unvollständige Informationen. Gedulde dich etwas, wir stellen diesen Beitrag so schnell es möglich ist fertig.

An diesem Beitrag waren bisher beteiligt: nikosch, mermshaus