Einzelnen Beitrag anzeigen

Panthrax

Registriert seit: 18. Feb 2005
286 Beiträge
 
Delphi 2010 Enterprise
 
#3

Re: PHP: Problem mit serialize() und unserialize()

  Alt 22. Jul 2005, 15:00
Salut.

In der Tat; Unserialize verhält sich schon unerwartet, aber man kann es nachvollziehen. (Übrigens ist es in PHP 5 dasselbe wie in PHP 4.) Aber das Paar Serialize und Unserialize versteht seine Rückgaben als gegenseitigen Parameter. Die Problematik ist, die richtigen Escapesequenzen für die SQL-Statements zu generieren.

Hier der Vorschlag "Text entschärfen":

Code:
$StringWithQuotes = 'Ich zitiere: "Ich zitiere: \'...\'"';

// Text entschärfen
$StringWithQuotes = serialize(base64_encode($StringWithQuotes));

print($StringWithQuotes); // testhalber ausgeben

// ab damit in die Datenbank
mysql_connect('localhost','user','password');
mysql_select_db('test');
mysql_query('INSERT INTO alcaeus (TextColumn) VALUES (\''.$StringWithQuotes.'\')');

// und wieder raus aus der Datenbank
$L = mysql_query('SELECT * FROM alcaeus');
while($Row = mysql_fetch_row($L))
{
   print_r($Row);
   $StringWithQuotes = $Row[1];
   print($StringWithQuotes);
   // Text scharf machen
   print(base64_decode(unserialize($StringWithQuotes)));
   print('
');
}
Der wesentliche Punkt ist: Der Text enthält Zeichen bzw. Zeichenkombinationen die Nebeneffekte haben. Es würde genügen diese zu maskieren. Im Vorschlag werden rigeros alle maskiert; mit Base64. Ein anderer Algorithmus, der die Zeichen auf eine Zeichenmenge abbildet, bei der besagte Zeichen bzw. Zeichenkombinationen nicht auftreten würde den selben Zweck erfüllen. Natürlich muss die Abbildung eineindeutig sein.

Alternativ könnte man unter Berücksichtigung des MySQL-Dialekts '`' (accent grave, backtick) als Delimiter verwenden. Also: `Ich zitiere "Ich zintiere '...'"`. Letzteres ist spekulativ. Ich habe es nicht getestet.

Ich hoffe geholfen zu haben.

Panthrax.

P.S.: Ich halte den Missbrauch von Akzenten als Stringdelimiter für eine der schwachsinnigsten Erfindungen. Solch eine Erfindung kann nur aus der anglophonen Welt kommen, wo man wahrscheinlich nicht einmal weiß das "Backtick" und "Fronttick" eigentlich "accent grave" und "accent acute" heißen, um als selbige eingesetzt zu werden. Es gibt und gab genug andere Delimiter und Delimitersysteme die sich bereits etabliert hatten und es noch immer uneingeschränkt sind. Da lob' ich mir Delphi...
  Mit Zitat antworten Zitat