Anf.zeichen in Feldern auf der Konfigurationsseite -> Err

HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB » Mo 2. Okt 2006, 18:38

Das ist eine Änderung, die sich auf alle möglichen Bereiche und Daten in vorhandenen Installationen auswirken kann (=Update), deswegen ist es kritisch. Man muss daher sehr genau gucken, was da im Detail abläuft.

Ich denke, ich habe die Ursache für das unterschiedliche Verhalten gefunden: Bei der Template-Konfiguration werden die Daten "einfach" so evaluiert, im Editor, Vorschau und Webseite werden sie mit stripslashes behandelt.

Außerdem ist der Modul-Code zu beachten (das hatte ich beim Beispiel übersehen). Wenn beispielsweise ein Modul die Eingabezeile so erzeugt:

Code: Alles auswählen

echo '
	  	<tr><td class="text_medium" style="padding:5px;">'.mi18n("Überschrift").': </td></tr>
	  	<tr><td style="padding:5px;"><input type="text" name="CMS_VAR[4]" value="CMS_VALUE[4]"></td></tr>';
erscheint 'Test' zwar auf der Webseite, jedoch kann ich die Konfiguration nicht mehr vornehmen:
Parse error: parse error, unexpected T_STRING, expecting ',' or ';' in
Bei Eingabe von "Test" wird in der DB \"Test\" gespeichert und man bekommt im Konfigurationsfenster dabei das oben erwähnte Input-Feld (nur ein \ im Feld). Gleichzeitig führt dies zu einem Parse-Error im Editor und in der Vorschau, da vor der eigentlichen Modul-Code-Ausführung intern Variablen deklariert werden:

Code: Alles auswählen

<?php $C15CMS_VALUE[1]="57"; $C15CMS_VALUE[3]="sortdate"; $C15CMS_VALUE[16]="asc"; $C15CMS_VALUE[4]=""Test""; $C15CMS_VALUE[14]=""; $C15CMS_VALUE[13]="true"; $C15CMS_VALUE[15]="10"; $C15CMS_VALUE[17]="yes";  ?>
Da die Modul-Eingabe vor der Ausgabe im Editor und der Vorschau mit stripslashes behandelt wird, ergibt sich ""Test"". Das addslashes löst das Problem, da mit addslashes aus \"Test\" -> \\\"Test\\\" wird, mit stripslashes demnach $C15CMS_VALUE[4]="\"Test\""; und die Welt ist in Ordnung.

Vermutlich die Template-Klasse sorgt dann wieder dafür, dass \"Test\" zu "Test" auf der Webseite wird.

Langer Rede kurzer Sinn: Das addslashes ist nicht so aufregend, da es nur die Ausgabe betrifft und nur etwas nochmal mit Slashes versieht, was ohnehin schon über Slashes verfügt. Aber eigentlich müsste man sich im Detail nochmal ansehen, was auf beiden Seiten (Konfiguration/Ausgabe) passiert.

Für einen Augenblick zurückgestellt...

Gruß
HerrB
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net

ronaldo
Beiträge: 42
Registriert: Fr 18. Mär 2005, 10:23
Kontaktdaten:

Beitrag von ronaldo » Di 3. Okt 2006, 06:34

Aha.

Eränzend zum Fazit: Bei mir läufts :)

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Mi 4. Okt 2006, 10:41

ich ergänz hier mal was
-> http://contenido.org/forum/viewtopic.php?t=3590

dateien die berücksichtigt werden müssten

include.con_editcontent.php
functions.con2.php

includes.pretplcfg_edit_form.php
includes.tplcfg_edit_form.php
*** make your own tools (wishlist :: thx)

HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB » Mi 4. Okt 2006, 13:18

Der Link ist nur zur Info, oder (ist ja so schon drin)?

Gruß
HerrB
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Mi 4. Okt 2006, 13:26

