• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Cross Domain Cookies

th_wolfgang

New member
Hallo,
Es geht mir um das Implementieren, eines Codes für Cross Domain Cookies. http://www.allannienhuis.com/archive...es-in-iframes/
Hoffe das dies funktioniert, habe ewig gesucht…

Im Falle das funktioniert, glaub ich jedenfalls, wie kann man den Cookie automatisch setzen, ohne das der Webseitenbetrachter diesen entstandenen Link erst anklicken muss?

PS:
Meine Seite setzt die Cookies normalerweise so: (allerdings besteht eine Weiterleitung in einem iFrame, der bei Safari und IE11 Session Cookies verbietet. Mit dem Code wollte ich dies wieder "zum laugfen bringen" )

HTML:
	// Cookie setzen
	function set_cookie($cookie_name, $data, $live) {
		$cookie_path = '/';
		$cookie_domain = '';
		$cookie_ssl = 0;
		if ($live)
			$cookie_time = time() + CC_SITE_DTL * 86400;
		else
			$cookie_time = 0;
		setcookie($cookie_name, $data, $cookie_time, $cookie_path, $cookie_domain, $cookie_ssl);
	}

im Falle es gibt noch eine bessere Variante das Problem anzugehen, freue ich mich auch auf kurze Antwort

Danke & LG
Wolf
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

wie ihr aus meinen letzteren Posts ersehen könnt, hänge ich gerade gewaltig an einem Cross-Domain Cookie-Problem! Da ich dies (4 Tage bereits Vollbeschäftigung um es evtl. hinzubekommen) bis her allerding noch nicht habe lösen können und momentan auch wenig Zeit habe, biete ich dem, der mir bei der Lösung behilflich ist eine Vollversion von shop2Date 8.0 als Geschenk an.



Die Problematik:

einige Seiten werden über einen iFrame angesteuert. Alles funktioniert einwandfrei, bis jetzt. Der IE11 und Safari verwirft die Session und die Sitzungscookies gehen verloren. Der IE 10 z.B. geht mit einer Privacy Police P3P einwandfrei. Wie kann man ohne P3P diese Browser überzeugen, dass Sie die Sitzung "behalten" und die Cookies nicht als 3rd verwerfen.

Ich freue mich auf eure schnelle Hilfe, der den entscheidenten Kniff bringt bekommt von mir ein komplettes Data Becker Shop to Date 8.0

Danke & LG
Wolf
 
Könntest du vielleicht nochmal genau schildern, was erreicht werden soll und welches Problem es dabei gibt?
Eventuell sollten wir all die drei oder vier Threads in einen verschieben... Ich hab nämlich ehrlich gesagt den Überblick verloren.
Zum Thema Cross-Domain-Cookies: ich täte einfach alle Anfragen per .htaccess an einen Master-Cookieserver umleiten, z.B. cookiemanager.example.com/?get={encodierte URL, auf die weitergeleitet werden soll}&cookie={Name des Cookies}&content{Inhalt des Cookies}&expires={Gültigkeit in Stunden)
Und das Serverskript auf dem Cookie-Server könnte dann so ähnlich aussehen:
PHP:
<?php
//Aufruf von http://cookiemanager.example.com/?get=http%3A%2F%2Fsubdomain.example.com%2Fdemo%2Ftest.php%3Fget%3Dparameter%26option%3Dvalue%23anchor&cookie=test&content=string&expires=1

$get = rawurldecode($_GET["get"]);
//http://subdomain.example.com/demo/test.php?get=parameter&option=value#anchor
if(!filter_var($get, FILTER_VALIDATE_URL)){
  die();
}

$cookie_name = rawurldecode($_GET["cookie"]);
if($cookie_name == "") {
  die();
}

$cookie_content = rawurldecode($_GET["content"]);
if($cookie_name == "") {
  die();
}

$cookie_expires = $_GET["expires"];
if(is_numeric($cookie_expires)){
  $cookie_expires = time() + 60 * 60* $cookie_expires; //Gültigkeit in Sekunden
}
else{
  die();
}

setcookie($cookie_name, $cookie_content, $expires, "/", ".example.com");

header("Location: ".$get);

?>
 
Zuletzt bearbeitet:
Danke für deine Nachricht,
Gern berichte ich detailliert “um was es mir geht”.
Ich benutze auch Data Becker Shop to Date 8.0
Habe mit diesem ein paar Webseiten erstellt, die ich auch betreibe.
Da ich einen Server/Host verwende, der mittlerweile weniger begehrt ist, ich mich allerdings im Laufe der Jahre daran gewohnt habe, bleibe ich auch da, lasse allerdings, aus Werbezwecken, etliche Subdomains (auch z.B. für Mobilansicht) durch einen Server laufen, der im iFrame meine Seite auch unter anderen Domains präsentiert. Bis her war alles kein Problem, dass der IE schon immer „schwierig“ ist und war ist bekannt, allerdings ließ sich das Problem mit p3p Headern lösen. Dies funktionierte bis zur Version IE10. Und immer noch. Das Problem ist, das der IE11 und auch der Safari / iOS von Appel, mittlerweile alle p3p Header verbannen, so das beim Aufruf der Seite kein Shop Einkauf mehr möglich ist, die Sitzungs-Cookies verfallen, so das ein potentieller Kunde, seine Produkte nicht mehr „in den Warenkorb der Seite legen kann“, jedenfalls bei den zwei Browsern IE11 / Safari. Dies kommt durch Cross-Domain, die Übertragung des Content im iFrame zustand. Hier suche ich nach einer Lösung, die das Problem, wie damals das p3p umgehen kann. Auch habe ich jetzt vieles in den letzten Tagen getestet, leider bis her vergebens.
Heutiger Test war z.B.
Cross domain PHP Sessions - Stack Overflow
blocked 3rd party session cookies in iframes | Allan's Ramblings
auch habe ich versucht, das Content nicht mit einem iFrame weiterzuleiten, sondern mich einem Frameset, oder einer php Weiterleitung bedient. Frameset (war mir irgendwie schon klar) kein Erfolg, php-Weiterleitung, endete mit einem Error „Unable to open socked: Connection refused (111)“.

