[Session] Modifier une session étrangère

Mammouth du PHP | 1668 Messages

17 févr. 2009, 13:07

J'aimerais savoir si j'appelai une session (par session_id()) inexistante, que ce passerait-il ?
Je ne suis pas trop sûr que la manipulation de sessions qu j'ai proposée plus haut fonctionnera. Je suis même certain du contraire après avoir lu ceci:
Note: Lorsque vous utilisez les sessions avec les cookies, le fait de spécifier un id pour session_id() fera qu'un nouveau cookie sera toujours envoyé lors de l'appel à session_start(), sans ce soucier si l'identifiant de session courant est identique à celui qui vient d'être défini.
Il te reste à manipuler les fichiers de session.
+1

J'ai tenté ça (désolé pour l'atrocité du code, mais quand je test, je ne compte pas...) :
<?php
session_start();

if(!array_key_exists('nom', $_SESSION))
{
	echo '<p> cree </p>';
    $_SESSION['nom'] = 'sess021';
}
echo '<p>'.$_SESSION['nom'].' - '.session_id().'</p>';

// Duplication
session_id('g4ma6r274choppulddpuas0264'); // Existe
if(!array_key_exists('nom', $_SESSION))
{
	echo '<p> cree </p>';
    $_SESSION['nom'] = 'sess022';
}
echo '<p>'.$_SESSION['nom'].' - '.session_id().'</p>';

// Duplication bidon
session_id('g4ma6r274chnppulddpuas0264'); // Existe pas
if(!array_key_exists('nom', $_SESSION))
{
	echo '<p> cree </p>';
    $_SESSION['nom'] = 'sess023';
}
echo '<p>'.$_SESSION['nom'].' - '.session_id().'</p>';
J'ai eu ça :
cree

sess021 - hommgjhtfmtmvvmqiefp20fs80

sess021 - g4ma6r274choppulddpuas0264

sess021 - g4ma6r274chnppulddpuas0264
Il va donc falloir que je vois ça à la main

Une session :
nom|s:7:"sess021";
On va varier les plaisirs :
<?php
session_start();
echo session_id();
$_SESSION = array('nom' => 'katagoto', 'id' => 30, 'tab' => array('truc' => 'much', 'num' => 26, 5, 'katagoto', 'tab' => array('ripat', 'HyWaN', 40, 45)));
Nouvelle session :
nom|s:8:"katagoto";id|i:30;tab|a:5:{s:4:"truc";s:4:"much";s:3:"num";i:26;i:0;i:5;i:1;s:8:"katagoto";s:3:"tab";a:4:{i:0;s:5:"ripat";i:1;s:5:"HyWaN";i:2;i:40;i:3;i:45;}}
Je vais voir du côté de session_decode()/session_encode() et de la manipulation des session sous memcache...
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol

ViPHP
ViPHP | 1380 Messages

17 févr. 2009, 13:58

Je vais voir du côté de session_decode()/session_encode() et de la manipulation des session sous memcache...
Ne marchera pas pour désérialiser un fichier de session. Il faudra utiliser les expressions régulières. Exemples ici:
http://fr.php.net/manual/fr/function.se ... .php#78640
ripat

Mammouth du PHP | 1668 Messages

17 févr. 2009, 15:11

Merci, j'ai légèrement retouché l'exemple pour éviter une notice :
function lit_session($chaine)
{
    $vars = preg_split('#([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff^|]*)\|#', $chaine, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
    
	for($i=0; isset($vars[$i]); ++$i)
		$result[$vars[$i++]] = unserialize($vars[$i]);
    
	return $result;
}
J'ai pas très bien compris le regex, mais je pense qu'il fait sont travail, en revanche, lorsque je compare le fichier (via var_dump()) session et le tableau de cette extraction j'ai ça en moins :
[""]=> int(30)
Juste avant la dernière accolade fermante, bizarre :/

Une autre question :

Comment je le re-sérialise ?

Par avance merci de votre aide
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

17 févr. 2009, 15:37

Le dernier benchmark effectué je crois par Naholyr et posté sur PHPfrance faisait apparaitre des performances très en retrait pour PostrGre par rapport à SQLite, donc peut être devrais-tu essayé tout de même pour en être sûr
Ne s'agirait-il pas de celui-ci?
http://www.phpfrance.com/forums/viewtopic.php?t=245780
Exact c'est bien celui-ci, désolé de t'avoir confondu avec Naho :)
Quand tout le reste a échoué, lisez le mode d'emploi...

ViPHP
ViPHP | 1380 Messages

