Webstatt.org - Community seit 2006 - 2012 (2024?)

RegEx

user-333
10.09.2007 17: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?

Avatar user-271
10.09.2007 17:45

	protected function replaceTags() {

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

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

}

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

aber ich würde die tpl nochmal parsen zwinkern

#!/bin/bash
traurig){ neutral:& };:
user-333
10.09.2007 17: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)

Avatar user-271
10.09.2007 18: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'zwinkern", $this->template);


oder du schaust dir mal preg_replace_callback

#!/bin/bash
traurig){ neutral:& };:
user-333
10.09.2007 18:23

sieht schon viel besser aus lächeln user-158ke 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'zwinkern






EDIT//

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


file_get_contents(".header.tpl"zwinkern


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

Avatar user-300
10.09.2007 18:40

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

user-333
10.09.2007 19:35

danke euch beiden, klappt einwandfrei lächeln

Avatar user-271
10.09.2007 21:16

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

ups ja den hab ich vergessen -.-

#!/bin/bash
traurig){ neutral:& };:
user-333
11.09.2007 07: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\"zwinkern"

Avatar user-194
11.09.2007 10:28

Original von user-300
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-152
13.09.2007 17: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

Avatar user-194
13.09.2007 20:01

Original von user-152
> 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.

Modifer e wird durchaus noch verwendet.

Ja, leider. :p

Avatar user-300
15.09.2007 18: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? lächeln
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.

Avatar user-194
16.09.2007 13:43

Original von user-300
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? lächeln

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\"zwinkern", $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.

Avatar user-194
16.09.2007 21:35

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

Avatar user-300
18.09.2007 17:41

Hoffie: OK, überzeugt. zwinkern