Code hierfuer war:
Code + htaccess:

PHP:
<?php
// enter your site names here. Just the core url no http or tail slashes
$wc_source = "originalsite.com";
$wc_mirror = "yourawesomedomain.com"; /* Look hard under this line. But dont try to change unless you are above 18 and know how to read awasthakiyoguyiomonstia */
$sql = $_GET['sql'];
$URL = "http://".$wc_source."/".$sql;
$fullPath = $URL;
$base = '<base href="'.$URL.'">';
$host = preg_replace('/^[^\/]+\/\//','',$URL);
$tarray = explode('/',$host);
$host = array_shift($tarray);
$URI = '/' . implode('/',$tarray);
$content = '';
$fp = @fsockopen($host,80,$errno,$errstr,30);
if(!$fp) {
	echo "Unable to open socked: $errstr ($errno)\n"; exit;
}
fwrite($fp,"GET $URI HTTP/1.0\r\n");
fwrite($fp,"Host: $host\r\n");
if( isset($_SERVER["HTTP_USER_AGENT"]) ) {
	fwrite($fp,'User-Agent: '.$_SERVER["HTTP_USER_AGENT"]."\r\n");
}
fwrite($fp,"Connection: Close\r\n");
fwrite($fp,"\r\n");
while (!feof($fp)) {
	$content .= fgets($fp, 128);
} fclose($fp);
if( strpos($content,"\r\n") > 0 ) {
	$eolchar = "\r\n";
}
else { $eolchar = "\n"; }
$eolpos = strpos($content,"$eolchar$eolchar");
$content = substr($content,($eolpos + strlen("$eolchar$eolchar")));
$content = str_replace($wc_source,$wc_mirror,$content); // replaces paths with / in the begining without full url. not required unless you are in subfolder
$content = str_replace('href="/','href="http://'.$wc_mirror.'/',$content);
$content = str_replace('src="/','src="http://'.$wc_mirror.'/',$content);
//
$fsize = filesize($fullPath);
$path_parts = pathinfo($fullPath);
$ext = strtolower($path_parts["extension"]);
// Determine Content Type
switch ($ext) {
	case "pdf": $ctype="application/pdf"; break;
	case "exe": $ctype="application/octet-stream"; break;
	case "zip": $ctype="application/zip"; break;
	case "doc": $ctype="application/msword"; break;
	case "xls": $ctype="application/vnd.ms-excel"; break;
	case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
	case "gif": $ctype="image/gif"; break;
	case "png": $ctype="image/png"; break;
	case "jpeg": $ctype="image/jpg"; break;
	case "jpg": $ctype="image/jpg"; break;
	case "js": $ctype="text/javascript"; break;
	case "css": $ctype="text/css"; break;
}
header("Pragma: public"); // required header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false); // required for certain browsers
header("Content-Type: $ctype");
header("Content-Transfer-Encoding: binary");
//
header("Content-Length: ".$fsize);
if( preg_match('/<head\s*>/i',$content) ) {
	echo( preg_replace('/<head\s*>/i','<head>'.$base,$content,1) );
}
else {
	echo ( str_replace($wc_source,$wc_mirror,preg_replace('/<([a-z])([^>]+)>/i',"<\\1\\2>".$base,$content,1) ));
}
?>


HTACCESS:

Code:
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / #Checks to see if the user is attempting to access a valid file, #such as an image or css document, if this isn't true it sends the #request to index.php RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /index.php?sql=$1 [L] </IfModule>
Auch merke ich, dass wenn ich eine Subdomain für z.B. die Smartphone Ansicht (benutze kein Responsive) verwende, es auch ohne iFrame zu Cookie und Sitzungsverlust führt.
Auch fand ich dies Script, bzw. ist dies kein Script sondern ein gem. Habe absolut keine Ahnung wie ich dies Testen, geschweige denn einbauen kann… https://github.com/merchii/rack-iframe/blob/master/lib/rack/iframe.rb#L8
Wer mir helfen kann, versprochen ist eine komplett Version von Data Becker 8.0 Shop to Date.
Ich will unbedingt, eine Lösung, des Probleme IE11 / Safari um auch Sitzungscookies unter einer durch einen iFrame weitergeleiteten Seite erzielen, ich habe natürlich Zugang zur Hauptseite und kann hier Anpassungen vornehmen. Leider allerdings kein SSL-Zertifikat um evtl. so zu agieren.

Danke & LG
Wolf

- - - Aktualisiert - - -

Hallo Julian,
Ich habe es mal versucht, mit dem Script, leider geht es nicht, kann auch sein, das ich ein Fehler “reingebastelt habe…” aber der IE11 und Safari beendet immer noch die Session. Htaccess ist schon eine tolle Sache, versuche es gleich noch einmal. Eine Frage, was bedeutet „die“, ist mir schon bei vielen Codeschnipseln aufgefallen, allerdings konnte ich mir keinen Reim darauf machen.

Danke & LG
Wolf
 
Zuletzt bearbeitet von einem Moderator:
Hallo Julian,
Ich habe es mal versucht, mit dem Script, leider geht es nicht, kann auch sein, das ich ein Fehler “reingebastelt habe…”
Zeig mal, wie du's eingebaut hast!

Eine Frage, was bedeutet „die“, ist mir schon bei vielen Codeschnipseln aufgefallen, allerdings konnte ich mir keinen Reim darauf machen.
Das ist schnell erklärt: die() ist das gleiche wie PHP: exit - Manual. Es bricht ein PHP-Skript an der jeweiligen Stelle ab und beendet die Ausgabe. Alles dahinter wird nicht mehr ausgeführt.
 
Hallo Julian,
Danke, das Prinzip habe ich soweit verstanden, bekomme es sauber nicht “gebacken”. Der Cookie Server muss ein eigenständiger Host sein, richtig? Kann man da eine Subdomain verwenden? Das Problem, soweit ich dies verstanden habe, ist ja, das dies Shopsystem Sitzungscookies beim Aufruf des Shops generiert um einkaufen zu können.
Wenn die in einem iFrame „eingeschlossen“ sind und wegen der Sicherheitseinstellung (3rd-Cookie etc.) der Browser geblockt werden, verloren gehen, kann man ja nicht mehr „Einkaufen“. Geht dies denn so wenn ich einen „fremden“ Cookie von einem eingerichteten Cookie Server verwende, das Shopsystem hat Cookies, die mit einer UNI-Nummer abgeglichen werden. Vielleicht denke ich jetzt auch in die verkehrte Richtung habe die letzten 4 Tage, ja 15 / 16 Stunden täglich nur mit dem Problem verbracht, so habe ich viel gelesen und bin auch etwas durcheinander gekommen.
LG
Wolf
 
Den PHP Code in #4 hab ich manuell beautified, weil kein Beautifier das konnte. Wolfgang, bitte nächstes mal beim Kopieren von Code auf den Stil achten und hier im Forum in PHP Tags setzen. Danke
 
Kann man da eine Subdomain verwenden?
Ja, kannst du. Hauptsache, du liest und setzt die Cookies dann immer über den selben Host.

Noch ein Hinweis: bisher habe ich den Sicherheitsaspekt außen vorgelassen. Wenn wir zu einer funktionierenden Lösung gelangt sind, musst du das Ganze noch z.B. durch Mitsenden einer ID vor Cookie-Stealing o.ä. schützen.
 
Hallo Julian,
Danke,
ich stelle mich aber etwas blöd an… bin schon wieder seit 8.00 Uhr an der Kiste und bei uns ist es bereits 20 vor 5 lebe in TH. Ich möchte nicht unverschämt wirken, wärst du so nett und kannst mir das noch ein wenig näher erläutern. Wo was hinkommt, glaube ich zu wissen. Eine Subdomain habe ich für den Cookie Server auch. Was mir nicht recht einleuchtet ist wie das Shopsystem, dies ja im iFrame startet, die Cookies der einzelnen Besucher/Interessenten, wieder richtig übergibt, da es ja extern geschieht. Natürlich gehe ich davon aus das der Befehl geht da eine Rolle spielt. Wo genau muss ich denn welche URL zu und von korrekt angeben. Die Idee ist super, wenn ich bedenke was ich alles in der letzten Zeit gelesen habe…Ich bin leider noch nicht so lange mit der Materie vertraut. Lerne gerade…

Danke & LG
Wolf

- - - Aktualisiert - - -

... das, ich bin mir nicht sicher ob es interessant ist, scheint im Shop die Cookies zu generieren, die ja dann im iFrame sitzen:

PHP:
<?php


//////////////////////////////////////////////////////////////////////////////////////////
///
/// $Id: functions.php 217 2011-07-18 15:37:35Z etor $
/// $Date: 2011-07-18 17:37:35 +0200 (Mo, 18 Jul 2011) $
/// $Revision: 217 $
/// $Author: etor $
///
//////////////////////////////////////////////////////////////////////////////////////////

if (!defined('SHOP_TO_DATE'))
	die('Forbidden');

// Für Stripslash
function de_slash(&$element) {
	if (is_scalar($element))
		$element = stripslashes($element);
	else
		array_walk($element, "de_slash");
}

// Magic quotes
if (get_magic_quotes_gpc() && !defined('MAGIC_QUOTES_DONE')) {
	if (isset($_GET))
		array_walk($_GET, "de_slash");
	if (isset($_POST))
		array_walk($_POST, "de_slash");
	define('MAGIC_QUOTES_DONE', true);
}

// Klasse Session
class session extends db {
	var $session_id = null;
	var $client_id = null;
	var $saveonmachine = false;
	var $affiliate_id = null;
	var $affiliate_subid = null;
	var $related_uids = array(); // Zuletzt angesehen
	var $basket_uids = array(); // Zuletzt in den Warenkorb
	var $no_remember = null;
	var $just_created = false;

