php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben || php-forumjetzt anmelden
 

PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 04-05-2022, 01:23
jenny258
 Registrierter Benutzer
Links : Onlinestatus : jenny258 ist offline
Registriert seit: May 2022
Beiträge: 17
jenny258 befindet sich auf einem aufstrebenden Ast
Standard PHP MVC Sessions

Hallo,

ich arbeite zur Übung mit diesem MVC Framework. https://github.com/codewithdary/MVCF...r/mvcframework

Jetzt habe ich allerdings ein Problem mit den Sessions.
Ich hatte zuerst eine Klasse mit den üblichen Methoden. Jedoch bekam ich da immer den Header sent fehler.

Jetzt arbeite ich mit einer session helper funktion.

Diese wird überall eingebunden und zu beginn die session gestartet
<?php
session_start();

zwei funktionen lauten:

function setCsrf(){
//echo bin2hex(random_bytes(32));
$_SESSION['_token'] = bin2hex(random_bytes(32));
return $_SESSION['_token'];
}

function getCsrf(){
return $_SESSION['_token'] ?? false;
}

diesen token übergebe ich bei jeder POST übermittlung. Mein Problem ist jedoch, dass die token nie übereinstimmen.

<input type="hidden" name="_token" value="<?php echo setCsrf();?>">

im Controller hole ich mir den token:
$sess = getCsrf();

&& ($_POST['_token'] == $sess ))

Warum stimmen diese tokens nie überein? Hat jemand eine Idee bzw weiß woran das liegt=?

Vielen Dank schon mal im Voraus
ACHTUNG (ich bin anfänger, und hoffe, dass ich mich einigermaßen verständlich ausgedrückt habe)
Mit Zitat antworten
  #2 (permalink)  
Alt 04-05-2022, 09:44
ArneDrews
 Registrierter Benutzer
Links : Onlinestatus : ArneDrews ist offline
Registriert seit: Jan 2016
Beiträge: 44
ArneDrews befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Warum stimmen diese tokens nie überein?
Wer sagt das? Du postest nur die Hälfte des relevanten Codes, so dass man raten müsste.

Mach mal ein var_dump() und schau, was wirklich in $_POST und $_SESSION enthalten ist. Ich könnte mir vorstellen, dass es an einer anderen Bedingung im IF liegt, immerhin ist in Deinem Code-Ausschnitt ein && zu sehen, was darauf hinweist, dass Du uns den linken Teil verheimlichst.

und btw.
Zitat:
Ich hatte zuerst eine Klasse mit den üblichen Methoden. Jedoch bekam ich da immer den Header sent fehler.
Das sind klassische Fehler, die man beheben kann und sollte, bevor man alles umbaut.
Mit Zitat antworten
  #3 (permalink)  
Alt 04-05-2022, 13:53
jenny258
 Registrierter Benutzer
Links : Onlinestatus : jenny258 ist offline
Registriert seit: May 2022
Beiträge: 17
jenny258 befindet sich auf einem aufstrebenden Ast
Standard

Hallo, erstmal danke für deine Antwort
Ich wollte keinen Code verheimlichen. Ich habe nur versucht, dass wichtigste rauszuholen.

Du hast mir jetzt Mut gemacht, es mit der Session Klasse nochmal in Angriff zu nehmen. Ich versuche alles unterzubringen was ich bis dato alles versucht habe.

1. Schritt: Ich habe den Code von Github minimal umgebaut um auch den composer nutzen zu können. Der Code hat danach wie davon fehlerfrei funktioniert.

Meine Session Klasse befindet sich im lib folder:

<?php
namespace app\lib;


