PHP, session, 1and1

Résolu/Fermé
Petit hinculte particulier - 10 mars 2009 à 16:55
 jimmy - 28 déc. 2009 à 16:38
Bonjour,
J'ai un domaine, mettons domaine.fr
j'ai deux sous domaines, mettons sd1.domaine.fr et sd2.domaine.fr


sur sd1.domaine.Fr, il y a une identification via un code PHP. Bon, ça c'est bon, ça marche.

Comment faire pour que l'on soit aussi identifié chez sd2.domaine.fr ? J'avais pensé à des sessions mais je n'arrive pas à les transférer.

Je suis sur un serveur mutualisé de 1and1.
Merci
A voir également:

4 réponses

Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 192
10 mars 2009 à 17:00
je le dis tout de suite, je n'ai pas de solution, mais je trouve ton problème vicieux, et donc ca m'interesse de t'aider a le résoudre....

alors...
1- essayer les cookies: comme tu es sur le meme domaine, peut etre qu'ils seront lisible. Tu stock le nom utilisateur ou un autre identifiant, et hop, le site controle le cookie si la session n'existe pas, et crée une session en parallele. Par contre, le contenu des sessions n'est pas commun

si ca ne marche pas, je peux regarder pour essayer de trouver une autre solution ..

sur wiki : les navigateurs n'enregistrent généralement plus les cookies provenant de sites tiers lors du chargement d'une page web.
0
Petit hinculte particulier
11 mars 2009 à 09:44
Bonjour

L'idée des cookies ne fonctionne pas. J'ai essayé d'en créer un dans domaine.fr et impossible de le lire dans sd1.domaine.fr

et inversement d'ailleurs.