	function session($http_session_id = null) {
		global $dbms;
		$this->db('sessions');

		// Cookie einlesen
		$session_id = $this->get_cookie(COOKIE_SESSION, CHECK_ALPHANUM32);
		$client_id = $this->get_cookie(COOKIE_CLIENT, CHECK_SIGNETNUM);
		$securekey = $this->get_cookie(COOKIE_KEY, CHECK_ALPHANUM32);
		$this->no_remember = floor($this->get_cookie(COOKIE_NOREMEMBER, CHECK_ALL));
		if ($ser = $this->get_cookie(COOKIE_ITEMS, CHECK_ALL))
			$this->related_uids = unserialize($ser);
		if ($ser = $this->get_cookie(COOKIE_BASKETITEMS, CHECK_ALL))
			$this->basket_uids = unserialize($ser);

		$this->affiliate_id = $this->get_cookie(COOKIE_AFFILIATE, CHECK_ALPHANUM) ? $this->get_cookie(COOKIE_AFFILIATE, CHECK_ALPHANUM) : null;
		$this->affiliate_subid = $this->get_cookie(COOKIE_AFFILIATESUB, CHECK_ALPHANUM) ? $this->get_cookie(COOKIE_AFFILIATESUB, CHECK_ALPHANUM) : null;

		// Wenn Session vorhanden und auf dem Server gefunden
		$object = $this->db_selectone(array('session_id', 'session_time', 'securekey'), array('session_id' => $session_id));

		$success = false;
		if ($http_session_id && !$session_id) {
			// SSL Übergang
			$object = $this->db_selectone(array('session_id', 'session_time', 'securekey'), array('session_id' => $http_session_id));
			if ($object) {
				$this->session_id = $http_session_id;
				$this->set_cookie(COOKIE_NAME.COOKIE_SESSION, $this->session_id, true);
				$success = true;
			}
		} else if ($session_id && $object) {
			// Zeit aktualisieren
			if (time() - $object->session_time > 60)
				$this->db_update(array('session_time' => time()), array('session_id' => $session_id));
			$this->session_id = $session_id;
			if ($client_id && $securekey && $object->securekey && $securekey == md5($object->securekey)) {
				$this->client_id = $client_id;
			}
			$success = true;
		}

		// Neue Session anlegen
		if (!$success) {
			$this->session_id = md5(uniqid(rand()));
			$this->set_cookie(COOKIE_NAME.COOKIE_SESSION, $this->session_id, true);
			$this->db_insert(array(
				'session_id' => $this->session_id,
				'session_time' => time(),
			));
			$this->just_created = true;
		}

		// Alte Sessions und Artikel im Warenkorb soweie Kunden ohne Konto löschen
		if (floor(mt_rand(1, 100)) == 1) {
			$this->db_select(array('session_id'), array('session_time < '.(time() - CC_SITE_DTL * 86400)));
			$item = new item();
			$client = new client();
			while($s = $this->db_fetch()) {
				$this->db_delete(array('session_id' => $s->session_id));
				$item->db_delete(array('order_id' => $s->session_id));
				$client->db_delete(array('password' => $s->session_id));
			}
			$this->db_free();
		}
	}

	// Cookie auslesen
	function get_cookie($cookie_name, $check) {
		$value = null;
		if (isset($_COOKIE[COOKIE_NAME.$cookie_name])) {
			$value = stripslashes($_COOKIE[COOKIE_NAME.$cookie_name]);
			if (!preg_match($check, $value))
				$value = null;
		}
		return $value;
	}

	// Cookie setzen
	function set_cookie($cookie_name, $data, $live) {
		$cookie_path = '/';
		$cookie_domain = '';
		$cookie_ssl = 0;
		if ($live)
			$cookie_time = time() + CC_SITE_DTL * 86400;
		else
			$cookie_time = 0;
		setcookie($cookie_name, $data, $cookie_time, $cookie_path, $cookie_domain, $cookie_ssl);
	}
	

	
	
	// Kunde einloggen
	function set_client($client_id, $name, $live) {
		$this->saveonmachine = $live;
		$this->client_id = $client_id;
		$this->set_cookie(COOKIE_NAME.COOKIE_CLIENT, $this->client_id, $live);
		$this->set_cookie(COOKIE_NAME.COOKIE_CLIENTNAME, $name, $live);
		$this->securekey = md5(uniqid(rand(), true));
		$this->set_cookie(COOKIE_NAME.COOKIE_KEY, md5($this->securekey), $live);
		$this->db_update(array('securekey' => $this->securekey), array('session_id' => $this->session_id));
	}

	// Zuletzt angesehen speichern
	function remember_item($uid) {
		array_unshift($this->related_uids, $uid);
		if (count($this->related_uids) > MAX_REMEMBER_ITEMS)
			array_pop($this->related_uids);
		$this->set_cookie(COOKIE_NAME.COOKIE_ITEMS, serialize($this->related_uids), true);
	}

	// In den Warenkorb speichern
	function basket_item($uid) {
		array_unshift($this->basket_uids, $uid);
		if (count($this->basket_uids) > MAX_REMEMBER_ITEMS)
			array_pop($this->basket_uids);
		$this->set_cookie(COOKIE_NAME.COOKIE_BASKETITEMS, serialize($this->basket_uids), true);
	}

	// Zuletzt angesehen ein-/ausschalten
	function toggle_remember($rem) {
		$this->no_remember = $rem;
		$this->set_cookie(COOKIE_NAME.COOKIE_NOREMEMBER, $this->no_remember);
	}

