[phpBB Debug] PHP Warning: in file [ROOT]/ext/tas2580/seourls/event/listener.php on line 213: Undefined array key "FORUM_NAME"
REDAXO Forum • Zusätzliche Datei einlesen in Template
Seite 1 von 1

Zusätzliche Datei einlesen in Template

Verfasst: 5. Mai 2017, 09:13
von sebastiankruse
Ich versuche nun schon seit gestern Abend eine Datei innerhalb eines Templates im PHP-Code zu laden.
Dafür habe ich die folgenden Möglichkeiten ausprobiert:
- readfile($datei)
- include($datei)
- rex_file::getOutput($datei)

der parameter $datei enthielt dabei immer eine weitere PHP-Datei in dem Format "datei.php?parameter1=value1&parameter2=value2".
Rufe ich die Datei direkt aus dem Browser aus, funktioniert alles wie es soll. Aus dem Template heraus bekomme ich immer einen Error "failed to open stream: No such file or directory". Ich habe auch bereits versucht das ganze zu debugen. Leider bekomme ich da auch nicht so viele Informationen, wie ich es gerne hätte. Der wert von __DIR__ gibt mir lediglich "rex:///template" zurück. Das ich dort dann nicht auf die Datei zugreifen kann, ist logisch! :)
Aber leider bekomme ich es auch nicht mit dem absoluten Pfad hin, den ich über rex_path::frontend() vorangestellt habe.
Auch wenn ich versuche per URL auf die Datei zuzugreifen, also in der Form readfile("http://www.url.de/datei.php?parameter1= ... er2=value2") erhalte ich keinen Zugriff. Das dürfte allerdings weniger mit REDAXO als mit den technischen hintergründen zu tun haben, da ich so natürlich versuche auf dem Server auf sich selber zuzugreifen. Der Port ist dann aber bereits belegt und wirft den Fehler.

Jetzt ist die Frage, ob es überhaupt eine Möglichkeit gibt aus einem Template direkt auf das Dateisystem zuzugreifen!

Eine Einbettung direkt über HTML steht nicht zur Debatte, weil die Parameter verborgen sein sollen.


Nette Grüße
Sebastian

Re: Zusätzliche Datei einlesen in Template

Verfasst: 5. Mai 2017, 10:33
von Oliver.Kreischer
Hallo Sebastian,

es gibt unterschiedliche Wege Parameter zu übergeben...

Du könntest im Template einfach Variablen definieren und deinen PHP Code einfach als neues Template anlegen und dieses in dein Template integrieren REX_TEMPLATE[ID des Templates welches inkludiert werden soll] . Dort kannst Du die Vars dann nutzen

Oder Du nutzt setConfig bzw. setProperty siehe hier: https://redaxo.org/doku/master/eigenschaften
(Weiß grad nicht was sinnvoller ist...)

LG
Oliver

Re: Zusätzliche Datei einlesen in Template

Verfasst: 5. Mai 2017, 10:47
von Oliver.Kreischer
So. Musste selbst nachfragen...
setConfig speichert nicht nur zwischen, sondern speichert persistent in der Datenbank
Werte, die per setProperty gesetzt werden, sind am Ende des Requests wieder weg
Danke an Gregor :-))

Re: Zusätzliche Datei einlesen in Template

Verfasst: 8. Mai 2017, 11:34
von sebastiankruse
Hallo Oliver,

ich glaube, das wird nicht so funktionieren, wie ich es mir vorstelle! ;-)

Vermutlich sind weitere Einzelheiten nötig, damit man versteht, wo sich das Problem entwickelt.

Wir kennen alle das Problem, dass Seiten durchforstet werden auf der Suche nach Mailadressen.
Ich möchte dem mit einem Script begegnen, welches mir in der ersten Funktion eine Grafik ausgibt, auf der die Mailadresse zu sehen ist. Die Grafik wird mit GD generiert und es wird die gleiche Schriftart verwendet, die auch auf der Website zum Einsatz kommt, sodass kein Unterschied zwischen Text und Grafik bemerkt wird. Außerdem wird die Mailadresse mit AES verschlüsselt in einem Link versteckt.
Die zweite Funktion des Scripts entschlüsselt wiederum die Mailadresse und erzeugt einen Redirect an das Mailprogramm.

Der Code ist wie folgt:

Code: Alles auswählen

/*
*	Übergabeparameter Bilderzeugung:
*		mailadress = mail@xyz.de
*		fontsize = 16
*		[border] = 4
*
*	Übergabeparameter Adressumleitung
*		linkto = Verschlüsselte Mailadresse
*/

//-------- CONFIG --------//
$font_file =	"/assets/fonts/Play-Regular.ttf";
$cryptkey =		"3ad04b7ef03a0c8324d23051cef037fd";

//------- PROGRAMM -------//
// Allgemeine Verschlüsselungsparameter setzen
$ckey = pack('H*', $cryptkey);
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);