J'avais pensé, y-a-t-il un moyen d'identifier clairement un ordinateur ? Je peux, par exemple, enregistrer les sessions sur une bdd (ça fonctionne j'ai déjà tenté), là si j'arrive à identifier l'ordinateur, je rajoute un champ avec cet identifiant et hop. Je peux essayer de modifier la fonction de création des sessions pour voir les identifiants. Je ne peux pas me baser sur l'adresse IP, ne serait-ce qu'à cause des cas où l'adresse est commune à plusieurs ordinateurs.

Merci
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 192
11 mars 2009 à 09:54
non, il y a quelqeus années, intel avait mis un numéro de série sur les P3... vu comme ca a gueulé, ils on arreté.

j'essayais de résonner avec les fichiers de sission sur le serveur (ils doivent etre accessible d'un manière ou d'une autre), mais elles sont stockées dans des cookies, donc je pense pas que ce soit la bonne solution.

là il faut que je bosse un peu, mais je garde le lien au chaud, et si j'ai une idée, je te fais signe ....

Au pire, tu peux metter un lein du site 1 vers le site 2, et faire passer dans le get un ID unique qui permet d'acceder au site 2 sans rentrer de nouveau les identifiants. Et là, tu stockes l'ID unique dans la BDD ... je sais pas si tu vois ce que je veux dire. Et le 2° site, recrée la session de son coté.

comme ca, si tu t'indentifies sur A, et que de A tu vas sur B avec le lien magique (et tu fais aussi le processus inverse) tu sera deja identifié et B recrée la session
0
Petit hinculte particulier
11 mars 2009 à 10:09
hum..

Je vois, au pire je ferais quelque chose comme ça. Mais je vais continuer à chercher une autre solution.

Merci
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 192 > Petit hinculte particulier
11 mars 2009 à 10:12
si tu trouves quelques chose, n'oublie pas de le mentionner ici, ca m'interesse, je suis curieux

je te tiens au courrant si j'ai d'autres idées
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 192
11 mars 2009 à 10:16
ha, j'ai un truc super vicieux comme je les aime, c'est basé sur ce que je t'ai dit avant...

quand le client c'est identifié sur A, sur la page web qu'il recoit (et sur toutes, pourquoi pas) tu mets une frame invisible (frame, iframe??? pouquoi pas popup), ou n'importe quoi, dans lequel tu passes l'URL d'une feuille de connexion sur le site B...
je sais pas si ca passera au niveau des restrictions sur les cookies ...
0
Petit hinculte particulier
11 mars 2009 à 16:55
Merci. En fait je vais partir sur une idée comme :

je me connecte sur sd1.domaine.fr : la page de connexion envoie les données à sd2.domaine.fr qui se connecte et qui renvoie les données à sd1.domaine.fr qui se connecte à son tour. dans les deux cas l'info que je veux est récupérée par les sous domaines.

bon ce n'est pas ultime et peut être un peu bancal mais ça semble marcher @@.

merci ^^
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 192 > Petit hinculte particulier
11 mars 2009 à 16:59
si ton code fonctionne, penses à publier, ca peut tjs aider qqcn :D
0
Petit hinculte particulier > Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014
12 mars 2009 à 13:52
bien sûr ^^

mais ça attendra la semaine prochaine (j'ai pris ma journée de demain) et j'ai eu des urgences à régler avant.
0
Petit hinculte particulier > Petit hinculte particulier
2 avril 2009 à 16:47
Bon j'ai mis un peu de temps mais voilà, on ne contrôle pas son emploi du temps.


S'il y a des erreurs, désolé j'ai dû supprimer des tas de passages inutiles pour la démo (html, javascript etc.)
base_c contient les infos des comptes (table "qui"), et la table de transfert.
SD1 :
index.php
<?php
session_start();			

include('base/base_c.php'); //inclusion du fichier de connexion à la base de données de connexion
$bconnexion=false;

if($_SESSION['numero'] AND isset($_SESSION['numero'])){//est-on connecté (via les session) ?
	$sql="SELECT * FROM qui WHERE numero='".$_SESSION['numero']."'";//si oui....
	$reponse = mysql_query($sql);
	while($donnees = mysql_fetch_array($reponse)){
		$bconnexion=true;
	}
	if($page=='deconnexion'){//j'ai effacé la partie en question mais $page est déterminé à partir de $_GET
		session_destroy();
	$_SESSION = array();//répétition mais bon, on n'est pas à ça près
		if( ($_SERVER["SERVER_NAME"]=="127.0.0.1") OR ($_SERVER["SERVER_NAME"]=="localhost")){//ok direction sd2 maintenant. On notera que ça ne se produit que lorsqu'on est effectivement connecté
			header('Location: http://127.0.0.1/sd2/deconnexion.html');

		} else { 
			header('Location: http://sd2.domaine.fr/deconnexion.html');
		}
	}
}
if($page=='deconnexion'){

	} else {
		if($bconnexion==false){//si on n'est pas connecté
			$page='connexion';//alors on va automatiquement sur la page connexion
		}
}
$inc='inc.'.$page.'.php';//bien entendu le mieux est de vérifier si $inc existe. c'est ce que je fais perso. Mais ce n'est pas le but là.
mysql_close();
include('base/base.php');//ouverture de la base de données spécifiques à sd1. J'ai préféré faire des bases spécifiques à chaque domaine.



	$messconnexion='';
	if($inc=='inc/inc.connexion.php'){//ça c'est si on doit se connecter (traduction si on va sur une page alors qu'on n'est pas connecté)
		connectetoi();// est une fonction de inc.connexion.php
	}
	
	
	


	mysql_close();
?>

 


inc.connexion.php
<?php

function connectetoi(){
global $messconnexion;

if( ($_SERVER["SERVER_NAME"]=="127.0.0.1") OR ($_SERVER["SERVER_NAME"]=="localhost")){
$baseadresse='http://127.0.0.1/sd2/';
} else { 
$baseadresse='http://sd2.domaine.fr/';
}
mysql_close();//on ferme la base normale quio s'est ouverte et on ouvre la base de connexion
include('base/base_c.php');//
	if($_SESSION['numero'] AND isset($_SESSION['numero'])){//déjà connecté
	$messconnexion= "Bienvenue !";
	} else {
	
		if( (isset($_POST['pseudo'])) AND ($_POST['pseudo']) AND (isset($_POST['pass'])) AND ($_POST['pass'])){//si on reçoit par post les message de connection
			$sql="SELECT * FROM qui WHERE pseudo='".mysql_real_escape_string($_POST['pseudo'])."'";// exploration de la base
			$retour = mysql_query($sql) or die(mysql_error());
			$donnees = mysql_fetch_array($retour);

			if(isset($donnees['numero'])){//si on trouve
				if(sha1($_POST['pass'])==$donnees['pass']){//si le sha du mot de passe entré est identique à ce que la base de données a (pas de mot de passe en clair)
					$_SESSION['numero']=$donnees['numero'];// alors on connecte

					$verif=false;
					while($verif==false){
						$alea=creeralea();//bon là faut que j'explique. Pour transférer à la page sur l'autre domaine, j'ai fait une base de données qui contient : une clé aléatoire, le pseudo et le mot de passe
						//je vais envoyer par header à une page particulière la clé aléatoire pour qu'il retrouve dans la base de données les informations. Là je vérifie que la clé n'existe pas (peut probable mais on ne sait jamais)
						$retour2 = mysql_query("SELECT COUNT(*) AS nbre_entrees FROM transfers WHERE id='$alea'");
						$donnees = mysql_fetch_array($retour);
						if($donnees['nbre_entrees']==0){
							$verif=true;
						}
					}
					$sql2 = "INSERT INTO transfers VALUES('$alea', '" .$_POST['pseudo'] . "', '" . $_POST['pass']. "')";
					mysql_query($sql2) or die(mysql_error());
					header('Location: '.$baseadresse.'connexion.php?d='.$alea);//Zoooouuuuh direction sd2
					//j'envoie par get car c'est plus simple, post ne fonctionne pas en local sous win. Et de toutes façons c'est pas vraiment plus sécurisé. 

				} else {
					connect("pass faux");//la fonction connect est en dessous, c'est le formulaire de connexion
				}
			} else {
				connect("Utilisateur inconnu");
			}
		} else {
			connect('Veuillez vous identifier s\'il-vous-plait.');
		}
	} 
	mysql_close();
	include('base/base.php');
}
function creeralea(){//création de clé aléatoire
$retour='';
$tablettre=array('0','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');
	for($i=0;$i<10;$i++){
		if(mt_rand(0,1)>0.5){
			$max=10;
		} else {
			$max=26;
		}
		$result=mt_rand(0,$max);
		if($max==26){
			$result=$tablettre[$result];
		}
		$retour.=$result;
	}
	return $retour;
}
function connect($erreur){
global $messconnexion;
$messconnexion='<h3>Connexion</h3><form method="post" action="connexion.html">
<p>
'.$erreur.'<br/>
<label>login <input type="text" name="pseudo" value="'.$_POST['pseudo'].'"  /></label><br/>
<label>mot de passe <input type="password" name="pass" /></label><br/><br/>
<input type="submit" value="Valider" /> 

</p>
</form>';
}

function corps(){// ça ne se voit pas dans ce que j'ai mis au dessus (simplification de ce que j'ai fait) mais la fonction corps() est celle quela page index affige (sauf rare cas).
global $messconnexion;
echo $messconnexion;
}
?>


SD2 :
connexion.php
<?php
session_start();
include('base/base_c.php');

	if($_SESSION['numero'] AND isset($_SESSION['numero'])){//connecté ? 
		if( ($_SERVER["SERVER_NAME"]=="127.0.0.1") OR ($_SERVER["SERVER_NAME"]=="localhost")){
			header('Location: http://127.0.0.1/sd1/');
		} else { 
			header('Location: http://sd1.domaine.fr/');
		}

	} else {
	
		if( (isset($_GET['d'])) AND ($_GET['d'])){//si on a le nombre aleatoire
			$sql="SELECT * FROM transfers WHERE id='".mysql_real_escape_string($_GET['d'])."'";//alors... on fouille la base aléatoire
			$retour = mysql_query($sql) or die(mysql_error());
			$donnees = mysql_fetch_array($retour);		

			$datapseudo=$donnees['pseudo'];

			$sql="DELETE FROM transfers WHERE id='".mysql_real_escape_string($_GET['d'])."'";//on supprime, ça serait problématique de laisser ça.
			mysql_query($sql) or die(mysql_error());
			$sql="SELECT * FROM qui WHERE login='".mysql_real_escape_string($datapseudo)."'";// et on va se connecter
			$retour = mysql_query($sql) or die(mysql_error());
			$donnees = mysql_fetch_array($retour);

			if(isset($donnees['numero'])){//si on trouve
				if(sha1($_POST['pass'])==$donnees['pass']){//si le sha du mot de passe entré est identique à ce que la base de données a (pas de mot de passe en clair)
					$_SESSION['numero']=$donnees['numero'];// alors on connecte

				} 
			} 
			
		} 
		mysql_close();

		if( ($_SERVER["SERVER_NAME"]=="127.0.0.1") OR ($_SERVER["SERVER_NAME"]=="localhost")){
				header('Location: http://127.0.0.1/sd1/');
			} else { 
				header('Location: http://sd1.domaine.fr/');//bon on peut varier la redirection hein
		}
		
	}


*


bon bien sûr pour se déconnecter il faut aussi coder la page deconnexion.html sur sd2 (qui renvoie sur sd1) mais je pense que c'est compréhensible comme ça. Il faut aussi gérer le cas où on arrive déconnecté sur sd2, mais ça reste simple, direction sd1 direct.
comme ça, on se connecte toujours à partir de sd1 et on peut se déconnecter à partir des deux.

Il y a probablement des améliorations possible à ce script. Mais il fonctionne donc c'est déjà ça.
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 192 > Petit hinculte particulier
2 avril 2009 à 16:57
pas le temps de regarder tout de suite, mais bravo ;)
0
Il est aussi possible de ne pas utiliser les variables globales en php (recommandé), ça évite que $test soit interprété comme $_POST['test'].

il faut créer un fichier du nom de : php.ini il faudra le placer dans tous les dossiers et sous dossiers qui contiennent des pages en php.
le fichier contiendra une ligne :
register_globals = Off

réponse tardive désolé, mais je viens d'être confronté au problème, et même en renommant mes variable, je ne m'en sortais pas.

Il peut être interessant de s'assurer d'utiliser la dernière version de Php sur 1and1 (php 5)
il faut créer un fichier .htaccess
le placer à la racine du site
le fichier contiendra :
AddType x-mapp-php5 .php
0