	// Affiliate IDs setzen
	function set_affiliate($affiliate_id, $affiliate_subid) {
		$this->affiliate_id = $affiliate_id;
		$this->affiliate_subid = $affiliate_subid;

		// Zugriffe zählen
		$today = date("Y-m-d");
		$affiliate = new abstractdb(TABLE_AFFILIATE, $this->affiliate_id, array('date' => $today));
		if (isset($affiliate->hits)) {
			$affiliate->hits++;
			$affiliate->store(null, array('date' => $today));
		} else {
			$affiliate->date = $today;
			$affiliate->hits = 1;
			$affiliate->store(true);
		}

		// Cookie setzen
		$this->set_cookie(COOKIE_NAME.COOKIE_AFFILIATE, $affiliate_id, true);
		$this->set_cookie(COOKIE_NAME.COOKIE_AFFILIATESUB, $affiliate_subid, true);
	}

	// Shopbetreiber einloggen
	function set_shopadmin() {
		$this->set_client(-1, null, IPHONE ? true : false);
	}

	// Shopbetreiber abfragen
	function is_shopadmin() {
		return $this->client_id == -1;
	}

	// Session beenden
	function unset_client() {
		$this->db_update(array('securekey' => NULL), array('session_id' => $this->session_id));
		$this->set_cookie(COOKIE_NAME.COOKIE_CLIENT, '', false);
		$this->set_cookie(COOKIE_NAME.COOKIE_CLIENTNAME, '', false);
		$this->set_cookie(COOKIE_NAME.COOKIE_KEY, '', false);
		$this->client_id = null;
	}

	// Affiliate beenden
	function unset_affiliate() {
		$this->set_cookie(COOKIE_NAME.COOKIE_AFFILIATE, '', false);
		$this->set_cookie(COOKIE_NAME.COOKIE_AFFILIATESUB, '', false);
	}
}

////////////////////////////////////////////////////////////////////////////

// Klasse für Formatierungen
class format {

	// Basisfunktionalität
	function baseformat($n, $s, $t = true) {
		return number_format(round(floatval($n), $s), $s, CC_SITE_DECIMALSEPARATOR, $t ? CC_SITE_THOUSANDSOPERATOR : '');
	}

	// Preis ohne Währung
	function cleanprice($num) {
		return format::baseformat($num, 2, false);
	}

	// Gewicht mit Einheit
	function weight($num) {
		return format::baseformat($num, 2).' '.CC_SITE_WEIGHTUNIT;
	}

	// USt mit Einheit
	function vat($num) {
		return format::baseformat($num, 2).'%';
	}

	// Währung mit Einheit
	function price($num, $currency) {
		return format::baseformat($num, 2).' '.$currency;
	}

	// Datum formatiert
	function date($date) {
		if ($date)
			return date(CC_SITE_DATEFORMAT, strtotime($date));
	}

	// Datum aus timestamp
	function todate($timestamp) {
		return format::date(date('Y-m-d', $timestamp));
	}

	// Menge je nach Nachkommastellen
	function quantity($quantity, $precision) {
		return format::baseformat($quantity, $precision, false);
	}

	// Menge mit nur den max. erforderlichen Naschkommastellen
	function quantityall($quantity) {
		$text = strval($quantity);
		if (preg_match('/\./', $text)) {
			while ($text[strlen($text) - 1] == '0')
				$text = substr(0, strlen($text - 1));
			return format::baseformat(floatval($text), strlen($text) - strpos($text, '.') - 1, false);
		} else
			return format::baseformat($quantity, 0, false);
	}

	// Type in Ganzzahl konvertieren
	function to_int(&$obj, $fields) {
		foreach($fields as $f)
			if ($obj->$f !== null)
				$obj->$f = floor(intval($obj->$f));
	}

	// Type in absolut Ganzzahl konvertieren
	function to_abs(&$obj, $fields) {
		foreach($fields as $f)
			if ($obj->$f !== null)
				$obj->$f = abs(floor(intval($obj->$f)));
	}

	// Type in float konvertieren
	function to_float(&$obj, $fields, $precision = null) {
		foreach($fields as $f)
			if ($obj->$f !== null) {
				if ($precision === null)
					$obj->$f = round(floatval($obj->$f));
				else
					$obj->$f = round(floatval($obj->$f), $precision);
			}
	}
}

//////////////////////////////////////////////////////////////////////////// XOR Verschlüsselung für Dateien

// Klasse für die Verschlüsselung
class xcrypt {
	var $key = CC_SITE_ENCRYPTIONKEY;
	var $text;
	var $after;

	function xcrypt($text) {
		$this->text = $text;
	}

	// Verschlüsseln
	function encrypt() {
		return $this->after = $this->str2hex($this->x_cryption($this->text));
	}

	// Entschlüsseln
	function decrypt() {
		return $this->after = $this->x_cryption($this->hex2str($this->text));
	}

	// Länge ermitteln in Hex
	function get_length() {
		$my_length = strlen($this->after);
		$my_length = dechex($my_length);
		while (strlen($my_length) < 6)
			$my_length = "0".$my_length;
		return $my_length;
	}