class Session{
private static $instanz=NULL;

private function __construct(){}

public static function init(){
if( is_null(self::$instanz) ){
self::$instanz = new Session;
self::sessionStart();
}
return self::$instanz;
}

private static function sessionStart(){

/* if( empty(session_id()) && !headers_sent()){
session_start();
} */

if( session_status() !== PHP_SESSION_ACTIVE ){
session_start();
};
}

public function sessionDelete(){
$this->instanz = NULL;
session_destroy();
$_SESSION = [];
}

public function setLoginData(){
$_SESSION['login'] = $_SERVER['REMODE_ADDR'].' '.$_SERVER['HTTP_USER_AGENT'];
}

public function checkLoginData(){
return $_SESSION['login'] == $_SERVER['REMODE_ADDR'].' '.$_SERVER['HTTP_USER_AGENT'] ? true : false;
}

public function __set($key, $value){
$_SESSION[$key] = $value;
}

public function __get($key){
return $_SESSION[$key] ?? '';
}

public function setCsrf(){
//echo bin2hex(random_bytes(32));
$_SESSION['_token'] = bin2hex(random_bytes(32));
return $_SESSION['_token'];
}

public function getCsrf(){
return $_SESSION['_token'] ?? false;
}

}


2. Schritt:

Template:

Code am anfang:

<?php require_once APPROOT . '../views/layouts/header.php' ?>
<?php require_once APPROOT . '../views/layouts/navbar.php' ?>

<?php
use app\lib\Session;

?>

<div class="container py-5">html ...... form

Hidden field:

<input type="hidden" name="_token" value="<?php echo Session::init()->setCsrf();?>">
<button type="submit" class="btn btn-dark">speichern</button>


3. Schritt:
Controller:

Session KLasse wird eingebunden:
<?php

namespace app\controllers;

use app\lib\Controller;
use app\models\User;
use app\lib\Session;
use Gump;


class Users extends Controller{ .... bla bla


if(!empty($_POST)){

$sess = Session::init()->getCsrf();
var_dump('sess CONTROLLER: ',$sess);
echo '<hr>';
var_dump('POST TOKEN', $_POST['_token']);


if ( ($_SERVER['REQUEST_METHOD']=='POST') && ($_POST['_token'] == $sess )) {


NACH DER VALIDIERUNG:


$_POST = [];
$sess->sessionDelete();

return $this->view('users/create', $data);


Bis zur Validierung komme ich allerdings nicht, denn sofort:

string(17) "sess CONTROLLER: " bool(false) string(10) "POST TOKEN" string(249) "
Warning: session_start(): Cannot start session when headers already sent in ...\mvcJennyNeu\app\lib\Session.php on line 25
9885739650a8cadb99a2a055751347b257fc6c2177f3efc4764888d7582931ed"

Die Zeile 25 in der Session Klasse ist : session_start();

Ich habe sehr viele Möglichkeiten bereits ausprobiert und natürlich schon alle möglichen Hilfestellungen durchgelesen. (session immer am anfang vor html) keine leerzeichen beim schließenenden PHP tag usw...

Falls du noch weitere Codeteile benötigst, einfach schreiben
Danke sehr
Mit Zitat antworten
  #4 (permalink)  
Alt 04-05-2022, 14:53
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.883
h3ll wird schon bald berühmt werden
Standard

"Cannot start session when headers already sent in ..."

Im verheimlichten Teil (...) liegt die Erklärung, wo die Fehlerursache ist. Bzw. wenn es dort nicht steht, dann kannst du es mit headers_sent() ermitteln.

Geändert von h3ll (04-05-2022 um 14:58 Uhr)
Mit Zitat antworten
  #5 (permalink)  
Alt 04-05-2022, 14:58
jenny258
 Registrierter Benutzer
Links : Onlinestatus : jenny258 ist offline
Registriert seit: May 2022
Beiträge: 17
jenny258 befindet sich auf einem aufstrebenden Ast
Standard

welcher Teil ?

Lg
Mit Zitat antworten
  #6 (permalink)  
Alt 04-05-2022, 14:59
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.883
h3ll wird schon bald berühmt werden
Standard

Irgendwo in der Fehlermeldung müsste stehen "output started at" und darauf folgt die fehlerhafte Stelle. Wenn nicht, dann wie gesagt mit headers_sent() ermitteln, wo die Ausgabe stattgefunden hat.
Mit Zitat antworten
  #7 (permalink)  
Alt 04-05-2022, 15:07
jenny258
 Registrierter Benutzer
Links : Onlinestatus : jenny258 ist offline
Registriert seit: May 2022
Beiträge: 17
jenny258 befindet sich auf einem aufstrebenden Ast
Standard

Wie ermittlet man den headers_send ?
Wie gesagt ich bin am üben und noch Anfänger.

Ich habe die ganze fehlermeldung kopiert. Ich kann auch gerne einen Screen davon machen, aber da steht nur das was ich schon gepostet habe.
Mit Zitat antworten
  #8 (permalink)  
Alt 04-05-2022, 15:09
jenny258
 Registrierter Benutzer
Links : Onlinestatus : jenny258 ist offline
Registriert seit: May 2022
Beiträge: 17
jenny258 befindet sich auf einem aufstrebenden Ast
Standard

das steht in meiner index.php (public) für FM


<?php
error_reporting(-1);
ini_set('display_errors', 'On');


require_once '../vendor/autoload.php';
require_once '../app/require.php';


//phpinfo();
Mit Zitat antworten
  #9 (permalink)  
Alt 04-05-2022, 15:18
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.883
h3ll wird schon bald berühmt werden
Standard

PHP-Code:
if (!headers_sent($filename$linenum)) {
    
header ('Location: http://www.example.com/');
    exit;

// Wahrscheinlich wollen Sie hier eine Fehlermeldung auslösen
} else {

    echo 
"Header bereits gesendet in $filename in Zeile $linenum\n" .
         
"Redirect nicht moeglich, klicken Sie daher statt dessen <a " .
         
"href=\"http://www.example.com\">diesen Link</a> an\n";
    exit;

Von: https://www.php.net/manual/de/function.headers-sent.php

Statt dem header() Aufruf gehört halt dein session_start() rein.
Mit Zitat antworten
  #10 (permalink)  
Alt 04-05-2022, 15:21
jenny258
 Registrierter Benutzer
Links : Onlinestatus : jenny258 ist offline
Registriert seit: May 2022
Beiträge: 17
jenny258 befindet sich auf einem aufstrebenden Ast
Standard

und dieser teil kommt in die Session Klasse ?

da wo mein session_start() ist ?

private static function sessionStart(){

/* if( empty(session_id()) && !headers_sent()){
session_start();
} */

if( session_status() !== PHP_SESSION_ACTIVE ){
session_start();
};
}
Mit Zitat antworten
  #11 (permalink)  
Alt 04-05-2022, 15:23
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.883
h3ll wird schon bald berühmt werden
Standard

Ja.
Mit Zitat antworten
  #12 (permalink)  
Alt 04-05-2022, 15:34
jenny258
 Registrierter Benutzer
Links : Onlinestatus : jenny258 ist offline
Registriert seit: May 2022
Beiträge: 17
jenny258 befindet sich auf einem aufstrebenden Ast
Standard

so wird mir nicht mal mehr mein speichern button angezeigt. Entferne ich das else, lande ich auf einer weißen Seite. Funktioniert also auch nicht.

private static function sessionStart(){


if( session_status() !== PHP_SESSION_ACTIVE ){
if (!headers_sent($filename, $linenum)) {
header (session_start());
exit;

// Wahrscheinlich wollen Sie hier eine Fehlermeldung auslösen
} else {

echo "Header bereits gesendet in $filename in Zeile $linenum\n" .
"Redirect nicht moeglich, klicken Sie daher statt dessen <a " .

exit;
}
}
Mit Zitat antworten
  #13 (permalink)  
Alt 04-05-2022, 15:36
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.883
h3ll wird schon bald berühmt werden
Standard

Wie kommst du bitte auf die Idee session_start() in header() zu packen?

Und die exit solltest du auch entfernen, ich denke nicht, dass du das willst.
Mit Zitat antworten
  #14 (permalink)  
Alt 04-05-2022, 15:42
jenny258
 Registrierter Benutzer
Links : Onlinestatus : jenny258 ist offline
Registriert seit: May 2022
Beiträge: 17
jenny258 befindet sich auf einem aufstrebenden Ast
Standard

guter Punkt. Jetzt hab ich es so:

private static function sessionStart(){

/* if( empty(session_id()) && !headers_sent()){
session_start();
} */

if( session_status() !== PHP_SESSION_ACTIVE ){
if (!headers_sent($filename, $linenum)) {
session_start();

// Wahrscheinlich wollen Sie hier eine Fehlermeldung auslösen
} else {

/* echo "Header bereits gesendet in $filename in Zeile $linenum\n" .
"Redirect nicht moeglich, klicken Sie daher statt dessen <a " .

exit; */
}
}
}




Fehler:
Jetzt kann im Controller keine Session erstellt werden (ausgabe bool(false)

string(17) "sess CONTROLLER: " bool(false) string(10) "POST TOKEN" string(64) "334242ab87f821c39e844ac9c5c687108356c9bc8fda17ff25d98e0a983520c0"
Mit Zitat antworten
  #15 (permalink)  
Alt 04-05-2022, 15:44
jenny258
 Registrierter Benutzer
Links : Onlinestatus : jenny258 ist offline
Registriert seit: May 2022
Beiträge: 17
jenny258 befindet sich auf einem aufstrebenden Ast
Standard

das gleiche Problem hatte ich auch mit der gefundenen Lösung aus dem Netz:

if( empty(session_id()) && !headers_sent()){
session_start();

hier bekam ich keine Header Fehlermeldung mehr. Zum dank wurde auch auch mein token nicht erzeugt.
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Sessions und URL strauberry PHP Developer Forum 2 28-02-2006 11:32
2 sessions ? Mr.Taylor PHP Developer Forum 3 16-11-2005 08:42
Sessions? fl4sh PHP Developer Forum 3 18-10-2005 22:09
allgemeine fragen zu sessions / sessions mit php user Kurt Cobain PHP Developer Forum 1 17-07-2005 14:32
Sessions Günni PHP Developer Forum 2 18-11-2002 00:04

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

OnPremise versus Cloud - das richtige System finden
Wir beleuchten in diesem Artikel, die Vor- und Nachteile für Cloud oder OnPremise Systemen. Und warum es definitiv Zeit wird in die Cloud zu wechseln.

09.05.2022 | julia_mjr

Warum Texterstellung mit künstlicher Intelligenz richtig gut ist
Warum Texterstellung mit künstlicher Intelligenz richtig gut istKünstliche Intelligenz ist dabei, die Welt zu erobern. Die größten Unternehmen entwickeln Systeme, die einen Text für Sie schreiben können. Und sie machen das sehr gut.

05.01.2022 | Berni


 

Aktuelle PHP Scripte

MyPHPlib-Bibliotheksverwaltung

MyPHPlib ist eine Scriptsammlung, mit der die Bibliotheksverwaltung incl. Ausleihe und Recherche gelingt. Die Scriptsammlung wird seit Mitte 2005 entwickelt und ist besonders an den Bedürfnissen von Schulen angepasst.

27.07.2022 RobertG | Kategorie: PHP/ Management
ebiz-trader 6.0 - Das professionelle PHP Marktplatz Script ansehen ebiz-trader 6.0 - Das professionelle PHP Marktplatz Script

Mit unserer Lösungen können Sie nahezu jeden B2B / B2C Marktplatz betreiben den Sie sich vorstellen können. Ganz egal ob Sie einen Automarktplatz, Immobilenportal oder einfach einen Anzeigenmarkt betreiben möchten. Mit ebiz-trader können Sie Ihre Anforder

01.07.2022 Berni | Kategorie: PHP/ Anzeigenmarkt
NewsLetter Script PHP ansehen NewsLetter Script PHP

NewsLetter Script PHP is a simple email subscriptions newsletters script written in PHP and MySQL. Admin could send news in the letters to a mailing list of subscribed visitors. All the news and subscription form could be placed into a page of your web

28.06.2022 nevenov | Kategorie: PHP/ Mail
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 09:28 Uhr.