HerrB hat geschrieben:Der Link ist nur zur Info, oder (ist ja so schon drin)?
nur zur info(für mich)...
*** make your own tools (wishlist :: thx)

DerEineDa
Beiträge: 17
Registriert: Mi 30. Nov 2005, 17:31
Kontaktdaten:

Beitrag von DerEineDa » Mo 16. Okt 2006, 00:43

Hey, ich dachte ich gucke hier auch mal wieder rein, das Thema hat ja mittlerweile ganz schön Reaktionen hervorgerufen.

Ich hab mal gerade in die Version 4.6.15 reingesehen und wie's aussieht, wurde es noch nicht gefixt, oder zumindest nicht mit meiner Variante. Installiert habe ich die Version noch nicht und werde es wohl auch nicht mehr tun, weil ich meine Ausbildung im Betrieb, für den ich das System aufgesetzt habe, bereits beendet habe und dort auch nicht übernommen wurde. Aber dafür bin ich nun seit 2 Wochen Informatikstudent *yay*.

Übrigens war Contenido Teil meines Abschlussprojektes, welches ich zwei Wochen nach eröffnen dieses Topics bestanden habe, danke an das CMS ;)

Wie bereits gesagt wurde, glaube ich nicht, dass meine Art der Behebung des Fehlers irgendwelche fatale Auswirkungen haben könnte, weil es ja nur die Ausgabe betrifft.

Trotzdem glaube ich, dass man die Eingabe noch optimieren könnte, weil ich mir vorstellen kann, dass bei einigen Systemen die Zeichen automatisch escaped werden, wegen Magic Quotes. Ich weiß gerade nicht, ob dies bereits bei der Eingabe überprüft wird, ich wollte es nur mal in den Raum werfen. Obwohl ich den Code von Contenido komplett verstehe, bezeichne ich mich noch eher als Semi-Anfänger und stelle es nicht in Frage, wenn die Profis hier behaupten, dass es ein weitreichendes Problem ist (was ich nicht nachvollziehen kann, aber wie gesagt, ich bin nicht der Profi :) ).

Und danke ronaldo, dass du dich für meine Lösung so einsetzt. Es tut doch immer gut zu hören, wenn Leute meine Hilfe gebrauchen können :)

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Mo 16. Okt 2006, 08:57

der ansatz ist richtig, aber die position wo das passiert ist falsch...

es hängt mit dem obrigen link, den ich für mich ergänzt habe, zusammen..
da ist die ursache zu finden..

functions.con2.php -> function conGenerateCode
und
include.con_editcontent.php
jeweils

Code: Alles auswählen

$code = str_ireplace("CMS_CONTAINER[$value]", "<?php $CiCMS_VALUE ?>\r\n".$output, $code);
ersetzen durch

Code: Alles auswählen

$code = str_ireplace("CMS_CONTAINER[$value]", AddSlashes("<?php $CiCMS_VALUE ?>\r\n").$output, $code);

somit keine änderungen in diesem abschnitt:

Code: Alles auswählen

                    foreach ($varstring as $key3=>$value3){
                      $tmp = urldecode($value3);
                      $tmp = str_replace("\'", "'", $tmp);
                      $CiCMS_VALUE .= $CiCMS_Var.'['.$key3.']="'.$tmp.'"; ';
                      $output = str_replace("\$CMS_VALUE[$key3]", $tmp, $output);
                      $output = str_replace("CMS_VALUE[$key3]", $tmp, $output);
                    }
änderungen in
includes.pretplcfg_edit_form.php
includes.tplcfg_edit_form.php
sind ebenso keine notwendig...

grund:

nicht

Code: Alles auswählen

echo ' 
        <tr><td class="text_medium" style="padding:5px;">'.mi18n("Überschrift").': </td></tr> 
        <tr><td style="padding:5px;"><input type="text" name="CMS_VAR[4]" value="CMS_VALUE[4]"></td></tr>';
sondern

Code: Alles auswählen