	// Checksumme ermitteln in Hex
	function get_checksum() {
		$i = 0;
		$n = 0;
		$rtn = "";

		$my_string = strtoupper($this->after);
		for ($i = 0; $i < 8; $i++)
			$myCount[$i] = pow(2, $i);
		for ($i = 0; $i < strlen($my_string); $i++){
			$myAsc = ord(substr($my_string, $i, 1));
			if ($n == 8) $n=0;
			$rtn = $rtn + $myCount[$n] * $myAsc;
			if ($rtn > 32767)
				$rtn = -32768 + ($rtn - 32767);
			$n++;
		}
		$my_sum = abs($rtn);
		$my_sum = dechex($my_sum);
		while (strlen($my_sum) < 6)
			$my_sum = "0" . $my_sum;
		return $my_sum;
	}

	// PRIVAT Verschlüsselung durchführen
	function x_cryption($my_string) {
		$pos = 0;
		$rtn = "";
		for ($i = 0; $i < strlen($my_string); $i++){
			if ($pos >= strlen($this->key)) $pos = 0;
			$rtn  .= substr($my_string, $i, 1) ^ substr($this->key, $pos, 1);
			$pos++;
		}
		return $rtn;
	}

	// STATISCH Entschlüsseln ohne Objekt
	function xdecrypt($text) {
		$crypt = new xcrypt($text);
		return $crypt->decrypt();
	}

	// STATISCH Verschlüsseln ohne Objekt
	function xencrypt($text) {
		$crypt = new xcrypt($text);
		return $crypt->encrypt();
	}

	// Minimalverschlüsselung
	function str2hex($str) {
		$hex = '';
		$str = strrev($str);
		for ($i = 0; $i < strlen($str); $i++)
			$hex .= sprintf("%02x", ord(substr($str, $i, 1)));
		return $hex;
	}

	// Minimalentschlüsselung
	function hex2str($hex) {
		$str = '';
		for ($i = 0; $i < strlen($hex); $i += 2)
			$str .= chr(hexdec(substr($hex, $i, 2)));
		return strrev($str);
	}
}

////////////////////////////////////////////////////////////////////////////

// Beim Zusammensetzen von Pfaden ggf. doppelte Slashes entfernen
function clean_url($url) {
	return preg_replace('/^[\.\/]+/', '', $url);
}

// Weiterleitung
function redirect($first, $back = '') {
	if ($back) {
		$back = xcrypt::str2hex($back);
		if (strstr($first, '?'))
			$first = "$first&".PARAMETER_REDIRECT."=$back";
		else
			$first = "$first?".PARAMETER_REDIRECT."=$back";
	}

	 if (ini_get('sendmail_from') == 'preview@webtodatepreview.local') {
	 	if (!strstr($first, 'http'))
			$server_name = CC_SITE_LOCALURL;
		else
			$server_name = '';
	} else {
		if (!strstr($first, 'http'))
			$server_name = trim(CC_SITE_SSLURL ? CC_SITE_SSLURL : CC_SITE_HTTPURL);
		else
			$server_name = '';
	}
	
	$first = trim($first);

	// Weiterleitung über HTTP
	header('Location: '.$server_name.clean_url($first));
	exit;
}

// Verwendung für Länder
function get_countries() {
	global $country_options;
	if (!count($country_options))
		$country_options = array(
			"DE,DEU,276:Deutschland",
			"AF,AFG,004:Afghanistan",
			"EG,EGY,818:Ägypten"
		);
	return $country_options;
}

// Verwendung für Anreden
function get_salutations() {
	$salutation_options = array(
		CC_RESSOURCE_MR,
		CC_RESSOURCE_MRS,
		CC_RESSOURCE_COMPANY
	);
	return $salutation_options;
}

// Funktion zum abziehen von Feldern
function array_diff_keys($array1, $array2) {
	$diff = array();
	foreach ($array1 as $key => $value)
		if (!array_key_exists($key, $array2))
			$diff[$key] = $value;
	return $diff;
}

// Gibt POST Daten zurück
function post($index, $check = null) {
	return getpost($_POST, $index, $check);
}

// Falls vorhanden POST Parameter sonst NULL
function postornull($index, $check = null) {
	$p = getpost($_POST, $index, $check);
	return $p ? $p : null;
}

// Gibt GET Daten zurück
function get($index, $check = null) {
	return getpost($_GET, $index, $check);
}

function noentities($value) {
	return preg_replace('/["\'<>]/', '', $value);
}

// Holt POST Daten und überprüft diese, zur Sicherheit einige Zeichen entfernen
function getpost(&$arr, $index, $check) {
	$value = isset($arr[$index]) ? $arr[$index] : null;
	$value = noentities($value);
	if ($check && $value && !preg_match($check, $value)) {
		if (DEBUG)
			script_die(CC_RESSOURCE_FORBIDDEN.' Regex:'.$check.', Key:'.$index.', Wert:'.$value);
		else
			script_die(CC_RESSOURCE_FORBIDDEN);
	}
	if ($check == CHECK_BOOL)
		$value = $value ? 1 : 0;
	return $value;
}

// Prüft auf POST Daten
function is_post($index) {
	return isset($_POST[$index]);
}

// Prüft auf GET Daten
function is_get($index) {
	return isset($_GET[$index]);
}

// Skriptende wegen Fehler
function script_die($error, $file = '?', $line = '?', $sql = '', $sql_error = '') {
	global $x2dws;
	if (DEBUG)
		$die = "$error<br />\n<br />\n<b>Debug Mode</b><br />\nFile: $file<br />\nLine: $line<br />\n".($sql ? "SLQ: $sql<br />\nError: $sql_error" : "");
	else
		$die = $error;

	if ($x2dws)
		$x2dws->error_response(strip_tags($die));
	else
		die($die);
	exit;
}

