PHP SESSION

Fragen zur Installation von CONTENIDO 4.9? Probleme bei der Konfiguration? Hinweise oder Fragen zur Entwicklung des Systemes oder zur Sicherheit?
Antworten
josh
Beiträge: 156
Registriert: Do 24. Jun 2004, 09:25
Wohnort: Ahlen
Kontaktdaten:

PHP SESSION

Beitrag von josh »

Hallo,

bei mir funktionieren die PHP Session seit Contenido 4.9 nicht mehr.

Ich setze die Variable in Contenido und kann Sie dort auch wieder lesen.

Wenn ich aber in einer php-Datei den Wert abfragen will um ihm in einem Capcha anzuzeigen geht das nicht.
Das Captchabild wird angezeigt, aber ohne Sicherheitscode.
Wenn ich die Variable $text = "12345"; schreibe, wird dies auch im Captcha angezeigt.

Nur damit ich mich nicht "totsuche", habt ihr das aus Sicherheitsgründen unterbunden?

Code: Alles auswählen

<?php 


if (!defined("CON_FRAMEWORK")) {
    define("CON_FRAMEWORK", true);
}
   session_start(); 
   
   #Session lesen
   $text = $_SESSION['captchaspam'];
   //$text = "123545";
   header('Content-type: image/png'); 
   $img = ImageCreateFromPNG('captcha.PNG'); //Backgroundimage 
   $color = ImageColorAllocate($img, 125, 125, 125); //Farbe 
   $ttf = $_SERVER['DOCUMENT_ROOT']."/cms/jquery/captcha/Anorexia.ttf"; //Schriftart
   $ttfsize = 20; //Schriftgrösse 
   $angle = rand(0,5); 
   $t_x = rand(5,30); 
   $t_y = 35; 
   imagettftext($img, $ttfsize, $angle, $t_x, $t_y, $color, $ttf, $text); 
   imagepng($img); 
    imagedestroy($img);

?> 
homtata
Beiträge: 1145
Registriert: Mi 14. Jan 2004, 14:41
Kontaktdaten:

Re: PHP SESSION

Beitrag von homtata »

geht mir auch so, mit einem Captcha. Hab ewig gesucht und auch nix gefunden.
Im konkreten Fall wird im Formular das Captcha so erzeugt, dass ein Link auf eine externe php-Datei erzeugt wird, also der Bildlink heißt sowas wie:

src="image.php?create=x&numbers=7&captcha=9999"

Und da dieser Code der image.php nicht INNERHALB von Contenido läuft (er wird in diesen Fällen ja nicht per "include" aufgerufen), werden die dort benötigten Sessionvariablen offensichtlich nicht in Contenido berücksichtigt. Tadah.
Ich hab mir so geholfen für den Moment (weil es schnell gehen musste für ein Projekt), dass ich den Code der Datei "image.php" in ein Modul gepackt habe, das einem Artikel zugewiesen habe und den Link im Formular geändert habe in:

src="front_content.php?idart=(ArtikelnummerdesCaptchaModuls)&create=x&....."

Aber mich würde auch eher interessieren, wie man in den externen Dateien triggern kann, dass die zu Contenido "gehören" sollen. Geht sowas?
josh
Beiträge: 156
Registriert: Do 24. Jun 2004, 09:25
Wohnort: Ahlen
Kontaktdaten:

Re: PHP SESSION

Beitrag von josh »

Hallo,

kann uns jemand weiterhelfen?

Wir brauchen hier dringend mal einen Tipp.

Danke

josh
xmurrix
Beiträge: 3215
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Hat sich bedankt: 4 Mal
Danksagung erhalten: 17 Mal
Kontaktdaten:

Re: PHP SESSION

Beitrag von xmurrix »

Hallo zusammen,

wie habt ihr das Captcha im Frontend eingebunden? Ich meine, wie sieht der Modulcode aus, in der das Captcha eingesetzt wird?

Gruß
xmurrix
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.
josh
Beiträge: 156
Registriert: Do 24. Jun 2004, 09:25
Wohnort: Ahlen
Kontaktdaten:

Re: PHP SESSION

Beitrag von josh »

Hallo xmurix,

Das Bild wird generiert, aber ohne Zeichen.

Hier der Code:

session_start();
//Session schreiben
$_SESSION['captchaspam'] = $text;

...


echo ' <img style="margin-bottom:18px;" src="/cms/jquery/captcha/captcha.php" width="132" height="46" alt="Geben Sie die im Bild dargestellte Zeichenfolge ein" />'; //Captcha anzeigen

Den Code der captcha.php steht oben.

