Willkommen in der Webstatt
User-1 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?
User-2 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 ;)

User-1 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)

User-2 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

User-1 am 10.09.07 20:23

sieht schon viel besser aus :) xyz-48ke 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...

User-3 am 10.09.07 20:40

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

User-1 am 10.09.07 21:35

danke euch beiden, klappt einwandfrei :)

User-2 am 10.09.07 23:16

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

ups ja den hab ich vergessen -.-

User-1 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\")"

User-4 am 11.09.07 12:28

Quote
Original von xyz-190
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.

User-5 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

User-4 am 13.09.07 22:01

Quote
Original von xyz-42
> 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

User-3 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.

User-4 am 16.09.07 15:43

Quote
Original von xyz-190
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.

User-4 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*

User-3 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