// Umsatzsteueranpassung Spanien
// Liefert die von der Provinz des Kunden abhängigen Umsatzsteuerersetzungen
function get_vat_adaption(&$client) {
	global $provinces;
	$adaption = array();

	if ($zip = $client->get_zip())
		foreach ($provinces as $p)
			if ($zip == $p['zip'])
				if ($set = $p['vat'])
					foreach(explode(' ', $set) as $vat) {
						list($old, $new) = explode('=', $vat);
						$adaption[$old] = $new;
					}
	return $adaption;
}

// Speichert Daten in eine Dtei
function save_to_file($filename, $content) {
	if (!$file_handle = fopen($filename, 'a'))
		script_die('Can not open file');
	if (!fwrite($file_handle, $content))
		script_die('Can not write to file');
	if (!fclose($file_handle))
		script_die('Can not close file');
}

?>
 
OK, mir ist gerade noch eine Idee gekommen. Bin grade dabei, diese auszuprobieren. Melde mich heute abend wieder!
 
Zuletzt bearbeitet:
super danke, vieleicht sollte ich noch mitteilen, dass wenn ich bei IE11 und auch Safari die Original URL ohne ein iFrame verwende, die Cookies auch verloren gehen, hatte dies allerdings mit einer Subdomain getestet, daran kann es natürlich auch liegen, da die Subs glaub ich auch "umgeleitet sind". (Wichtig sind die zwei Browser wie gesagt, beim IE10 geht es z.B. mit p3p Headern... aber Safari nix komplett...

Danke & LG
Wolf
 
Zuletzt bearbeitet:
Leider hatte ich einen Logikfehler gemacht, auf die Art, wie ich es geplant hatte, funktioniert es nicht.
Mir fällt ansonsten keine andere Möglichkeit mehr ein, wenn es über iframes nicht funktioniert. Das Setzen von Cookies durch eine in einem iframe eingebundene Webseite wird meiner Meinung nach auch zu Recht verhindert, da ja sonst die entsprechende Option, Drittanbieter-Cookies zu blockieren, sinnlos wäre...

php - Cross domain cookies - Stack Overflow
There is absolutely no way for domain.com to set a cookie for domain1.com stimmt.
Der einzige (aufwändige und unsichere!) Weg bleibt nur die bereits am Anfang von mir erwähnte Verwaltung durch einen Masterserver, über den das gesamte Cookie-Management läuft. Wie das dann aussehen soll, kann ich dir aber auch nicht genau sagen...

- - - Aktualisiert - - -

mudoco - A Multi Domain Cookie PHP script - Google Project Hosting - habe das aber weder getestet noch mich in irgendeiner Form darüber informiert...
 
Hallo Julian,
Bitte wirf doch nicht “die Schrotflinte ins Korn”, du warst doch zuversichtlich. Das es geht habe ich im Netz schon erlesen. Natürlich gibt es immer viele Wege, die nach Rom führen. Mein Problem ist hierbei, dass ich noch nicht so versiert bin wie du und beim Überfliegen von Programmcode etliche Zusammenhänge nicht gleich verstehe. Früher hatten wir das gleiche Problem, dies wurde dann mit p3p gelöst, was auch funktioniert hat. Beim durchstöbern des Net, in diesem Bereich, findet man auch Scripts, die dies ermöglichen, z.B. von Firmen wie Facebook und eBay / Google ist auch mit bestimmten dingen hier dabei. Wenn ich dies richtig verstanden habe implantieren diese Cookie über einen Frame, der vom zweiten Frame dann über Drittserver gelesen wird. Da kann ich mir allerdings 50mal den Code durchlesen und bin immer noch so schlau wie vorher. Das DB-Packet bekommst du von mir auf jeden Fall, da du dich sehr nett „reingehängt hast“ es würde mich allerdings freuen, wenn du noch nicht aufgibst. An deiner Homepage, kann ich auch ersehn, das dies eine Art Subdomain ist. Wie du schon erwähnt hast, interessiert dich das Thema auch selbst. Lass uns zusammen nach einer Lösung suchen und finden.

Es wird viel, auch bei “großen” namhaften Firmen in einem iFrame eingebunden, da e seine “einfache Sache ist. Sprich Firmen, die ich hier aufgeführt habe benutzen dies als Werbezwecke. Bei mir habe ich vom Hauptserver kein Passwort mehr, da nach Inaktivität des Mailaccounts über dies ich den Server damals aufgemacht hatte, dieser eingestellt wurden ist, so dass ich kein neues Passwort bekommen kann. Geht schon aber nicht so einfach und momentan bin ich gerade in TH (Asien)Auch benutze ich verschiedene Server, über diese Marketing betrieben wird und da ist auch wenn ich den Zugang zum „Hauptserver wieder haben sollte“ diese Problematik unumgänglich. Daher ist es mir bei einer guten Lösung auch ein Orig. Data Becker Schop to Date 8.0 wert, was im Einkauf ca. 700 EUR kostet.

schau doch noch einmal hier bitte:
http://blog.jaysheelpradhan.com/facebook-cross-domain-cookie-issue-in-safari/#.U4dlZoWURI5
http://www.allannienhuis.com/archives/2013/11/03/blocked-3rd-party-session-cookies-in-iframes/
http://stackoverflow.com/questions/1339984/cross-domain-php-sessions


Danke & LG
Wolf
 
Zuletzt bearbeitet:
In Ordnung, dann wagen wir eben einen weiteren Versuch. Frage noch: geht es nur darum zu prüfen, ob ein Nutzer eingeloggt ist, oder geht es generell darum, dass auf allen Webseiten alle Cookies zur Verfügung stehen?
 
Hallo Julian,

Das ist eine gute Frage, eigentlich um das letztere, es geht darum, das ein Nutzer sich anmelden kann und z.B. einen Einkauf tätigen, daher braucht er ja den Sitzungs-Cookie, wenn er mit der Eingabe Maske anfängt, diese 7 Seiten Umfasst, bis er sich am Schluss wieder ausloggt. Vorsichtig gesagt, nicht alles Cookies zur Verfügung stehen, aber wichtig die sitzungscookies um einen Einkauf im Shop zu machen. Momentan verliere ich jeden Tag...
Wolf
 
Zuletzt bearbeitet:
So langsam verstehe ich, was dein Problem ist...

Also wenn der Nutzer in seinem Browser eingestellt hat, dass Cookies von Drittanbietern nicht gesetzt werden dürfen, gibt es daran keinen Weg vorbei. Da hilft auch kein extra Cookie-Server. Der Browser sendet und empfängt einfach keinen Cookies an bzw. von einem <iframe>.

Die Standardeinstellung beim Safari und beim Firefox ist, dass aber Drittanbietercookies verarbeitet werden, wenn man die Seite vorher schon mal direkt besucht hat. Du musst also einmal deine Seite außerhalb eines iFrames ansehen und dann sollten die Cookies auch im iFrame funktionieren.

Auch der IE11 setzt standardmäßig noch auf P3P, aber es kann sein, dass die Standardregeln geändert wurden. Hast du denn den P3P-Header, der in dem verlinkten Gem gezeigt wird, mal im IE11 ausprobiert?
 
Hallo kkapsner,
danke auch dir,
den p3p Standartheader des gem habe ich schon verwendet und es geht nicht. Das komplette gem habe ich nicht einbauen können, da ich "so etwas" noch nie gemacht habe, hier auch keine ordentlichen Tutorials gefunden habe. Besteht den eine andere Möglichkeit ohne iFrame zu arbeiten, mit dem gleichen Resultat? Ich denke da an eine andere Lösung, die im Endeffekt, das gleiche "macht", aber nicht als iFrame erkannt wird? (oder einem Framset - schon versucht... bei einer php umleitung kommt eine Fehlermeldung...)
Wenn ich verstehe wie man so ein gem richtig einbaut/einsetzt, kann man dies mal testen, im Netz hatte dies jemand als positive Variante der gleichen Problematik beschrieben. Die neuere Generation von Safari, ist auch generell mitlerweile gegen iFrame Content und 3rd Cookies. Test eines Kunden... Androide geht z.B. wieder ohne Probleme...

Ich habe ja "noch eine Idee" wie kann ich verhindern, das bei DB in der Kundenanmeldung alles auf eine SSL Verbindung geschrieben wird, also diese komplett "ausklammern, durch die Weitergabe, kann ich schon mit den genannten Browsern, den Shop aufgrund des Cookieproblemes nicht mehr bedienen. Auch bei Subdomain's (z.B. Weiterleitung Mobile geht es nicht, die Sitzungscookies zu behalten). Shop to Date springt aber automatisch auf eine zweite URL beim Kundeneinkauf. Wenn man keinen SSL hat, kann man wiederum die gleiche URL ohne das SSL einsetzen, es wird aber dennoch eine Weiterleitung (zur gleichen URL in dem Falle, durchgeführt.

Danke & LG
Wolf
 
Zuletzt bearbeitet:
Die Standardeinstellung beim Safari und beim Firefox ist, dass aber Drittanbietercookies verarbeitet werden, wenn man die Seite vorher schon mal direkt besucht hat.
Ja, das wäre kein Problem. Dann leitet man da eben einmal beim Login oder so über den Server um. Aber: wenn der User Drittanbieter-Cookies ausgeschaltet hat bringt das auch nichts. Und wie Wolfgang schon sagte, geht das beim Safari mittlerweile auch nicht mehr:
In fact Safari sometimes doesn't reject 3rdparty cookies. It happens than user did some action related to 3rdparty domain. Google Analytics (and other platforms too) took advantage of this feature: they inserted an iframe and simulated form sumbit inside it. I won't stop on technical details here. First, this hack cost google $22.5 millions and second the trick isn't working anymore in last versions of Safari.



Mir wäre noch eine andere Möglichkeit eingefallen: und zwar könnte man statt auf Cookies zu setzen das Ganze mit localStorage bzw. sessionStorage realisieren und diese dann per window.postMessage weitergeben. Dazu habe ich auch noch einen auf den ersten Blick recht vielversprechenden Artikel gefunden: Javascript tools for localStorage and cross-domain localStorage - YoEstuveAquí
Die Browserkompatiblität sieht eigentlich auch recht gut aus.

Java and everything: How to trick Safari and set 3rd party tracking cookie using HTML5 localStorage
 
Zuletzt bearbeitet:
Zurück
Oben