17 févr. 2009, 16:38

Pour réencoder, c'est l'opération inverse. J'ai un peu simplifié le motif du split.
function decode_session($chaine) {
	$motif = '#([a-z0-9_][a-z0-9_;]+)\|#i';
	$vars = preg_split($motif , $chaine, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
	
	for($i=0; isset($vars[$i]); ++$i) {
		$result[$vars[$i++]] = unserialize($vars[$i]);
	}

	return $result;
} 

function encode_session($tableauSession) {
	$chaineSession = '';

	foreach ($tableauSession as $k => $v) {
		$chaineSession .= $k . '|' . serialize($v);
	}

	return $chaineSession;
}
Essaye et dis-nous quoi. (Tiens, ça me rappelle un film ça!)
ripat

Mammouth du PHP | 1668 Messages

17 févr. 2009, 17:20

Merci de votre aide,

Il y a un truc de bizarre :

[quoteArray ( [nom] => katagoto [id] => 30 [tab] => Array ( [truc] => much [num] => 26 [0] => 5 [1] => katagoto [tab] => Array ( [0] => ripat [1] => HyWaN [2] => 40 [3] => 45 ) ) )

------------

------------

Array ( [0] => nom [1] => s:8:"katagoto"; [2] => id [3] => i: [4] => 30;tab [5] => a:5:{s:4:"truc";s:4:"much";s:3:"num";i:26;i:0;i:5;i:1;s:8:"katagoto";s:3:"tab";a:4:{i:0;s:5:"ripat";i:1;s:5:"HyWaN";i:2;i:40;i:3;i:45;}} )
Notice: unserialize() [function.unserialize]: Error at offset 0 of 2 bytes in C:\wamp\www\test\session.php on line 10
Array ( [nom] => katagoto [id] => [30;tab] => Array ( [truc] => much [num] => 26 [0] => 5 [1] => katagoto [tab] => Array ( [0] => ripat [1] => HyWaN [2] => 40 [3] => 45 ) ) )
[/quote]

Alors que :
<?php
function decode_session($chaine)
{
    $motif = '#([a-z0-9_][a-z0-9_;]+)\|#i';
    $vars = preg_split($motif, $chaine, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
	print_r($vars);
    for($i=0; isset($vars[$i]); ++$i)
	{
        $result[$vars[$i++]] = unserialize($vars[$i]);
    }
    return $result;
} 

function encode_session($tableauSession)
{
    $chaineSession = '';
    foreach ($tableauSession as $k => $v)
	{
        $chaineSession .= $k . '|' . serialize($v);
    }
    return $chaineSession;
}
print_r(array('nom' => 'katagoto', 'id' => 30, 'tab' => array('truc' => 'much', 'num' => 26, 5, 'katagoto', 'tab' => array('ripat', 'HyWaN', 40, 45))));
echo '<p> ------------</p><p>';
$chaine = 'nom|s:8:"katagoto";id|i:30;tab|a:5:{s:4:"truc";s:4:"much";s:3:"num";i:26;i:0;i:5;i:1;s:8:"katagoto";s:3:"tab";a:4:{i:0;s:5:"ripat";i:1;s:5:"HyWaN";i:2;i:40;i:3;i:45;}}';
//echo $chaine;
echo '</p><p> ------------</p><p>';
print_r(decode_session($chaine));
C'est louche

Mais si j'ai compris, on a :

Code : Tout sélectionner

index|type:longueur:valeur;
Un preg_match_all ne serait-il pas plus adapté ?

Par avance merci de votre aide
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol

ViPHP
ViPHP | 1380 Messages

17 févr. 2009, 20:04

Erreur dans mon motif. Essaye:
$motif = '#([a-z0-9_][a-z0-9_^|]+)\|#i';
Ou, de manière plus générique pour couvrir tous les caractères autorisés dans les noms de variable PHP y compris les octets de 127 à 255
$motif = '#([a-z0-9_\x7F-\xFF][a-z0-9_\x7F-\xFF^|]+)\|#i';
Un preg_match_all ne serait-il pas plus adapté ?
Oui, si tu n'as que quelques variables à modifier et que leur nom ne change pas, tu peux directement modifier la chaîne de session avec un preg_replace() adapté.
ripat

Mammouth du PHP | 1668 Messages

17 févr. 2009, 20:36

Merci, ça marche au poil, en revanche, pour des raisons de clarté, je préfère utilisé ce procédé, maintenant, dernier problème que je doit creusé moi même : la modification des session quand on est sous memcache

Merci beaucoup de votre aide
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol