dedlfix: Sichern einer MySQL-Datenbank in PHP

Beitrag lesen

echo $begrüßung;

Nehmen wir einmal an, es geht um folgenden String: foo " bar.

Durch magic_quotes wurde da bereits ein Slashs vor das Anführungszeichen gesetzt, nun wende ich mysql_real_escape_string() an und daraus wird: foo \" bar - ich habe damit also soeben eine Sicherheitslücke geöffnet.

Nein. Du hast übersehen, dass mysql_real_escape_string() sich neben dem " auch um den \ kümmert. Es kommt also foo \" bar raus.

ist mysql_real_escape_string() auch dafür gedacht, auf Tabellennamen angewendet zu werden? Ich habe es bis jetzt immer mehr dafür gehalten, es auf quotierte Strings anzuwenden.

Es sieht mir auch so aus, als ob mysql_real_escape_string() nur für Werte und nicht für Identifier gedacht ist. Nach Lekture des Handbuchkapitels Database, Table, Index, Column, and Alias Names möchte ich meinen, dass es sogar ungeeignet ist. Dort steht auch, welche Zeichen nicht erlaubt sind und dass ein Backtick zu verdoppeln ist, wenn es Bestandteil eines in Backticks eingeschlossenen Bezeichners ist. Du müsstest also am Besten eine eigene Bezeichner-Quotier-Funktion/-Methode schreiben, die das alles berücksichtigt.

[...] würde der String
  tabelle; DELETE FROM tabelle
eingefügt in
  SELECT * FROM $string
immer noch zu
  SELECT * FROM tabelle; DELETE FROM tabelle
werden und damit Schaden anrichten.

Bleib mal bei realistischen Beispielen! :-) Solche Mehrfachstatements werden von MySQL im Normalfall abgelehnt (MySQL-API-Beschreibung zu mysql_query()). Man muss sich schon etwas mehr bemühen, wenn man dieses Feature haben möchte: C API Handling of Multiple Query Execution. Für PHP braucht man dazu die MySQL Improved Extension (mysqli) und mysqli_multi_query() (siehe auch mysqli_real_connect() (bei der Beschreibung der Flags)).
Trotzdem bleibt die Möglichkeit, das eine erlaubte Statement so zu verändern, dass es ein anderes Ergebnis liefert als das vom Programmierer vorgesehene. Das reicht möglicherweise schon aus, um an Informationen zu kommen, die nicht für aller Leute Augen bestimmt waren.

[...] PHP4 sei Dank (oder auch nicht) sind ja alle Methoden public.

var $newline = "\n";
Ich würde keine Klassenvariable dafür verwenden, zumal es außer einer Quelltextänderung keine Möglichkeit gibt, die zu verändern.
Doch, dank PHP4 kannst du folgendes machen:
$instanz->newline = "\r\n";[/code]

Hier hatte ich anscheinend schon wieder verdrängt, dass ja bei PHP4 alles public ist und "ordentliches OOP" im Kopf gehabt.

O.K. Der Anwender kann die Eigenschaft nach erfolgter Instantiierung ändern.

Das fiel mir dann aber doch noch auf, weswegen ich hier einlenkte ...

Dazu muss er aber voraussetzen, dass sie bis dahin noch nicht verwendet wurde. (Die Analyse des Konstruktor-Quelltexts, um das herauszufinden, ist keine sehr feine Option.)

... um noch ein Härchen in der Suppe zu finden. :-)

echo "$verabschiedung $name";