Ich kann extern in der captcha.php Session nicht auslesen welche in Contenido funktioniert.
Ich habe versuchsweise eine Session mit gleichem Namen in der captcha.php generiert. Wenn diese wird mir dann im Bild angezeigt.
Die Session in Contenido ist aber nicht überschrieben. Es ist als wenn es zwei Schichten sind die nichts durchlassen.

Viele Grüße

josh
josh
Beiträge: 156
Registriert: Do 24. Jun 2004, 09:25
Wohnort: Ahlen
Kontaktdaten:

Re: PHP SESSION

Beitrag von josh »

Hallo xmurrix,

kann es etwas damit zu tiun haben?
http://php.net/manual/de/session.security.php

Die Installation mit dem Beispielmandanten fragt ab ob Cookies zugelassen werden.
Kann es sein das es da eine Sperre in Contenido 4.9 gibt?

Viele Grüße

josh
xmurrix
Beiträge: 3215
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Hat sich bedankt: 4 Mal
Danksagung erhalten: 17 Mal
Kontaktdaten:

Re: PHP SESSION

Beitrag von xmurrix »

Hallo zusammen,

Sessions haben in CONTENIDO einen Sessionnamen, Name der Frontend-Sessions hat das Format Mandantenid + "frontend", z. B. "1frontend". Das Captcha setzt keinen Sessionnamen, somit sind beide Session füreinander unsichtbar. CONTENIDO weiß nichts von der Captcha-Session und andersherum...

Ihr können nun das Captcha folgendermaßen erweitern:

Die URL zum Captcha-Bild Generator bekommt die ID des Mandanten als Parameter:

Code: Alles auswählen

<img src="captcha.php?client=<?php echo $client ?>" alt="captcha" />
Dann verwendet ihr in captcha.php die Mandantenid für den Session-Namen:

Code: Alles auswählen

<?php
if (!defined("CON_FRAMEWORK")) {
    define("CON_FRAMEWORK", true);
}

// sessionname erstellen
$sessName = "";
if (isset($_GET["client"]) && is_numeric($_GET["client"])) {
    $sessName = $_GET["client"] . "frontend";
}

// zuerst sessionname setzen
session_name($sessName);

// dann session starten
session_start();

// ######## ab hier der übliche chaptcha code

// Session lesen
$text = $_SESSION['captchaspam'];
//$text = "123545";
header('Content-type: image/png'); 
$img = ImageCreateFromPNG('captcha.PNG'); //Backgroundimage 
$color = ImageColorAllocate($img, 125, 125, 125); //Farbe 
$ttf = $_SERVER['DOCUMENT_ROOT']."/cms/jquery/captcha/Anorexia.ttf"; //Schriftart
$ttfsize = 20; //Schriftgrösse 
$angle = rand(0,5); 
$t_x = rand(5,30); 
$t_y = 35; 
imagettftext($img, $ttfsize, $angle, $t_x, $t_y, $color, $ttf, $text); 
imagepng($img); 
imagedestroy($img);
So sollte auch die Sessionvariable, die in captcha.php gesetzt wurde, in CONTENIDO verfügbar sein.

Besser wäre es hier, wenn man in captcha.php CONTENIDO initialisiert und die Frontendsession initialisiert. Aber das ist dann auch einiges an Code.
Im folgenden Beispiel gehen wir davon aus, dass das Script direkt im Mandantenverzeichnis (cms) liegt:

Code: Alles auswählen

<?php

if (!defined('CON_FRAMEWORK')) {
    define('CON_FRAMEWORK', true);
}

global $contenido_path, $cfg;

// Set path to current frontend
$frontend_path = str_replace('\\', '/', realpath(dirname(__FILE__) . '/')) . '/';

// Set current working directory to frontend path
$current_working_dir = getcwd();
chdir($frontend_path);

/*
* Do not edit this value!
*
* If you want to set a different enviroment value please define it in your .htaccess file
* or in the server configuration.
*
* SetEnv CON_ENVIRONMENT development
*/
if (!defined('CON_ENVIRONMENT')) {
    if (getenv('CONTENIDO_ENVIRONMENT')) {
        $sEnvironment = getenv('CONTENIDO_ENVIRONMENT');
    } elseif (getenv('CON_ENVIRONMENT')) {
        $sEnvironment = getenv('CON_ENVIRONMENT');
    } else {
        // @TODO: provide a possibility to set the environment value via file
        $sEnvironment = 'production';
    }

    define('CON_ENVIRONMENT', $sEnvironment);
}

