[Session] Modifier une session étrangère

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [Session] Modifier une session étrangère

par katagoto » 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

par Ripat » 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é.

par katagoto » 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

par Ripat » 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!)

par @rthur » 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 :)

par katagoto » 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

par Ripat » 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

par katagoto » 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...

par agité » 17 févr. 2009, 11:10

Il faut deux conditions pour qu'une session existe: un cookie sur le client (contenant l'id de la session) et un fichier de session sur le serveur. Pour détruire une session il faut détruire le fichier de session côté serveur avec un session_destroy() ensuite forcer une suppression du cookie client avec setcookie() avec un cookie vide. Si tu ne supprimes pas les deux elle persistera. Je le sens pas trop ton truc avec les sessions.

Pourquoi ne gères-tu pas tout ça dans une table. Si ton serveur MySQL est lent, utilise sqlite qui est très véloce pour ce genre de choses. Aussi rapide que d'ouvrir un fichier de session.
C'est ce que j'ai utiliser pour un extranet en fait je gère les sessions aussi sur la base de donnée histoire d'avoir une visibilité supplémentaire.

A l'ouverture de session tu stock des informations en base et tu met à jour selon ce que tu as besoin et le rang utilisateur, plutôt que de rentrer dans des manipulation au niveau des cookie qui semblent fastidieuses et peu fiables.

par katagoto » 17 févr. 2009, 11:09

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.
Mmmh, je vais continuer de creuser du côté des session, mais, vu que je suis avec PostGreSQL depuis le début de mon projet et qu'il commence à dater, 9 mois, je ne pense que je vais lâcher PostGreSQL de si tôt, deplus, j'ai déjà plus de 40 fonctions en PL/pgsql, ce qui me permet d'économiser la communication entre PostGreSQL et PHP, ce qui est le plus couteux, et c'est ce en quoi PostGreSQL est plus rapide...
bien que je fasse très bien les choses
Prétentieux va!!! :lol:
Un peu, mais au vu de mon travail...
Bref, vous verrez dans quelques mois 8-)

par Ripat » 17 févr. 2009, 08:29

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

par @rthur » 17 févr. 2009, 01:08

Oui et non, oui, j'ai pensé à SQLite, mais il aura trop de charge, j'utilise PostGreSQL et, bien que je fasse très bien les choses, je pourrait arrivé très vite à pas loin de 2.000 requêtes native par secondes pour 400 membres, donc, le but est de l'alléger...
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.

bien que je fasse très bien les choses
Prétentieux va!!! :lol:

par Ripat » 16 févr. 2009, 23:06

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.

par katagoto » 16 févr. 2009, 20:31

Oui et non, oui, j'ai pensé à SQLite, mais il aura trop de charge, j'utilise PostGreSQL et, bien que je fasse très bien les choses, je pourrait arrivé très vite à pas loin de 2.000 requêtes native par secondes pour 400 membres, donc, le but est de l'alléger...
J'ai pensé à faire une requête toutes les X secondes, X étant déterminé en fonction de la charge du serveur, mais ça reviendrait à faire attendre les membres et surchargé PostGreSQL qui n'a pas besoin de ça...
Nous avons installé les sessions dans la RAM, via memcache, je doute donc de la plus grande rapidité de SQLite...
J'aimerais savoir si j'appelai une session (par session_id()) inexistante, que ce passerait-il ?

Par avance merci de votre aide

par Ripat » 16 févr. 2009, 19:31

Il faut deux conditions pour qu'une session existe: un cookie sur le client (contenant l'id de la session) et un fichier de session sur le serveur. Pour détruire une session il faut détruire le fichier de session côté serveur avec un session_destroy() ensuite forcer une suppression du cookie client avec setcookie() avec un cookie vide. Si tu ne supprimes pas les deux elle persistera. Je le sens pas trop ton truc avec les sessions.

Pourquoi ne gères-tu pas tout ça dans une table. Si ton serveur MySQL est lent, utilise sqlite qui est très véloce pour ce genre de choses. Aussi rapide que d'ouvrir un fichier de session.