PHP Session (Cokie) Problem beim aufruf über eine Subdomain



  • Hi,

    also ich bin mir nicht sicher aber folgendes:
    Ich habe einen Ordner mit einer index.php auf meinem Webserver. Ich Vermerke Unterordner! Dieser Unterordner wird über eine Subdomain aufgerufen. Und dann diese index.php automatisch geladen. Alles was in diesem Unterordner ist, läast auch einen Cokie für jeden erstellen der die Subdomain abruft (Remoter). Aber aus irgend einem Grund, denkt der Server, bei der nächsten überprüfung der Session-ID das es nicht der Remoter ist. Und der Remoter wird sofort wieder disconnect. Ich könnte mir vorstellen das es daran liegt, das der Remoter über eine Subdomain kommt aber der Server über die Topdomain wieder zurückgeht oder so ähnlich und deshalb die Sessionä-ID ungleich ist. Was kann ich dagegen machen?



  • Habs jetzt ehrlich gesagt nicht so ganz verstanden, aber das könnte schon sein dass es da Probleme gibt, da Cookies standardmäßig nur für die exakte Domain gelten für die sie ausgestellt wurden.
    Man kann Cookies aber auch für alle Subdomains gültig machen, bei PHP z.B. gibt es den domain-Parameter beim setcookie-Befehl:
    http://php.net/manual/en/function.setcookie.php

    Da ich aber annehme dass du die Cookies nicht explizit setzt, hier noch folgendes (auch PHP relevant):
    http://www.jontodd.com/2006/08/10/php-session-cookie-multiple-domains/



  • Als ich im Quellcode eine Javascript Methode hinzugefügt habe, um per Alert("") Informationen aus zu geben, verschwand auf einmal das Problem, das nach dem Login wieder sofort ausgelogt wird. Jetzt habe ich einen verdacht: Meine hinzugefügte Javascript Methode wird von PHP in die erste Zeile und erste Spalte in der HTML-Datei generiert und alle darauf folgende Javascript Methoden enthalten eine Zusatzangabe UTF8. Meine an erster stelle stehende Javascript einleitung aber nicht, lediglich type="text/javascript".

    <script type="text/javascript">alert("sessionName: ajax_chat\n sessionCookiePath: /\n sessionCookieDomain: \n sessionCookieSecure: ");</script><?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de" dir="ltr">
    
    <head>
    	<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
    	<title>AJAX Chat</title>
    	<style type="text/css">
    		body {
    			padding:0;
    			margin:0;
    		}
    	</style>
    	<link rel="alternate stylesheet" type="text/css" href="css/beige.css" title="beige"/><link rel="alternate stylesheet" type="text/css" href="css/black.css" title="black"/><link rel="alternate stylesheet" type="text/css" href="css/grey.css" title="grey"/><link rel="alternate stylesheet" type="text/css" href="css/Oxygen.css" title="Oxygen"/><link rel="alternate stylesheet" type="text/css" href="css/Lithium.css" title="Lithium"/><link rel="alternate stylesheet" type="text/css" href="css/Sulfur.css" title="Sulfur"/><link rel="alternate stylesheet" type="text/css" href="css/Cobalt.css" title="Cobalt"/><link rel="alternate stylesheet" type="text/css" href="css/Mercury.css" title="Mercury"/><link rel="alternate stylesheet" type="text/css" href="css/Radium.css" title="Radium"/><link rel="stylesheet" type="text/css" href="css/prosilver.css" title="prosilver"/><link rel="alternate stylesheet" type="text/css" href="css/subsilver2.css" title="subsilver2"/><link rel="alternate stylesheet" type="text/css" href="css/subblack2.css" title="subblack2"/><link rel="alternate stylesheet" type="text/css" href="css/subSilver.css" title="subSilver"/><link rel="alternate stylesheet" type="text/css" href="css/Core.css" title="Core"/><link rel="alternate stylesheet" type="text/css" href="css/MyBB.css" title="MyBB"/><link rel="alternate stylesheet" type="text/css" href="css/vBulletin.css" title="vBulletin"/>
    	<!--[if lt IE 7]>
    		<link rel="stylesheet" type="text/css" href="css/ie5-6.css"/>
    		<script type="text/javascript">
    			var isIElt7 = true;
    		</script>
    	<![endif]-->
    
    	<script src="js/chat.js" type="text/javascript" charset="UTF-8"></script>
    	<script src="js/custom.js" type="text/javascript" charset="UTF-8"></script>
    	<script src="js/lang/de.js" type="text/javascript" charset="UTF-8"></script>
    	<script src="js/config.js" type="text/javascript" charset="UTF-8"></script>
    	<script src="js/FABridge.js" type="text/javascript" charset="UTF-8"></script>
    	<script type="text/javascript">
    		// <![CDATA[
    


  • Das Problem ist nach wie vor nicht festgestellt. Die Session wird über eine Subdomian aufgerufen bzw. erstellt und diese Subdomain steht auch während der Session in der Adresszeile des Webbrowsers. Dennoch werden alle objekte die über die Subdomain aufgerufen werden, über die Topdomain mit Unterverzeichnisnamen-Angabe adressiert. So stand in dem Fenstertitel von der Javascript-Function-Alert die vollständige Topdomain adresse inkl. Unterordner. Obwohl trotz Subdomain alle Objekte über die Topdomain adressiert werden, kann ich aber wiederum nicht direkt die Objekte per Topdomain und Unterverzeichnisangabe (www.domain.com/unterverzechis) aufrufen. Dann findet er sie nicht (error 404). Dieser unterordner ist über den Webbrwoser als nur unter der Subdomain, die direkt auf diesen Unterordner verweist, sichtbar. Dennoch werden dann alle objekte die über die Subdomain abgerufen werden, mit der Topdomain adressiert.

    Ich vermute daher, dass die Cokies, die Topdomain (inkl. /Ordnername) URL enthalten, der Server dieser Session seine URL-Umgebung sieht die gleich mit der Subdomain (ohne /Ordnername) ist, daher meint er das es sich nicht um den selben Clienten handelt.

    Blos ist natürlich meine eigentliche Frage was ist da falsch konfiguriert?


  • Mod

    Kannst du das ganze mit etwas weniger verwirrenden Worten erklaeren, zB ein kleines Beispiel machen. Denn mir ist nicht klar warum du von einer Subdomain und dann wieder von keiner sprichst.

    Ansonsten lass dir das Cookie ausgeben und vergleiche die beiden Pfade (dort wo das Cookie generiert wurde und dort wohin das Cookie nicht korrekt gesendet wurde).



  • Ich verstehe ja auch nicht so ganz was da passiert. Die ganz normale Domain, also die Topdomain, verweist auf den obersten html ordner, dieser enthält natürlich eine index.php und so weiter. Nun habe ich aber in diesem html Ordner noch Unterordner die weniger mit der Website html/index.php zu tun hatt. Also eigentlich ganz andere Websites. Damit aber nicht umständlich über den Topdomain und /Unterverzeichnis die im Unterordner liegende website (index.php) aufrufen muss, kann man ja eine Subdomain verwenden, die direkt auf die Website verweist die in dem Unterordner ist.

    Und in diesem Unterordner habe ich jetzt eine Website, die u.a. auch Cokies erstellt. Die Cokies enthalten als Host '.Topdomain.Länderendung' und als Pfad '/'.

    Sobald er solch ein Cokie erstellt hat, ist das Script der Meinung, dass das nicht sein Cokie sei oder ich weiss nicht warum.



  • Hallo,

    ich vermute schon fast dass das Problem gar nicht in der (Sub-)Domain oder dem Verzeichnis liegt.

    Lies dich hier mal durch und schau ob du nicht irgendeinen anderen Fehler hast.

    VlG



  • RandomAccess85 schrieb:

    Hallo,

    ich vermute schon fast dass das Problem gar nicht in der (Sub-)Domain oder dem Verzeichnis liegt.

    Lies dich hier mal durch und schau ob du nicht irgendeinen anderen Fehler hast.

    VlG

    Also hat mich leider auch nicht weitergebracht, da ich das dort beschriebene bereits weis. Das bei einer Variablen-Ausagbe per Echo, der voher keinen Wert zugewiesen wurde, nichts raus kommt ist klar. Genauo so ist mir klar das in einem Cokie eigentlich wiederum auch nur Variablen mit dem jeweiligen zuweisungswert sind. Die fähigkeit logisch mechanisch zu denken habe ich schon. Nur leider kennt man eben in der IT-Welt nicht alle notwendigen Fakten, um es korrekt sich um Kopf theoretisch durchgehen zu lassen. Wer kennt auch schon das Hintergrundwissen eines Webservers, oder des PHP Interpreters? Ich denke bei mir liegt vielmehr das Problem, das ich nicht weiss wie mein Webserver arbeitet. Ich kann zwar die PHP-Settings Inforamtionen auslesen aber sor richtig schlau werde ich daraus auch nicht.

    Ich bin mir zu fast 90% sicher, das irgenwie duch die verwendung eines Subdomain, der Cokie anders erstellt wird, als er soll. Folglich fält der Cokie bei einer IF oder ähnlichen Prüfung im Script durch und das Script beginnt wieder die Funktion aufzurufen ein Cokie zu erstellen, dieses wird aber wieder anders als es eigentlich sollte, damit geht das Spiel wieder von vorne los. Ich bin mir ziemlich sicher, dass das Script im Moment der Cokie erstellung in der Umgebungsvariable eine andere Adresse enthält, als im Moment der Cokie-Exiztens überprüfung. Folglich ist der Wert nicht gleich, foglich, sieht das Script, dass es nicht sein Script ist (ironisch gemeint) und sagt sich der hat noch kein Cokie und deshalb erstellen wir jetzt eins, also die Funktion aufrufen die ein Cokie erstellt.

    Das einzige was ich noch nicht wusste ist das man keine Ausagbe vor einem setcokie machen darf.



  • Vllt machst du endlich mal das beispiel zu dem du aufgefordert wurdest.
    Oder noch besser, zeig gleich die stelle wie sie in echt ist.
    Dann kann man dir vllt Helfen.

    Wir sitzen auch nur vor einem PC und nicht vor einer Glaskugel.
    Du musst schon code zeigen, damit wir dir sagen können wo der fehler ist.



  • html
    html/index.php
    html/InterAnonymChat
    html/InterAnonymChat/index.php
    html/InterAnonymChat/Chat
    html/InterAnonymChat/Chat/index.php

    www.Domain.com = html/index.php
    www.Subdomain.Domain.com = html/InterAnonymChat/index.php
    index.php from www.Subdomain.Domain.com enthält ein iFrame src="Chat" (ladet Chat/index.php in den iFrame)

    function startSession() {
                    $this->setConfig('sessionCookiePath', null, '/');
                    $this->setConfig('sessionCookieDomain', null, 'Topdomain.com');
    		if(!session_id()) {
    			// Set the session name:
    			session_name($this->getConfig('sessionName'));
    
    			// Set session cookie parameters:
    			session_set_cookie_params(
    				0, // The session is destroyed on logout anyway, so no use to set this
    				$this->getConfig('sessionCookiePath'),
    				$this->getConfig('sessionCookieDomain'),
    				$this->getConfig('sessionCookieSecure')
    			);
    
    			// Start the session:
    			session_start();
    
    			// We started a new session:
    			$this->_sessionNew = true;
    		}
    	}
    
    	function destroySession() {
    		if($this->_sessionNew) {	
    			// Delete all session variables:
    			$_SESSION = array();
    
    			// Delete the session cookie:
    			if (isset($_COOKIE[session_name()])) {
    				setcookie(
    					session_name(),
    					'',
    					time()-42000,
    					$this->getConfig('sessionCookiePath'),
    					$this->getConfig('sessionCookieDomain'),
    					$this->getConfig('sessionCookieSecure')
    				);
    			}
    
    			// Destroy the session:
    			session_destroy();
    		} else {
    			// Unset all session variables starting with the sessionKeyPrefix:
    			foreach($_SESSION as $key=>$value) {
    				if(strpos($key, $this->getConfig('sessionKeyPrefix')) === 0) {
    					unset($_SESSION[$key]);
    				}
    			}
    		}
    	}
    
    Website: Topdomain.com
    Cokie-Name: ajax_chat_style
    Name: ajax_chat_style
    Inhalt: prosilver
    Domain: .Topdomain.com
    Pfad: /
    Senden für: Jeden Verbindungstyp
    Gültig bis: Donnerstag, 16. Juni 2011 16:49:58
    
    Website: Topdomain.com
    Cokie-Name: ajax_chat_settings
    Name: ajax_chat_settings
    Inhalt: bbCode%3Dtrue%26bbCodeImages%3Dtrue%26bbCodeColors%3Dtrue%26hyperLinks%3Dtrue%26lineBreaks%3Dtrue%26emoticons%3Dtrue%26autoFocus%3Dtrue%26autoScroll%3Dtrue%26maxMessages%3D0%26wordWrap%3Dtrue%26maxWordLength%3D32%26dateFormat%3D(%2525H%253A%2525i%253A%2525s)%26persistFontColor%3Dfalse%26fontColor%3Dnull%26audio%3Dtrue%26audioVolume%3D1%26soundReceive%3Dsound_1%26soundSend%3Dsound_2%26soundEnter%3Dsound_3%26soundLeave%3Dsound_4%26soundChatBot%3Dsound_5%26soundError%3Dsound_6%26blink%3Dtrue%26blinkInterval%3D500%26blinkIntervalNumber%3D10
    Domain: .Topdomain.com
    Pfad: /
    Senden für: Jeden Verbindungstyp
    Gültig bis: Donnerstag, 16. Juni 2011 16:49:58
    

  • Mod

    Bemueh dich bitte etwas mehr den relevanten Code herzuzeigen. Du zeigst zB 2 Cookies wovon nur eins im Code gesetzt wird und wir nicht wissen welches.

    destroySession ist eigentlich uninteressant, oder rufst du es irgendwann in dem relevanten Code auf? Wenn ja: warum? Und warum unterscheidest du zwischen einer neuen und einer "alten" Session?

    Relevante Info:
    wie wird das Cookie gesetzt dass du vermisst? Wie sehen die Daten aus die der Client bekommt und ueber welche URL wird es denn gesetzt.

    Was fuer Daten werden an die subdomain URL geschickt? (vom Client).

    Ich sehe zB auch keine UID oder aehnliches die gesetzt wird. Also versuch dir zu ueberlegen was wir fuer infos brauchen und poste die dann...



  • function getXMLMessages() {
    		switch($this->getView()) {
    			case 'chat':
    				return $this->getChatViewXMLMessages();
    			case 'teaser':
    				return $this->getTeaserViewXMLMessages();
    			case 'logs':
    				return $this->getLogsViewXMLMessages();
    			default:
    				return $this->getLogoutXMLMessage();
    		}
    	}
    

    Das Feld aus dem Array, das per getView() abgerufen wird enthält nichts.



  • Hallo,

    ich glaube langsam, du hast gar keine Ahnung was du da machst. Du solltest dich vielleicht erst mit grundlegenderen Dingen beschäftigen, bevor du anfängst irgendwelche AJAX-Chats zusammen zu klicken.
    Wieso ich das behaupte?
    => Der gezeigte Code trägt nicht im Ansatz zum Cookie-Problem bei und wird wohl auch nicht die Ursache des Problems sein.

    VlG



  • RandomAccess85 schrieb:

    Hallo,

    ich glaube langsam, du hast gar keine Ahnung was du da machst. Du solltest dich vielleicht erst mit grundlegenderen Dingen beschäftigen, bevor du anfängst irgendwelche AJAX-Chats zusammen zu klicken.
    Wieso ich das behaupte?
    => Der gezeigte Code trägt nicht im Ansatz zum Cookie-Problem bei und wird wohl auch nicht die Ursache des Problems sein.

    VlG

    NOOB! Die Function getLogoutXMLMessage() wird aufgerufen. Es folgt die Logout Site.



  • LiGERWooD schrieb:

    NOOB!

    Wieso wundert mich das nicht. 🙄
    Mach' deine Hausaufgaben und überlege dir, ob dir so nochmal jemand hier helfen wird oder nicht.

    http://www.tty1.net/smart-questions_de.html


Log in to reply