Zitat von piratos
Beitrag anzeigen
OT-Teil von: mysql table soll include einbinden
Einklappen
X
-
Zitat von h3ll Beitrag anzeigenAlso kurz gesagt: Wenn ein Fehler auftritt, ist immer derjenige Schuld, der das Template geschrieben hat, und niemals Smarty selber. Hab ich das korrekt so zusammengefasst?
Kommentar
-
Zitat von piratos Beitrag anzeigenTut mir leid, jeder der sich mal mit CMS - Entwicklung beschäftigt hat wird dir sagen, das dieses ein gediegener Unsinn ist - veraltete Ansicht.
Ob das nun direkter Code ist oder indirekter (z.B. Smarty) ist dabei völlig unerheblich.
Kann der CMS-User in eine Textarea beliebigen PHP-Code schreiben, der wird dann in der DB gespeichert und beim Aufruf der Seite ge-eval't?
Junge junge, so ein Produkt würde ich niemandem empfehlen!
Was du weiter oben beschreibst, lösen andere CMS ungefähr so: Ein Modul bietet einen Block an. Der CMS-User kann den Block auf der Seite platzieren und ggf. konfigurieren. Bei der Konfiguration kann er vielleicht weitere Blöcke von anderen Modulen "einbetten". Dazu genügt aber ein Auswahldialog und ggf. weitere Konfigurationsschritte. Der CMS-User muss und darf keine einzige Zeile Code schreiben. Das ist sicher. Das ist einfach. Das ist gut.
Kommentar
-
Zitat von piratos Beitrag anzeigenSmarty selbst ist seit langer Zeit so gut wie Bug frei, die Frage kannst du dir selbst bestätigen.
Kommentar
-
Zitat von onemorenerd Beitrag anzeigenIch kenne dein CMS nicht.
Vielleicht hast du auch schon mal was von Rechten gehört und dem Unterschied zwischen ein CMS und einem Portalsystem.
Ich schreibe keine Portalsysteme als Opensource.
Kommentar
-
Habs inzwischen mal runtergeladen und nach eval() gesucht. Erster Fundort /lib/classes/class.usertagoperations.inc.php:54
PHP-Code:if (!(@eval('function '.$functionname.'(&$params, &$smarty) {'.$code.'}') === FALSE))
$result = call_user_func_array($functionname, array(&$params, &$smarty));
PHP-Code:@ob_start();
if (eval('function testfunction'.rand().'() {'.$code.'}') === FALSE)
{
$error[] = lang('invalidcode');
$buffer = ob_get_clean();
$error[] = preg_replace('/<br \/>/', '', $buffer );
$validinfo = false;
}
else
ob_end_clean();
Was passiert, wenn der CMS-User "} unlink(__FILE__); {}" eingibt?Zuletzt geändert von onemorenerd; 06.10.2009, 16:39.
Kommentar
-
eval in Templates ist ja eine Sache, um sehr einfach irgendwelche foreachs, etc. in HTML einzubetten, hat so aber nichts mit Smarty zu tun, weil dieses im Endeffekt nur wieder PHP erzeugt und per include + ob rendert.
Deine function-Konstrukte sehen dagegen sehr abenteuerlich aus. Schon mal php -l auf der CLI verwendet? In Kombination mit einer temporären Datei oder Shell-Pipes eine klasse und saubere Sache.
Kommentar
-
Zitat von piratos Beitrag anzeigenUnd von den zahlosen Templateengines die ohne eval das machen können hätte ich gerne noch weitere Referenzen.
Das ist übrigens die erste Template Engine, die ich kenne, die sich für DSLs eignet. Denn man kann die Template-Sprache nicht nur erweitern, sondern auch bestehende Tags überschreiben und sogar den AST manipulieren. Das sind Features, die PHP als Template Engine nicht bietet und damit hat Twig eine echte Daseinsberechtigung.
Kommentar
-
Zitat von onemorenerd Beitrag anzeigenHabs inzwischen mal runtergeladen und nach eval() gesucht. Erster Fundort /lib/classes/class.usertagoperations.inc.php:54 ... Du verwendest eval() hier beide Male um zu prüfen, ob der Code, der offensichtlich vom CMS-User eingegeben wurde, valider PHP-Code ist. Liege ich damit richtig?
Was passiert, wenn der CMS-User "} unlink(__FILE__); {}" eingibt?
Da gibts eine Riesenmenge von Userkommentaren, die das PHP-Syntax-Checking-per-Eval()-Problem in den Griff zu bekommen versuchen. Da werden geschweifte Klammern gezählt und halbe PHP-Quellcode-Parser gebaut. Einige Ansätze funktionieren sogar. ;-)
Die Funktion selbst war leider nur kurze Zeit offizieller Bestandteil von PHP.
Kommentar
-
Zitat von onemorenerd Beitrag anzeigenIch kenne dein CMS nicht. Erzähl doch mal, wie es funktioniert!
Kann der CMS-User in eine Textarea beliebigen PHP-Code schreiben, der wird dann in der DB gespeichert und beim Aufruf der Seite ge-eval't?
Junge junge, so ein Produkt würde ich niemandem empfehlen!
Aber ja,
Ich würde den Code einmal aus der DB lesen und in eine Datei schreiben(cachen).
Das erspart doch die DB Abfrage.
Kommentar
-
Zitat von ragtek Beitrag anzeigenDas vB macht es zB so
@fireweasel: Syntaxprüfung ist (wäre?) zwar nett, schützt aber nicht vor semantisch "böswilligem" Code. Das geht nur durch kontrolliertes Ausführen in einer Sandbox (z.B. VM). Im Webumfeld völlig abwegig.
Kommentar
-
Zitat von onemorenerd Beitrag anzeigenWußte ich gar nicht, habe vB aber auch noch nie verwendet oder weiterempfohlen. Werde ich auch nicht.Parse error: syntax error, unexpected T_STRING in /home/medkaau/public_html/vb/index.php(565) : eval()'d code on line 2
@fireweasel: Syntaxprüfung ist (wäre?) zwar nett, schützt aber nicht vor semantisch "böswilligem" Code. Das geht nur durch kontrolliertes Ausführen in einer Sandbox (z.B. VM). Im Webumfeld völlig abwegig.
Ich bin zwar kein notorischer eval()-Gegner, aber wer diese Funktion anwendet, sollte ganz genau wissen, was er oder sie tut. Die meisten wissen das offensichtlich nicht.
Kommentar
-
Nur um auf Pluginsysteme zurückzukommen.
Im Endeffekt ist es doch egal, ob ein System eval oder etwas anderes benutzt, das eigentliche Problem liegt wie immer beim Benutzer.
Es ist doch egal ob man ein System durch Dateiänderungen laut Anweisung, eval oder require_once verändert.
Über jede von den genannten Möglichkeiten kann böser Code eingeschleust werden
Kommentar
Kommentar