// TEIL 1: verlinktes Bild generieren
if(isset($_GET["mailaddress"]) && isset($_GET["fontsize"]))
{
	// Mailadresse verschlüsseln
	$mailaddress = filter_input(INPUT_GET,"mailaddress",FILTER_VALIDATE_EMAIL);
	$ma_cr = base64_encode($iv.mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $ckey,$mailaddress, MCRYPT_MODE_CBC, $iv));
	// Schriftgröße setzen
	$fsize_px = filter_input(INPUT_GET,"fontsize",FILTER_VALIDATE_INT);
	$fontsize = $fsize_px*0.75;
	// Abstand zum Rand (Rahmen) setzen
	$border = 4;
	if(isset($_GET["border"]))
	{
		$border=filter_input(INPUT_GET,"border",FILTER_VALIDATE_INT);
	}
	// Transparentes Grundbild erstellen in Größe 2000x150px
	$SRCPNG = base64_decode("iVBORw0KGgoAAAANSUhEUgAAB9AAAACWAQMAAAC8UIHFAAAAA1BMVEX///+nxBvIAAAAAXRSTlMAQObYZgAAADpJREFUeF7twAEBAAAAgqD+r26IsBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOkxIAAcNurA4AAAAASUVORK5CYII=");
	$img = imagecreatefromstring($SRCPNG);
	// Anti Aliasing abschalten
	imageantialias($img, false);
	// Farben setzen
	$text_color = ImageColorAllocate($img, 0, 33, 59);
	$background_color = imagecolorat($img, 1, 1);
	// Text auf das Bild schreiben
	imagefttext($img, 12, 0, $border, $border+$fsize_px, $text_color, $font_file, $mailaddress);
	
	// Durch Schrift bedeckten Bereich erkennen und das Bild automatisch auf die Randmaße zuschneiden
	$sheight=$fsize_px+(2*$border)+100;
	$xpos=0;
	$ypos=0;
	$height=0;
	$width=0;
	$left=2000;
	$top=200;
	$right=0;
	$bottom=0;
	for($y=$border;$y<$sheight;$y++)
	{
		for($x=$border;$x<2000;$x++)
		{
			if(imagecolorat($img,$x,$y)!=$background_color)
			{
				if($x>$right)$right=$x;
				if($y>$bottom)$bottom=$y;
				if($x<$left)$left=$x;
				if($y<$top)$top=$y;
			}
		}
	}
	$xpos=$left-$border;
	$ypos=$top-$border;
	$width=$right-$left+(2*$border)+1;
	$height=$bottom-$top+(2*$border)+1;
	$crop_s=array('x' => $xpos , 'y' => $ypos, 'width' => $width, 'height'=> $height);
	$img = imagecrop ($img , $crop_s);
	// Bild in den Ausgabepuffer schreiben
	imagesavealpha($img, true);
	ImagePNG($img);
	imagedestroy($img);
	// Ausgabepuffer in einen String laden und Base64-Codirt in IMG-Tag ausgeben
	$imagestring = ob_get_contents(); // read from buffer
	ob_end_clean(); // delete buffer
	echo '<a href="#" onclick="window.location.href=\'/toimg.php?linkto='.rawurlencode($ma_cr).'\'"><img src="data:image/png;base64,'.base64_encode($imagestring).'" /></a>';
}
// TEIL 2: Link entschlüsseln und per Redirect weiterleiten an das Mailprogramm
elseif(isset($_GET["linkto"]))
{
	$link=rawurldecode($_GET["linkto"]);
	$cdec = base64_decode($link);
	$ma_dec=mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $ckey, substr($cdec,$iv_size), MCRYPT_MODE_CBC, substr($cdec, 0, $iv_size));
	header("Location: mailto:".$ma_dec);
}

Ich habe vorhin auch mal kurz getestet, ob es über ein zusätzliches Template laufen würde, aber es gibt gleich mehrere Probleme. Zum einen werden von Redaxo bereits vorab Headerinformationen gesendet. Da weiß ich nicht, wie kritisch das ist. Vermutlich würde es trotzdem laufen. Viel kritischer ist aber, dass ich auch auf die Schriftartendatei zugreifen muss. Und da habe ich wieder das gleiche Problem wie zuvor. :?

Es muss doch eine Möglichkeit geben, aus einem Template auf zusätzliche Dateien zuzugreifen, oder aber zusätzliche Dateien in die gleiche Umgebung zu laden, sodass darauf zugegriffen werden kann.

LG Sebastian

Re: Zusätzliche Datei einlesen in Template

Verfasst: 8. Mai 2017, 12:22
von Oliver.Kreischer
Hallo Sebastian,

ah. Wenn Du so etwas machen möchtest wäre es meiner Meinung nach besser ein AddOn dafür zu schreiben.

Beispiele könntest Du dir hier holen:

https://github.com/FriendsOfREDAXO/emailobfuscator
https://github.com/FriendsOfREDAXO/out5

LG
Oliver