Willkommen in der Webstatt Zum Webstatt Blog und Stories
trefixxx am 10.09.07 19:34

Hallo zusammen,
momentan baue mir eine Templateklasse auf, stoße aber hier auf ein Problem.

Und zwar möchte ich das/den Tag {include file="file.tpl"} in den Templates nutzen, um andere Dateien zu inkludieren. Ich weiß allerdings nicht, wie ich file.php auslesen und in die include-funktion (in diesem fall file_get_content() ) einsetzen kann.

Meine momentane funktion lautet wie folgt:

protected function replaceTags() {

protected $DelimiterLe = "\{";
protected $DelimiterRi = "\}";

$this->template = preg_replace("/".$this->DelimiterLe."include file=\"(.*).(.*)\"".$this->DelimiterRi."/isU", file_get_content($hiermussdiedateihin), $this->template);

}


Kann mir jemand sagen, wie das funktioniert?

netcup.de Warum gibt es hier Werbung?
nuit nuit am 10.09.07 19:45

protected function replaceTags() {

protected $DelimiterLe = "\{";
protected $DelimiterRi = "\}";

$this->template = preg_replace("/".$this->DelimiterLe."include file=\"(.*).(.*)\"".$this->DelimiterRi."/isU", file_get_content("\\1.\\2"), $this->template);

}

wenn mich nicht alles täuscht, aber ich bin seeeehr müde

aber ich würde die tpl nochmal parsen ;)

trefixxx am 10.09.07 19:50

funktioniert leider nicht (auch mit tpl)...

Warning: file_get_contents(\1.\2) [function.file-get-contents]: failed to open stream: No such file or directory in ***class.template.php on line 58 (Das ist diese Zeile)

nuit nuit am 10.09.07 20:14

jaaa ich bin auch blöd -.-

gaaanz anders...die funtkion, die du aufrufen msust, muss so sein:
$this->template = preg_replace("/".$this->DelimiterLe."include file=\"(.*).(.*)\"".$this->DelimiterRi."/isU","file_get_content('\\1.\\2')", $this->template);

oder du schaust dir mal preg_replace_callback

trefixxx am 10.09.07 20:23

sieht schon viel besser aus :) Danke für die Bemühungen... funktioniert aber leider noch nicht ganz.
Jetzt parst er nämlich einfach den aufruf der funktion. Und die

file_get_contents('.eader.tpl')





EDIT//

hiermit gibt er folgendes aus
$this->template = preg_replace("/".$this->DelimiterLe."include file=\"(.*)(.*)\"".$this->DelimiterRi."/isU","file_get_contents(\"\\1.\\2\")", $this->template);

file_get_contents(".header.tpl")

Allerdings parst er es immernoch (wenn ich die " wegnehme, zeigt er einige Fehler an) und der . vor der Datei darf natürlich auch nicht sein...

sili sili am 10.09.07 20:40

Du brauchst den e Modifier, dann sollte es gehen, wenn du die Funktion als String einbaust.

trefixxx am 10.09.07 21:35

danke euch beiden, klappt einwandfrei :)

nuit nuit am 10.09.07 23:16

Quote
Original von sili
Du brauchst den e Modifier, dann sollte es gehen, wenn du die Funktion als String einbaust.

ups ja den hab ich vergessen -.-

trefixxx am 11.09.07 09:18

Kann mir jemand vielleicht nochmal erklären, wieso die Funktion in " " gesetzt wird?
Und was \\1 und \\2 bedeutet? sind das die Plathhalter für (.*)?

"file_get_contents(\"\\1.\\2\")"

hoffie hoffie am 11.09.07 12:28

Quote
Original von sili
Du brauchst den e Modifier, dann sollte es gehen, wenn du die Funktion als String einbaust.

Den verwendet man aber nicht (mehr). PCRE ist sehr mächtig, das durchschaut kaum einer komplett und es ist SO leicht das Quoting zu verkacken und schwupps führt jeder PHP-Code aus.
preg_replace_callback ist nicht umsonst da.

CIX88 am 13.09.07 19:40

> Den verwendet man aber nicht (mehr).

Naja ganz so ist es nun nicht.
Bei einfachen Geschichten ist die Anwendung mit Modifer e etwas schneller als eine zusätzliche Callback-Funktion.

Der Handlungsspielraum bei Modifer e nicht so groß, dafür einfacher.
Erst bei komplexen Geschichten macht die Callback-Sache einen Sinn.

Modifer e wird durchaus noch verwendet.

Vielleicht bingt dich dieses Script auf eine andere Idee:
http://www.cix88.de/cix_php/php_web/cix_replace_mit_include.php

hoffie hoffie am 13.09.07 22:01

Quote
Original von CIX88
> Den verwendet man aber nicht (mehr).

Naja ganz so ist es nun nicht.
Bei einfachen Geschichten ist die Anwendung mit Modifer e etwas schneller als eine zusätzliche Callback-Funktion.

Der Handlungsspielraum bei Modifer e nicht so groß, dafür einfacher.
Erst bei komplexen Geschichten macht die Callback-Sache einen Sinn.

Kann gut sein dass es einfacher / schneller ist, aber auch wesentlich fehleranfälliger. Ich würde selbst für einfachste Sachen preg_replace_callback bevorzugen.

Quote
Modifer e wird durchaus noch verwendet.

Ja, leider. :p

sili sili am 15.09.07 20:53

Hoffie: Ganz so einfach ist es wohl nicht, da eine Code Injection zu machen. PHP escaped die Teile die ersetzt werden ja jeweils noch. Oder kennst du vielleicht ein konkretes Beispiel? :)
Allgemein, und besonders bei komplexeren Ersetzungen, ist sicherlich preg_replace_callback() vorzuziehen. Wenn aber nur ein Befehl aufgerufen werden soll, finde ich das ganz ok so. Wirklich übersichtlich und sinnig ist es aber nicht, wenn ein Befehl quasi als String maskiert wird.

hoffie hoffie am 16.09.07 15:43

Quote
Original von sili
Hoffie: Ganz so einfach ist es wohl nicht, da eine Code Injection zu machen. PHP escaped die Teile die ersetzt werden ja jeweils noch. Oder kennst du vielleicht ein konkretes Beispiel? :)

Ich habe ja nichtmal behauptet, dass obiger konkreter Code wirklich exploitbar ist. Es passiert einfach nur verdammt schnell, dass der Code exploitbar wird -- durch irgendeine Mini-Änderung an die man vielleicht nicht denkt.
Besonders lustig finde ich jetzt die Tatsache, dass obiger Code tatsächlich exploitbar ist:
// das sind nur Beispiel-Werte:
$delimiterLe = '\[';
$delimiterRi = '\]';
// Template-Code, auf den eventuell User mit weniger Rechten Einfluss haben:
$tpl = '[include file="{${exit(exploitable)}}"]';
// Code aus dem Original-Post, nur wie vorgeschlagen mit e-Modifier und Variablennamen vereinfacht
$tpl = preg_replace("/".$delimiterLe."include file=\"(.*)(.*)\"".$delimiterRi."/iseU","file_get_contents(\"\\1.\\2\")", $tpl);
echo "code nicht verwundbar";

Ausgabe: exploitable (und nicht: code nicht verwundbar)

Und auch wenn PHP mit addslashes() versucht, das ganze zu entschärfen, kann man damit durchaus beliebigen Code ausführen.
Mit Single-Quotes im Replace-Teil wäre das nicht passiert. Das soll jetzt nicht heißen, dass ich das in Single-Quotes ändern würde, sondern lediglich demonstrieren, wie leicht man mit preg_replace + e-Modifier fatale Fehler basteln kann.

hoffie hoffie am 16.09.07 23:35

Welch Zufall, sagt Herr Esser doch tatsächlich heute was zu dem Thema: http://forum.hardened-php.net/viewtopic.php?id=354 *g*

sili sili am 18.09.07 19:41

Hoffie: OK, überzeugt. ;)

Creative Commons Lizenzvertrag
Alle Inhalte des Webstatt-Archivs stehen unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz.

Impressum & Kontakt