// Include the config file of the frontend to initialize client and language id
include_once($frontend_path . 'data/config/' . CON_ENVIRONMENT . '/config.php');

// CONTENIDO startup process
if (!is_file($contenido_path . 'includes/startup.php')) {
    die("<h1>Fatal Error</h1><br>Couldn't include CONTENIDO startup.");
}
include_once($contenido_path . 'includes/startup.php');

// Clients local configuration
if (file_exists($frontend_path . 'data/config/config.local.php')) {
    @include ($frontend_path . 'data/config/config.local.php');
}

// Bootstrap Frontend session
cRegistry::bootstrap(array(
    'sess' => 'cFrontendSession',
));

chdir($current_working_dir);

// ######## ab hier der übliche chaptcha code

// Session lesen
$text = $_SESSION['captchaspam'];
//$text = "123545";
header('Content-type: image/png'); 
$img = ImageCreateFromPNG('captcha.PNG'); //Backgroundimage 
$color = ImageColorAllocate($img, 125, 125, 125); //Farbe 
$ttf = $_SERVER['DOCUMENT_ROOT']."/cms/jquery/captcha/Anorexia.ttf"; //Schriftart
$ttfsize = 20; //Schriftgrösse 
$angle = rand(0,5); 
$t_x = rand(5,30); 
$t_y = 35; 
imagettftext($img, $ttfsize, $angle, $t_x, $t_y, $color, $ttf, $text); 
imagepng($img); 
imagedestroy($img);
Gruß
xmurrix
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.
josh
Beiträge: 156
Registriert: Do 24. Jun 2004, 09:25
Wohnort: Ahlen
Kontaktdaten:

Re: PHP SESSION

Beitrag von josh »

Danke Murat,

Ich probiere das morgen aus und melde mich dazu.

Habe heute den ganzen Tag nach einer Lösung gesucht, bis hin zum Speicherplatz auf dem Server wo die Sessions gespeichert werden. Die neue Contenido Version hat schon einiges verändert. Ich Kämpfe mich durch. Wenn mir etwas auffällt was nicht funktioniert setze ich es ins Forum.

Du hast mir sehr geholfen.

Viele Grüsse

Josh
josh
Beiträge: 156
Registriert: Do 24. Jun 2004, 09:25
Wohnort: Ahlen
Kontaktdaten:

Re: PHP SESSION

Beitrag von josh »

Hallo xmurrix,

die erste Variante funktioniert!

Das initialisieren der captcha.php funktioniert nicht.
Besser wäre es hier, wenn man in captcha.php CONTENIDO initialisiert und die Frontendsession initialisiert. Aber das ist dann auch einiges an Code
Die Pfade habe ich angepasst, sonst kommt eine Fehlermedung:
$frontend_path = '/srv/www/web81/web/';
$contenido_path = '../../../contenido/';

wo kommt der Wert in $contenido_path her?
gibt es in der folge weitere Variablen die so nicht passsen?
Wenn ich captcha.php von /cms/ aus aufrufe funktioniert es.

Es ist irgendein Problem mit den Pfaden. Ich brauche das noch für andere
Module...

Viele Grüße

josh
xmurrix
Beiträge: 3215
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Hat sich bedankt: 4 Mal
Danksagung erhalten: 17 Mal
Kontaktdaten:

Re: PHP SESSION

Beitrag von xmurrix »

Hallo josh,

das Initialisieren von CONTENIDO in der captcha.php oder in einem anderen Script, kann je nach Lage des Scriptes etwas anders ausfallen.

Bei Beispiel von vorhing ging ich davon aus, dass das Script direkt im Mandantenordner liegt. Je nachdem, wo es ist, kann der Pfad zum Frontend, also der Wert in $frontend_path anders ausfallen.

Man kann es, so wie du es gemacht hast, fest angeben, oder man ermittelt es dynamisch. Ich habe das Beispiel nun etwas angepasst, so dass es das aktuelle Arbeitsverzeichnis kurzfristig ändert, um CONTENIDO zu initialisieren. Dann spielt es keine Rolle, wo das Script genau liegt, es muss nur noch die Variable $frontend_path korrekt gesetzt sein.
...wo kommt der Wert in $contenido_path her?...
Die Variable $contenido_path ist der relative Pfad zum CONTENIDO Backend (.../contenido/) vom Mandantenverzeichnis (.../cms/) und hat immer den Wert "../contenido/". Das Funktioniert aber nicht, wenn du die Mandantenkonfiguration aus einem anderen Verzeichnis als Mandantenverzeichnis (.../cms/) einbindest.
...gibt es in der folge weitere Variablen die so nicht passsen?...
Eigentlich nicht. Willst du CONTENIDO in einem eigenen Script initialisieren, welches nicht direkt unterhalb vom Mandantenverzeichnis (.../cms/) liegt, solltest du folgenden Code verwenden:

Code: Alles auswählen

<?php

if (!defined('CON_FRAMEWORK')) {
    define('CON_FRAMEWORK', true);
}

global $contenido_path, $cfg;

//## Pfad zum Frontend (Mandantenverzeichnis), das kann je nach Installation anders sein!
$frontend_path = str_replace('\\', '/', realpath(dirname(__FILE__) . '/')) . '/';
//## oder auch
//## $frontend_path = $_SERVER['DOCUMENT_ROOT'] . '/cms/';

//## Das aktuelle Arbeitsverzeichnis merken und zum Mandantenverzeichnis wechseln. Das ist nötig um CONTENIDO zu
//## korrekt initialisieren, ohne jedes Mal die Variable $contenido_path anpassen zu müssen. Ist der Wert in
//## $contenido_path ein absoluter Pfad, kann man sich das Wechseln des Arbeitsverzeichnises sparen...
$current_working_dir = getcwd();
chdir($frontend_path);

/*
* Do not edit this value!
*
* If you want to set a different enviroment value please define it in your .htaccess file
* or in the server configuration.
*
* SetEnv CON_ENVIRONMENT development
*/
if (!defined('CON_ENVIRONMENT')) {
    if (getenv('CONTENIDO_ENVIRONMENT')) {
        $sEnvironment = getenv('CONTENIDO_ENVIRONMENT');
    } elseif (getenv('CON_ENVIRONMENT')) {
        $sEnvironment = getenv('CON_ENVIRONMENT');
    } else {
        // @TODO: provide a possibility to set the environment value via file
        $sEnvironment = 'production';
    }

    define('CON_ENVIRONMENT', $sEnvironment);
}

// Include the config file of the frontend to initialize client and language id
include_once($frontend_path . 'data/config/' . CON_ENVIRONMENT . '/config.php');

// CONTENIDO startup process
if (!is_file($contenido_path . 'includes/startup.php')) {
    die("<h1>Fatal Error</h1><br>Couldn't include CONTENIDO startup.");
}
include_once($contenido_path . 'includes/startup.php');

// Clients local configuration
if (file_exists($frontend_path . 'data/config/config.local.php')) {
    @include ($frontend_path . 'data/config/config.local.php');
}

// Bootstrap Frontend
cRegistry::bootstrap(array(
    'sess' => 'cFrontendSession', //## Optional, wenn Session benötigt wird
    'auth' => 'cAuthHandlerFrontend',  //## Optional, wenn Authentifizierung benötigt wird
    'perm' => 'cPermission' //## Optional, wenn Berechtigungssystem benötigt wird
));

//## Wieder zum Ursprungsverzeichnis wechseln
chdir($current_working_dir);

//## CONTENIDO Initialisierung abgeschlossen, ab hier kann man mit dem Script fortfahren

Habe wichtige Stellen mit einem "//##" Präfix versehen und kommentiert.

Bedenke aber, dass das jetzt nicht offiziell ist. Es kann sein, dass das in Zukunft vereinfacht wird oder geändert wird. Momentan würde es so funktionieren. Du könntest den Code, sofern es öfters verwendet werden soll, auch in ein Include packen und überall das Include einbinden, das bleibt dir überlassen.

Für die Zukunft würde ich mir wünschen, dass man CONTENIDO einfacher in externen Scripten einbinden und initialisieren kann. Bin mir sicher, dass das auch noch kommt.

Gruß
xmurrix
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.
josh
Beiträge: 156
Registriert: Do 24. Jun 2004, 09:25
Wohnort: Ahlen
Kontaktdaten:

Re: PHP SESSION

Beitrag von josh »

Hallo Murat,

es funktioniert alles wunderbar.
Das werde ich noch gut gebrauchen können.
Aber auch ein wichtiger Beitrag hier im Forum.

Danke nochmal für die Hilfe!!!

Viele Grüße

josh
homtata
Beiträge: 1145
Registriert: Mi 14. Jan 2004, 14:41
Kontaktdaten:

Re: PHP SESSION

Beitrag von homtata »

Begeisterung!

Wie bei Josh auch funktioniert bei mir Variante 1 tadellos und ich muss keine Ordner ändern, sondern nur Dateien tauschen und den Modulcode leicht erweitern ;-)

:idea: (eine Leuchte für xmurrix zwischendurch)
Antworten