Jump to content

PHP: Sessions in übergeordnetem Ordner


MWojt
 Share

Recommended Posts

Hi Leute,

ich habe ein Problem: Ich lasse ein Skript aus einem Unterordner des Ordners, in dem sich die Hauptseite befindet, in einem iFrame durchlaufen und erzeuge so eine Session-Variable. Jetzt habe ich allerdings das Problem, dass sich diese Variable scheinbar nicht von der Hauptseite aus abrufen lässt.

Nun zur Frage: Habe ich einen Fehler in dem Skript, das die Variable abrufen soll, oder liegt das Problem im Skript, das die Session-Variable erstellt?

Mit freundlichen Grüßen,

MWojt

//Edit: Ich bin so dumm. Natürlich muss nicht JavaScript in den Titel :D.

Edited by MWojt
Link to comment
Share on other sites

Hier mal die Codes:

Session setzen:

<?phpsession_start();$_SESSION["username"] = $_POST['name'];if(isset($_POST['stay'])) { setcookie("username",$_POST['name']); setcookie("pw",$_POST['pw']);}?>
Session abfragen:

function loggedin($db) { require_once("scripts/functions.php"); require("config/mysql.php"); if(isset($_SESSION['username'])) { $user = $_SESSION['username']; $s = true; } elseif(isset($_COOKIE['username'])) { $user = $_COOKIE['username']; $s = false; } else { return(false); } $result = mysqli_query($db,"SELECT * FROM `".$table_users."` WHERE `Nickname` = '".$user."'"); if($result === false) { if(!mysqli_exist($table_users)) {  $cmd = "  CREATE TABLE `".$table_users."` (  `ID` int NOT NULL AUTO_INCREMENT PRIMARY KEY,  `Nickname` varchar(200) NOT NULL UNIQUE,  `Passwort` char(128) NOT NULL,  `Gruppe` int NOT NULL)  ENGINE=InnoDB";  mysqli_query($db,$cmd)  or die(mysqli_error($db));  mysqli_query($db,"ALTER TABLE `".$table_users."` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci")  or die(mysqli_error($db)); } return(false); } elseif(mysqli_fetch_array($result)[1] !== $user) { return(false); } elseif($s === true) { return($user); } else { $pw = hash("SHA512",$_COOKIE['pw']); $result = mysqli_query($db,"SELECT * FROM `".$table_users."` WHERE `Nickname` = '".$user."' AND `Passwort` = '".$pw."'"); if($result === false) {  return(false); } else {  return($user); } }}

Edited by MWojt
Link to comment
Share on other sites

Ich muss gleich los wohin, aber danach schaue ichs mir mal im Detail an. In der Zwischenzeit kannst du mal schauen, ob die Variablen gesetzt werden und ob deren Inhalt stimmt. Existiert die Post-Variable stay?

Ich gebe dir dann später auch noch Ratschläge, wie du deinen Code optimierst, da dort viele Unsauberkeiten drin sind.

Edited by Beefsteakwerfer
Link to comment
Share on other sites

Existiert die Post-Variable stay?

Ja, tut sie.

Hier die Form:

  <form action="../scripts/rlo.php" method="post">    <p class="t1">Nickname:</p><input class="text1" type="text" name="name"/>    <p class="t2">Passwort:</p><input class="text2" type="password" name="pw"/>    <p class="s1">Kekse:</p><input class="stay" type="checkbox" name="stay"/><p class="s2">Angemeldet bleiben</p>   <input class="button" type="submit" value="Anmelden"/>  </form>
Link to comment
Share on other sites

Also, folgendes solltest du ändern:

  • alle Get- und Post-Variablen mit preg_replace und/oder preg_match auf ihren Inhalt prüfen, um SQL-Injections zu verhindern. Ebenso solltest du prüfen, ob Variablen gesetzt sind und zusätzlich nicht leer sind.
  • du benötigst überall wo du mit sessions arbeitest ein session_start(), ansonsten hast du keinen Zugriff auf die Variablen. Dabei ist es egal, ob du Session-Variablen erstellen oder lesen willst. Du benötigst es in beiden Fällen.
  • IFrames sind veraltet und sollten nicht mehr genutzt werden. Heutzutage nutzt man dafür includes().
  • wenn du PHP-Variablen in einem SQL-Query nutzen möchtest solltest du sie mit eckigen Klammern einbinden. Beispielquery: "SELECT * FROM `tbl_users` WHERE `user_id` = '{$user_id}' " (das Leerzeichen zwischen dem ' und dem " am Ende des SQL-Queries ist nur zur besseren Lesbarkeit gesetzt und sollte im Code nicht übernommen werden).
  • Variablen, Tabellennamen und Spaltennamen sollten klein geschrieben werden.
  • Deine return-Funktionen solltest du zu return *Inhalt* umwandeln, also ohne die Klammern.
  • bei SQL-Queries solltest du nicht extra die Datenbank in der Funktion mysqli_query angeben, sofern du nicht mit mehreren Datenbanken gleichzeitig arbeitest, sondern lieber die entsprechende Datenbank direkt in der mysql.php auswählen

Ich denke damit hast du nun erst mal was zu tun, um dein Skript zu verbessern. Nachdem das fehlende session_start() hinzugefügt worden ist sollte es auch gehen.

Link to comment
Share on other sites

IFrames sind veraltet und sollten nicht mehr genutzt werden. Heutzutage nutzt man dafür includes().

Kannst du mir dann vlt auch noch verraten, wie ich PHP-Skripte durch das Übermitteln einer Form ohne ein Neuladen der Hauptseite ausführe?

Deine return-Funktionen solltest du zu return *Inhalt* umwandeln, also ohne die Klammern.

Was ist so schlimm an den Klammern?

bei SQL-Queries solltest du nicht extra die Datenbank in der Funktion mysqli_query angeben, sofern du nicht mit mehreren Datenbanken gleichzeitig arbeitest, sondern lieber die entsprechende Datenbank direkt in der mysql.php auswählen

Habe ich bereits versucht. Führt zu einer Fehlermeldung. Vielleicht habe ich es aber auch falsch gemacht...

Link to comment
Share on other sites

Damit die Seite nicht neu lädt müsstest du mit Ajax oder anderen Javascript-Helferlein arbeiten. Was spricht für dich gegen ein Neuladen der Seite?

Die Klammern sind unüblich. Klar funktioniert es auch so, aber besser wäre es ohne sie.

Zitat aus dem PHP-Wiki:

Hinweis: Weil return ein Sprachkonstrukt und keine Funktion ist, sind die Klammern um das Argument optional. Es ist üblich, sie auszulassen, und dies wird ausdrücklich empfohlen, weil PHP in diesem Fall weniger zu tun hat.

Wie lautet die Fehlermeldung? Du musst was falsch gemacht haben, da das der gängiste Weg ist und garantiert geht ;).

Edited by Beefsteakwerfer
Link to comment
Share on other sites

Warning: mysqli_query() expects at least 2 parameters, 1 given inC:\xampp\htdocs\index.phpon line16

Das ist die Fehlermeldung. Ich denke, du verwechselst gerade MySQL und MySQLi.

Wenn du mir statt der Methode mit dem iFrame eine andere Methode vorschlügest, die genau so effektiv ist, würde ich diese gerne benutzen.

Das mit den Klammern werde ich ändern. Scheinbar ist die Variante ohne die Klammern ja schneller.

Edited by MWojt
Link to comment
Share on other sites

MySQL und MySQLi macht bei der Verwendung keinen Unterschied. Man sollte jedoch trotzdem MySQLi nutzen, da MySQL veraltet ist und in absehbarer Zeit keineswegs mehr unterstützt wird.

Stimmt, du musst die DB-Verbindung bei dir angeben, beim MySQLi-Query, da es nicht objektorientiert programmiert ist. Vergiss die Aussage von mir dazu also.

Ich habe dir doch schon, anstatt dem iFrame, einen include() vorgeschlagen? Mach einfach include(*dateiname*); an der Stelle wo jetzt dein iFrame steht. Das geht jedoch nur, wenn die Datei in der gleichen Datei nur einmal eingebunden wird.

Link to comment
Share on other sites

Ich habe dir doch schon, anstatt dem iFrame, einen include() vorgeschlagen? Mach einfach include(*dateiname*); an der Stelle wo jetzt dein iFrame steht. Das geht jedoch nur, wenn die Datei in der gleichen Datei nur einmal eingebunden wird.

Würde ich die Datei mit Include einbinden, wäre es mir wie gesagt unmöglich (bzw. nur durch eine mir unkenntliche Art möglich), ein Skript ohne Neuladen der Hauptseite auszuführen. Das von mir darin gesehene Problem ist allerdings keineswegs die eigentliche Ausführung des Skriptes, sondern eher die nötige Weiterleitung zurück zur Hauptseite. Ich empfinde diesen Weg als sehr unschön, da man, wenn man sich eine Seite rückwärts bewegt, immer dieses olle Skript sieht.

Link to comment
Share on other sites

Mir ist noch unklar wieso du gerade den Teil zur Erzeugung der Session Variablen erneut laden musst?

Willst du damit sagen, dass man das

session_start();

im Erzeugerskript hätte weglassen können?

Was ich mich gerade frage:

Warum benutzt YouTube iFrames, wenn diese doch so veraltet sind?

Edited by MWojt
Link to comment
Share on other sites

Ich habe nun mal diverses nachgelesen und ein paar offizielle Dinge studiert. Weder Frames, noch iFrames sind "veraltet". Sie werden auch in HTML5 weiterhin unterstützt und sie wurden sogar erweitert.

Man sollte sie, wenn möglich, vermeiden, weil sie bestimmte Funktionen verhindern und je nach Browser unterschiedlich umgesetzt werden, aber es gibt Fälle wo man nicht um iFrames herum kommt. Du kannst es also weiterhin nutzen, sofern du mit deinem Weg zufrieden bist.

Zu deiner Anmerkung mit Youtube: Viele große Seiten nutzen ganz viele verschiedene Fallbacks, damit die Seite auf allen Geräten, in allen Browsern mit allen erdenklichen Versionen geht. Da ist es dann auch mal notwendig veraltete Funktionen zu verwenden, da alte Browser viele HTML5-Elemente nicht kennen.

Link to comment
Share on other sites

Weißt du, was ein Fallback ist? Ein Fallback ist eine Sache, die dann genutzt wird, wenn die neue Methode nicht funktioniert. Ich denke kaum, dass YouTube im Google Chrome Fallbacks verwendet. Was ich damit sagen will: YouTube verwendet iFrame höchstwahrscheinlich nicht als Fallback, sondern als *Gegenteil von Fallback*.

Ich werde den iFrame weiterhin benutzen, da dieser in Chrome, Firefox und IE gleich und so aussieht, wie er es soll.

Link to comment
Share on other sites

Ich habe nun mal flüchtig geschaut wo Youtube iFrames nutzt und ich kann es nur bei der eingebundenen Werbung feststellen. Warum Youtube da iFrames nutzt? Ich selber nutze keine iFrames und ich kann nur durch das was ich gelesen habe raten, dass es vielleicht daran liegt, dass die Werbung nicht indexiert werden soll oder der Google Bot ihr nicht auf die Seiten folgen soll, da viele Werbeseiten eher dem Google-Ranking schaden.

Ob das stimmt (das Suchmaschinen iFrames nicht folgen, indexieren, usw.) weiß ich nicht und das müsste man letztlich selber testen, da ich dazu unterschiedliche Aussagen gefunden habe.

Edited by Beefsteakwerfer
Link to comment
Share on other sites

Da ich einen Adblocker habe, habe ich diesen iFrame nicht gesehen. Eigentlich meinte ich die iFrames, die erscheinen, wenn man einige Zeit mit der Maus über einem Benutzernamen bleibt. Die Indizierung wäre in meinem Fall ebenfalls unnötig. Zudem ist es in meinem Fall einfacher, einen iFrame statt eines Includes zu verwenden, da ich diesen wie YouTube quasi als "PopUp" verwende (ich weiß, dass ein PopUp eigentlich was anderes ist). Von daher werde ich ihn weiterhin benutzen. Er funktioniert sowohl in Chrome als auch in Firefox als auch im IE; ich sehe keinen Grund, umzusteigen und es zu verkomplizieren.

Link to comment
Share on other sites

Nein, das sind iFrames. Das weiß man, wenn man über dem Frame rechtsklickt, dann kommt der Kontextmenüeintrag "Frame-Quelltext anzeigen". Dies erschiene nicht, wenn dort kein iFrame wäre.

Edited by MWojt
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...
B
B