Session und Cookies setzen funktioniert nicht!
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
anfang
aufruf
ausgeben
benutzer
bereich
browser
code
dokument
fehlermeldung
forum
index
laufen
login
problem
schau
session
sorge
tun
url
zeile
-
Also ich habe folgendes Problem:
In meinem Skript, welches nur aus meiner index.php besteht, ist ein Bereich eingebaut, in den man rein springt, wenn in $site kein wert ist (wird übergeben mit URL!). Wenn ich meine Logindaten dann eingeben habe, lädt sich die index.php neu und ich werde auf die Startseite (Forum) geleitet und $_SESSION ist auch gefüllt. Beim überprüfen der Login-Daten wurde auch ein Session-Cookie gesetzt "setcookie("Benutzer", $benutzername, time()+24*3600).
Aber sobald ich auf z.B. "<a href="teamroom.matanastudio.eu/?site=artikel">Artikel</a> (er bleibt also immer auf meiner index.php) klicken würde, springt er aus der Session und ich lande wieder mal im Login-Bereich. Ich habe es dann auch mal probiert dass ich, da ich ja auch meinen Cookie gesetzt habe, die Session über den Cookie wiederaufzunehmen, aber es brach trotzdem ab. Dann kam ich mal auf die Idee zu prüfen ob der Cookie nicht angenommen wurde, hat sich aber als falsch rausgestellt und als ich mal über "echo($_COOKIE['Benutzer']);" die Daten auslesen wollte, gab es aber nichts zum ausgeben. Die allgemeint bekannten Fehlerauslesungen haben leider auch nichts gebracht.
Ich habe jetzt schon mehrere Foren durchgeklappert, aber alle Lösungsvorschläge haben bis jetzt keine einzige Besserung bewirkt. Außerdem sollte die Session eigentlich durch mein "session_start();" am Anfang des Dokuments, falls sie vorhanden ist, wieder aufgenommen werden und nicht einfach verschwinden. Derzeit habe ich es bisschen hässlich gelöst indem ich die Session über einen Hidden-Button mit übergebe, aber das kann auf Dauer keine Lösung sein und ich hoffe jemand weiß Rat. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Da hast du natürlich Recht, aber ich werde jetzt nicht die ganze index.php hier rein schreiben, denn das wären über 2300 Zeilen ^^. Aber hier schreibe ich mal den Login und den Anfang des Dokuments rein.
session_start(); @$_SESSION = $_COOKIE['Benutzer']; $seite=null; @$seite = $_GET["site"];
Das wäre jetzt der obere Teil der die Session starten sollte.
Und hier wäre der Login bereich der beim Aufruf der Seite angezeigt wird.
$username = $_POST['username']; $passwort = $_POST['password']; $passwort = password_hash($passwort, PASSWORD_DEFAULT); $sql = "SELECT * FROM User WHERE uname='".$username."' LIMIT 1"; foreach ($pdo->query($sql) as $row) { if (password_verify($row['upw'], $passwort)) { setcookie("Benutzer", $row['uname'], time()+24*3600); $_SESSION['username'] = $row['uname']; $recht = $row['rnr']; } }
-
du musst die Session dirwkt am Anfang starten, bevor irgendetwas ausgegeben wurde ( am besten halt wirklich in der 1. zeile)
-
Das stimmt das habe ich auch gemacht, "session_start()" steht genau nach <?php .
Aber dass hatte ich schon die ganze Zeit dort stehen.
Edit: Ich habe einfach mal die Session-ID ausgeben lassen und gemerkt, dass sie bei jedem Aufruf anders ist, es handelt sich nie um die selbe. Was kann man da tun?
Beitrag zuletzt geändert: 25.2.2016 19:02:53 von matanastudio -
session_start(); @$_SESSION = $_COOKIE['Benutzer']; $seite=null; @$seite = $_GET["site"];
Mit den ganzen @'s unterdrückst Du ja die ganze Fehlerberichterstattung!
Die solltest Du dringend rausnehmen und dann schauen, welche Meldungen es gibt.....
Gruß Dunkeltuten
Beitrag zuletzt geändert: 26.2.2016 8:10:45 von dunkeltuten -
Was machst Du denn da für komische Dinge?
Schau Dir erstmal das hier an:
http://php.net/manual/en/reserved.variables.session.php
http://php.net/manual/en/reserved.variables.cookies.php
Dann überlege Dir, was an Dieser Zeile
falsch ist (mal abgesehen, von dem Unterdrücken der Fehlermeldungen).@$_SESSION = $_COOKIE['Benutzer'];
Stelle dann fest, das $_COOKIES vom Benutzer frei wählbar ist, also nicht zum Speichern von »ist Benutzer angemeldet« geeignet ist, und $_SESSION auf Serverseite gespeichert wird, Du hier also Dinge wie »ist der Benutzer angemeldet« eigentlich durchaus speichern kannst, wenn Du es nicht vorher Durch irgendwelchen Blödsinn kaputt machst (wie z.B. die bereits genannte Codezeile).
Desweiteren schaue Dir folgende Zeile an:
, google nebenbei evtl. mal SQL Injection, und überlege Dir dann, was daran denn so falsch ist.$sql = "SELECT * FROM User WHERE uname='".$username."' LIMIT 1";
Generell solltest Du mal das komplette Cookiemanagement überdenken, das ist ja ein einziges durcheinander. -
Da hast du recht ich habe das mit der Session jetzt noch einmal verbessert und den Cookie ein bisschen verändert, es sieht jetzt so aus:
if(isset($_COOKIE['benutzer'])) { $_SESSION['username'] = $_COOKIE['benutzer']; }
und beim Cookie:
setcookie('benutzer', $row['uname'], time() + 3600) or die ("Konnte nicht gesetzt werden");
jetzt zeigt es den Text an "Konnte nicht gesetzt werden."....
Beitrag zuletzt geändert: 26.2.2016 16:36:12 von matanastudio -
Hast du die 2300 Zeilen Codes überhaupt selbst geschrieben?
Ist das Teil überhaupt schon mal bei Dir erfolgreich gelaufen?
-
Ich habe alle 2300 Zeilen selbst geschrieben und es hat funktioniert solange ich die Session mit einem Button übergeben habe. Ich lasse die Seite ja komplett über den Webspace laufen und es geht ja eigentlich darum, dass die Session bzw. der Cookie nicht zugelassen werden (siehe Fehlermeldung). Muss ich da irgendwas beachten um die Sessions bzw Cookies zu nutzen außer session_start()? Da es ja schon abbricht wenn ich den Cookie setzen will tippe ich mal auf ein serverseitiges Problem :/
Beitrag zuletzt geändert: 26.2.2016 17:44:43 von matanastudio -
matanastudio schrieb:
Das ist immer noch Blödsinn. Ich wiederhole, $_COOKIE ist vom Benutzer frei wählbar, D.h. der kann bei dem Code den Benutzernamen selbst wählen. Nicht sonderlich sinnvoll.
if(isset($_COOKIE['benutzer'])) { $_SESSION['username'] = $_COOKIE['benutzer']; }
Lass das ganze setcookie gedöns doch einfach weg, und setze direkt $_SESSION['username']. Ich verstehe nicht, warum Du hier über Cookies gehen willst.
Ich hoffe, dass Du das SQL Injection Problem nebenbei gelöst hast? Wenn Du schon PDO verwendest (gut!), dann solltest du für solche abfragen auch Prepared Statements verwenden. -
Okay ich habe es jetzt mal nur so gemacht wie du meinst und nur auf Sessions gestützt. Das mit SQL habe ich erstmal gelassen weil ich bezweifle das die Session aufgrund des SQL's abbricht :P Aber das lasse ich jetzt mal außen vor es geht explizit darum, warum die Session abbricht. Falls ich mich irren sollte und es an dem Prepared Statements liegt, weshalb meine Sessions nicht gehen, nehme ich alles zurück und ändere die gesamten Anweisungen um.
Und wie ich schon erwäht habe, die Session-ID wird bei jedem Aufruf geändert. Wäre es möglich das es genau daran liegt das ich meine Session beim nächsten Aufruf nicht mehr habe?
Beitrag zuletzt geändert: 26.2.2016 18:39:07 von matanastudio -
Nein, das SQL Injection Problem hat nichts mir der Session zu tun. Lediglich damit, dass sich dadurch jeder als jeder einloggen kann und im schlimmsten Fall deine Datenbank löschen kann, aber das ist ja alles nicht so schlimm, hat ja nix mit der Session zu tun.
Ansonsten solltest du aufhören, in deinem Code Fehler zu unterdrücken (@ am Anfang der Zeile), die haben alle durchaus ihren Sinn. Und falls noch nicht geschehen, auch mal Fehlermeldungen in der Verwaltung anschalten, damit du mal siehst, was so alles falsch läuft. Mal ins Blaue geraten, würde ich sagen, dass da schon vor dem <?php irgendwas ausgegeben wird.
Durch solch naive Herangehensweise gibt es übrigens so viele große Botnets, ist ja nur ein kritisches Sicherheitsproblem, das muss ich gar nicht lösen. Hat ja nichts mit dem eigentlichen Problem zu tun. -
Ich weiß dir scheint dieses Injection Problem anscheinend ziemlich ans Herz zu gehen ist auch vollkommen okay aber lass das mal mein Problem sein ich werde es schon noch ausbessern. Es gibt noch genügend Punkte auf meiner To-Do-Liste und einer davon ist es die Sicherheit zu erhöhen keine Sorge. Ich möchte auch jetzt keine zwiehlichte Diskussion das bringt uns beiden gar nichts ich würde einfach nur gerne das Session Problem gelöst haben und alles andere kann man hinterher auch noch lösen.
Vor dem <?php steht leider überhaupt gar nichts es fängt direkt so an:
<?php session_start(); . . .
Ich habe meinen Code ja schon mit vielen Foren verglichen und es ist mir auch nicht ersichtlich etwas vergessen zu haben. Ein Kollege hat es genauso aufgebaut und bei ihm funktioniert das ganze... -
UTF-8 BOM? Hast du dir jetzt mal Fehlermeldungen anzeigen lassen? Werden Cookies vielleicht einfach von Deinem Browser abgelehnt? Wird bei deinem Client das PHPSESSID Cookie gesetzt?
Mir liegt nicht konkret dieses Problem am Herzen, viel mehr nervt mich die generelle Einstellung, Sicherheitsprobleme hintenanzustellen. Durch diese Einstellung kommen eben wie gesagt Botnetze etc. zu Stande. Und bevor mich jemand fragt, ja, mich regt auch auf, dass heutzutage jeder Vollidiot Auto fahren darf. -
Ich habe ganz normales UTF-8 genommen. Da steht nichts mit BOM oder so. Die Cookies werden nicht abgelehnt ich habe mir schon derartige Fehlermeldungen ausgeben lassen und alle waren negativ im Browser sind Cookies auch aktiviert. Was genau meinst du mit dem PHPSESSID? Wenn du die session_id() meinst, dann habe ich sie mir mal ausgeben lassen und wie gesagt immer eine andere beim nächsten Aufruf gewesen. Aber wie meinst du das mit dem setzen?
Ich versteh schon keine Sorge ich werde mich darum kümmern und denk nicht von mir ich nehme das auf die leichte Schulter ich weiß wie ernst das Problem ist weil sowas ziemlich kritisch sein kann. Und p.s keine Sorge falls es dir gut tut die idiotischen Autofahrer bekomme ich jeden Tag aufs neue zu spüren... ^^'
Beitrag zuletzt geändert: 27.2.2016 13:07:38 von matanastudio -
Es gäbe ja auch die Möglichkeit die Datei mal als txt auf den Webspace zu packen, damit man ggf. selbst testen kann.
-
Ich werde es mir überlegen. Ich setze mich nächste Woche mit einigen Kollegen nochmals zusammen und wenn bis zum Wochenende nichts raus gekommen ist bzw. hier nicht die direkte Lösung gefunden wird werde ich deinen Vorschlag in Erwägung ziehen, wobei ich dazu ein wenig kritisch stehe wenn ich ehrlich sein muss.
-
Das ist wie zu sagen: Ich hab ein Problem mit meinem Auto, aber mach dem Techniker nichts auf.
Ansonsten: Schau mal, ob und wie die Cookies von dir an den Server gesendet werden.
Trotzdem ist der Spaß, den du mit Sessions und Cookies betreibst immer noch Blödsinn und das SQL tödlich. -
Da hast du natürlich Recht deswegen habe ich es aber auch nicht verneint
Ich werde nächste Woche ein Review hier schreiben wie der derzeitige Stand ist und falls es sich gelöst hat gebe ich natürlich schon vorher bescheid. Ansonsten wünsche ich allen ein schönes Wochenende und möchte mich schonmal für die Hilfeversuche bedanken das ist wirklich eine super Community -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage