Backslash wird falsch maskiert

Dieses Forum enthält Diskussionen zu Bugs in ConPresso 4 und deren Lösungen.
Antworten
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7362
Registriert: 01.01.1970 01:00
Hat sich bedankt: 111 Mal
Danksagung erhalten: 934 Mal
Kontaktdaten:

Backslash wird falsch maskiert

Beitrag von MarkusR »

Nach tatsächlich schlappen 3 Jahren kann ich es nicht mehr ertragen.

Da ich ich auf ConPresso-Seiten auch PHP und Javascript-Codes einstelle (nicht als auszuführender sondern als anzuzeigender Code!) hatte ich oft Schwierigkeiten, daß manche Codes einfach nicht mehr editierbar waren.

Daher habe ich jetzt in _include/form_fields.inc.php folgende Änderung vorgenommen:

Code: Alles auswählen

    $text_value = preg_replace ('/(\015\012|\015|\012)/', ' ', $text_value); 
    $text_value = preg_replace ("/'/", "\\'", $text_value); 
ergänzt zu

Code: Alles auswählen

    $text_value = preg_replace ('/(\015\012|\015|\012)/', ' ', $text_value); 
    $text_value = preg_replace ('/\\\\/', '&#92', $text_value); 
    $text_value = preg_replace ("/'/", "\\'", $text_value); 
Ob das eine sinnvolle Lösung ist kann ich nicht beurteilen, auf jeden Fall kann ich jetzt auch Backslashes vor Apostrophen (also \') benutzen ohne daß dies als Maskierung gewertet wird und das Apostroph den iframe-Code zerschießt...
Ciao Markus
ConPresso-Module

Kein Support per PN!!! Für Fragen und Diskussionen ist das Forum da!

Succi recentis officinalis
Hochwertige Kräutersäfte und -Öle
Benutzeravatar
balu
ConPresso-Entwickler
Beiträge: 1748
Registriert: 01.01.1970 01:00
Hat sich bedankt: 81 Mal
Danksagung erhalten: 133 Mal

Beitrag von balu »

Hi Markus,

wie genau äussert sich das ganze?

Du hast irgendwo PHP-Code stehen, der "Backslash-Apostroph" enthält und wenn Du das editierst, passiert was?

Balu
Bartels.Schöne
ConPresso Support & Development
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7362
Registriert: 01.01.1970 01:00
Hat sich bedankt: 111 Mal
Danksagung erhalten: 934 Mal
Kontaktdaten:

Beitrag von MarkusR »

Nimm einfach dieses Original-ConPresso-Fragment und teste es selbst:

Code: Alles auswählen

         .'" onClick="return confirm(\''.$q.'\')">' 
Nach dem Speichern des Artikels lässt sich das HTML-Feld nicht mehr bearbeiten, weil dessen Inhalt nicht mehr gezeigt wird...

Der erzeugte JS-Code sieht nämlich so aus:

Code: Alles auswählen

iframe.document.writeln('         .\'" onClick="return confirm(\\'\'.$q.\'\\')">\' ');
und ist ungültig.

Durch die Modifikation erhalte ich stattdessen

Code: Alles auswählen

iframe.document.writeln('         .\'" onClick="return confirm(&# 92;\'\'.$q.\'&# 92;\')">\' ');
(\ musste ich hier umschreiben zu &# 92; damit es sichtbar ist)
und kann den Code jederzeit weiterbearbeiten...
Ciao Markus
ConPresso-Module

Kein Support per PN!!! Für Fragen und Diskussionen ist das Forum da!

Succi recentis officinalis
Hochwertige Kräutersäfte und -Öle
Benutzeravatar
balu
ConPresso-Entwickler
Beiträge: 1748
Registriert: 01.01.1970 01:00
Hat sich bedankt: 81 Mal
Danksagung erhalten: 133 Mal

Beitrag von balu »

Was ich etwas seltsam finde ist, dass Du zwei Backslashes \\ durch &# 92; ersetzt.

Ich habe das jetzt mal wie folgt gemacht:

Code: Alles auswählen

    $text_value = preg_replace ('/(\015\012|\015|\012)/', ' ', $text_value); 
    $text_value = str_replace ('\\', '\\\\', $text_value);
    $text_value = str_replace ("'", "\\'", $text_value);
    $text_value = str_replace('</', '<\/', $text_value);
Ich habe da eines der preg_replace() durch str_replace() getauscht, weil das performanter ist und keinen Regex braucht.

Die zusätzliche Zeile tauscht \ durch \\ aus, so dass der Backslash selber maskiert wird. Müsste das nicht die passendere Variante sein?

Balu
Bartels.Schöne
ConPresso Support & Development
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7362
Registriert: 01.01.1970 01:00
Hat sich bedankt: 111 Mal
Danksagung erhalten: 934 Mal
Kontaktdaten:

Beitrag von MarkusR »

Frag mich nicht warum man für einen Backslash als Suchkriterium '/\\\\/' als regexp schreiben muß...

Deine Version funktioniert auch.

Welche auch immer Einzug in ConPresso findet... Hauptsache man kann PHP und JS Codes publizieren ohne jedesmal über phpmyadmin Inhalte pflegen zu müssen...
Ciao Markus
ConPresso-Module

Kein Support per PN!!! Für Fragen und Diskussionen ist das Forum da!

Succi recentis officinalis
Hochwertige Kräutersäfte und -Öle
Benutzeravatar
balu
ConPresso-Entwickler
Beiträge: 1748
Registriert: 01.01.1970 01:00
Hat sich bedankt: 81 Mal
Danksagung erhalten: 133 Mal

Beitrag von balu »

Das mit den 4 Backslashes ist sogar im Handbuch dokumentiert:
http://de2.php.net/manual/de/regexp.ref ... kslash.php

In _admin/templates.php wird übrigens ein addslashes() gemacht. Das ergänzt Backslashes vor ", ', \ und NULL.

Das wären zwar NULL und " mehr beim Ausklammern, aber das sollte nicht schaden und ist vielleicht noch besser als die zwei str_replace();

Der Code, den ich jetzt aufgenommen habe, sieht so aus:

Code: Alles auswählen

    // to avoid problems with the document.writeln below
    $text_value = preg_replace ('/(\015\012|\015|\012)/', ' ', $text_value);
    $text_value = addslashes($text_value);
    $text_value = str_replace('</', '<\/', $text_value);
Balu
Bartels.Schöne
ConPresso Support & Development
Antworten