echo ' 
        <tr><td class="text_medium" style="padding:5px;">'.mi18n("Überschrift").': </td></tr> 
        <tr><td style="padding:5px;"><input type="text" name="CMS_VAR[4]" value="'."CMS_VALUE[4]".'"></td></tr>';
CMS_VALUE müssen von " umgeben sein, sind aber im beispiel mit ' umschlossen...
ein single quote führt somit unweigerlich zu einem fehler...

beides zu ermöglichen -> also umschließen von " und ' ist nicht möglich..
*** make your own tools (wishlist :: thx)

ronaldo
Beiträge: 42
Registriert: Fr 18. Mär 2005, 10:23
Kontaktdaten:

Beitrag von ronaldo » Mo 16. Okt 2006, 10:03

@emergence, Du sprichst in Rätseln.
Ich frage mich erneut, was gegen den funktionierenden Patch spricht. Aber es ist wirklich nicht wichtig, dass ich das verstehe.

@dereineda, viel Erfolg beim Studium, auf das weitere gelungene Patches entstehen :-)

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Mo 16. Okt 2006, 10:57

ich war noch nicht fertig... ;-)
noch ne änderung im zusammenhang mit obrigen teil

Code: Alles auswählen

                    $output = AddSlashes($output);
entfernen... (unsinnig den code anders als im input bereich zu behandeln)

Code: Alles auswählen

                    $output = eregi_replace("(CMS_VALUE\[)([0-9]*)(\])", "", $output);

                    /* Long syntax with closing tag */
                    $code = preg_replace("/<container( +)id=\\\\\"$value\\\\\"(.*)>(.*)<\/container>/i", "CMS_CONTAINER[$value]", $code);

                    /* Short syntax */
                    $code = preg_replace("/<container( +)id=\\\\\"$value\\\\\"(.*)\/>/i", "CMS_CONTAINER[$value]", $code);

                    $code = str_ireplace("CMS_CONTAINER[$value]", AddSlashes("<?php $CiCMS_VALUE ?>\r\n").$output, $code);
ersetzen durch

Code: Alles auswählen

                    $output = AddSlashes("<?php $CiCMS_VALUE ?>\r\n".$output);

                    /* Long syntax with closing tag */
                    $code = preg_replace("/<container( +)id=\\\\\"$value\\\\\"(.*)>(.*)<\/container>/i", "CMS_CONTAINER[$value]", $code);

                    /* Short syntax */
                    $code = preg_replace("/<container( +)id=\\\\\"$value\\\\\"(.*)\/>/i", "CMS_CONTAINER[$value]", $code);

                    $code = str_ireplace("CMS_CONTAINER[$value]", $output, $code);
das addslashes wird unten dann leider wieder benötigt, sonst müsste man alle con_types in weiterer folge ändern... (zum einfügen in die code variable wirds da eigentlich auch gebraucht...)

ich hab das jetzt ca ne stunde getestet... sollte mit diesen änderungen problemlos funktionieren...
*** make your own tools (wishlist :: thx)

DerEineDa
Beiträge: 17
Registriert: Mi 30. Nov 2005, 17:31
Kontaktdaten:

Beitrag von DerEineDa » Mo 16. Okt 2006, 12:51

Das klingt jetzt wahrscheinlich arrogant, dass ich meine Art der Lösung so verteidige, aber meine Lösung funktioniert, auch wenn man ' und/oder " in dem CMS_Value speichern will, und ausgegeben wird das auch korrekt.

Was

Code: Alles auswählen

value="'."CMS_VALUE[4]".'"
sein soll, ist mir auch nicht so wirklich klar. Ich meine, es ist mir klar, was du damit vorhast, aber so ist es AFAIK in keiner CMS-Anleitung beschrieben (warum auch..).

Fakt ist:
Der Text, der durch die eval()-Funktion läuft, ist nicht escaped, das führt natürlich zu einem Fehler. Die AddSlashes-Funktion kümmert sich um ' und " und escaped diese, Fehler beseitigt. Dass der Text in der Datenbank unescaped hinterlegt wird, finde ich absolut gut und richtig, denn so kann man den Text in der Datenbank auch anderseitig verwenden, nicht nur für diesen Zweck hier.

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Mo 16. Okt 2006, 14:52

die änderungen sind einerseits eine angleichung an den input bereich (sodas der erste teil ident behandelt werden kann)
anderseits ist da wirklich ein bug drinnen betreffend

Code: Alles auswählen

$code = str_ireplace("CMS_CONTAINER[$value]", "<?php $CiCMS_VALUE ?>\r\n".$output, $code);
der teil hier (ist jetzt mit deinem addslashes):

Code: Alles auswählen

foreach ($varstring as $key3=>$value3){ 
                      $tmp = urldecode($value3); 
                      $tmp = str_replace("\'", "'", $tmp); 
                      $tmp = addslashes($tmp);
                      $CiCMS_VALUE .= $CiCMS_Var.'['.$key3.']="'.$tmp.'"; '; 
                      $output = str_replace("\$CMS_VALUE[$key3]", $tmp, $output); 
                      $output = str_replace("CMS_VALUE[$key3]", $tmp, $output); 
                    }
splittet sich in zwei unterschiedliche teile auf
einerseits in den string der für die ersetzung direkt verwendet wird, und
anderseits in einen php code($CiCMS_VALUE) der nachträglich vor dem code teil hinzugefügt wird...
für $CiCMS_VALUE darf $tmp noch nicht mit addslashes behandelt worden sein...
muss es aber sobald es dem code hinzugefügt wird...

und zwar hier:

Code: Alles auswählen

$code = str_ireplace("CMS_CONTAINER[$value]", AddSlashes("<?php $CiCMS_VALUE ?>\r\n").$output, $code);
naja jetzt komme ich zu dem interessanteren teil...
man kann im output eines moduls auf zwei arten
auf einen CMS_VALUE wert zugreifen (jetzt unabhängig von der template conf klasse)

echo "CMS_VALUE[1]";
//anderseits
$i =1;
echo $CMS_VALUE[$i];

und da kann es jetzt passieren das der zweite teil nicht das selbe ergebniss liefert...

der generierte php code würde nur mit deiner änderung wie folgt aussehen

Code: Alles auswählen

<?php $C10CMS_VALUE = "ein \\\"kurzer\\\" string"; ?>
muss aber wie folgt generiert werden..

Code: Alles auswählen

<?php $C10CMS_VALUE = \"ein \\\"kurzer\\\" string\"; ?>
sonst hat man irgendwann wieder mal den ganzen schmarren mit wo kommt dieser parse error wieder her... (deine änderung oben und die andere unten würde wieder ein anderes ergebniss bringen)

klar kann man es noch anders machen in dem man eine andere reihenfolge ausprogrammiert, es ändert aber nichts daran das zwei gegebenheiten nicht sauber umgesetzt sind...

die andere sache CMS_VALUE[x] sind an sich immer dafür gedacht so ausgegeben zu werden..

echo "CMS_VALUE[1]";

deshalb gibts ja auch die ersetzung

Code: Alles auswählen

$tmp = str_replace("\'", "'", $tmp);
echo 'CMS_VALUE[1]';
führt wie gesagt zu einem parse error sobald ein ' in dem platzhalter(CMS_VALUE[1]) zu finden ist...
*** make your own tools (wishlist :: thx)

DerEineDa
Beiträge: 17
Registriert: Mi 30. Nov 2005, 17:31
Kontaktdaten:

Beitrag von DerEineDa » Mo 16. Okt 2006, 16:51

Achso, danke. Ja, das macht Sinn was du sagst. Ich kann es zwar gerade nicht testen (was ich gerne würde), aber ich glaube dir das mal soweit.

Gesperrt