Portál AbcLinuxu, 12. května 2025 05:10

Dotaz: chyba při předávání session

Smelik Martin avatar 24.7.2011 19:21 Smelik Martin | skóre: 5
chyba při předávání session
Přečteno: 689×
Odpovědět | Admin
Mám takovýto problém.
Mám skript v PHP který začíná takto
session_start();
if(!isset($_SESSION["login"]["ID"]) && !isset($_SESSION["login"]["authority"]))
{
    header('Location: index.php');
}
při zpracování formuláře přesměruju stránku na skript neco.script.php kde se provede zpracovani dat a zpet se presmeruje na puvodni skript. Problém je v tom že nevím z jakého důvodu se jakýmsi způsobem vymaže hodnota nastavená v $_SESSION["login"]["authority"] a skript mě automaticky odhlasi ze systemu z bezpecnostnich duvodu.

Zacatek neco.script.php je klasika session_start();

Nemá s tím někdo zkušenosti? Nemůžu nějak najít důvod proč se mi vymaže hodnota z session.

Řešení dotazu:


Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

24.7.2011 20:44 Miloš
Rozbalit Rozbalit vše Re: chyba při předávání session
Odpovědět | | Sbalit | Link | Blokovat | Admin
Řekl bych, že otázka je poněkud obecná nebo spíše hodně široká.

Mizí hodnota pouze ze $_SESSION["login"]["authority"] a v $_SESSION["login"]["ID"] zůstává? Nebo se zruší všechny hodnoty v $_SESSION? Co vlastně se $_SESSION["login"]["authority"] skript neco.script.php provádí? Nemažete si ji někde sám?
Smelik Martin avatar 24.7.2011 20:56 Smelik Martin | skóre: 5
Rozbalit Rozbalit vše Re: chyba při předávání session
hodnota mizí pouze s authority a je v ni uloženo oprvněnní které uživatel má v systému.

neco.script.php vypadá třeba takto ¨
session_start();
if(!isset($_SESSION["login"]["ID"]) && !isset($_SESSION["login"]["authority"]))
{
    header('Location: ../index.php');
}

include "../include/config.inc.php";
include "../class/mysql.class.php";
include "../include/function.inc.php";

//Inicializace db spojení
$db = MySQL::instance();
$db->connect(HOST,DB,USER,PASS);

if(isset($_POST["empl"]))
{
	if($_POST["mesic"]!="" || $_POST["rok"]!="")
	{
		header('Location: ../view.php?page=mes-vyp-hod&mesic='.$_POST["mesic"].'&rok='.$_POST["rok"].'&empl='.$_POST["empl"].'');
		exit;
	}
	else
	{
		header('Location: ../view.php?page=mes-vyp-hod&empl='.$_POST["empl"].'');
		exit;
	}	
}
header('Location: ../view.php?page=mes-vyp-hod');
24.7.2011 21:11 Miloš
Rozbalit Rozbalit vše Re: chyba při předávání session
Tak na první pohled ve skriptu nic špatného nevidím (až na chybějící exit v první podmínce, ale tam by se skript stejně neměl dostat).

A má $_SESSION["login"]["authority"] na konci tohoto skriptu stále stejnou hodnotu (čili neměníte ji například ve vkládaných skriptech)?
Smelik Martin avatar 24.7.2011 21:16 Smelik Martin | skóre: 5
Rozbalit Rozbalit vše Re: chyba při předávání session
neměním. session authority se nastaví při přihlášení a celým procesem uživatelova pohybu na stránkách je nedotčená. jen na jejím základě ověřuji oprávnění do daných sekcí.
24.7.2011 21:03 Kit
Rozbalit Rozbalit vše Re: chyba při předávání session
Mně to normálně funguje. Při prvním zavolání zahlásí chybu, při druhém a dalším OK.
session_start();
if(!isset($_SESSION["login"]["ID"]) && !isset($_SESSION["login"]["authority"])) {
  echo("Chyba");
} else {
  echo("OK");
}
$_SESSION=Array("login");
$_SESSION["login"]["ID"]="jmeno";
$_SESSION["login"]["authority"]="auth";
Změnil bych operátor && na ||, pokud musí být splněno obojí. Nebo stačí, když je splněna jen jedna z podmínek?

BTW: Lidi, dávejte ty výpisy programů do značek <pre>. Kdo to má luštit?
Smelik Martin avatar 24.7.2011 21:12 Smelik Martin | skóre: 5
Rozbalit Rozbalit vše Re: chyba při předávání session
Problém je v tom že při prvním přihlášeni od zavření okna prohlížeče to vždycky odhlásí a pak už to bývá v pohodě. Je to docela divné chování.Jinak výpis byl ve značce pre... a ja to vidim normalně
Smelik Martin avatar 24.7.2011 21:15 Smelik Martin | skóre: 5
Rozbalit Rozbalit vše Re: chyba při předávání session
A problém není v tom že ve skriptu neco.script.php by nebyly hodnoty session uložené ale v tom že při zpětném přesměrování na skript odkud jsem posílal data se ta hodnota vymaže...

tzn... mam pokus.php kde zpracuju formulář a v hodnotě session mám uložené id a id oprávnění. Pošlu formulař ke zpracovani na skript neco.script.php kde se formulář zpracuje jak má a stále mám v session uložené id a id oprávnění. Po zpracovani formuláře se přesměruji zpět na původní skript pokus.php kde už ovšem není nastavené session authority a tudíž mě skript automaticky odhlásí z bezp. důvoduů.... nechapu kde se ta session vymaže. když jsem to trasoval s http watcherem vždy došlo k odhlášení až na skriptu pokus.php

24.7.2011 21:26 Miloš
Rozbalit Rozbalit vše Re: chyba při předávání session
Pak mě osobně napadá asi už jen jedno jediné - máte PHPSESSID ve všech skriptech stejné? Nehrajete si někde k Cookies?
24.7.2011 21:28 Kit
Rozbalit Rozbalit vše Re: chyba při předávání session
Jenže tu podmínku máš špatně, patří tam operátor ||. Tak jak to máš, stačí pro pokračování programu splnění alespoň jedné z nich. To znamená, že nemáš ani ID.

Zkus se podívat, jestli _SESSION nastavuješ správně v hlavním skriptu. Ve funkci to fungovat nebude.
24.7.2011 21:31 Miloš
Rozbalit Rozbalit vše Re: chyba při předávání session
Ale je také pravda, že pokud máte v neco.script.php nastavenou podmínku
if(!isset($_SESSION["login"]["ID"]) && !isset($_SESSION["login"]["authority"])) { header('Location: index.php'); }
tak skript proběhne i když není $_SESSION["login"]["authority"] definována (stačí, že je definována $_SESSION["login"]["ID"] a tudíž podmínka není splněna). A pokud ve skriptu pokus.php máte tuto podmínku jinak nastavenou, je to problém..
Smelik Martin avatar 24.7.2011 21:34 Smelik Martin | skóre: 5
Rozbalit Rozbalit vše Re: chyba při předávání session
pokud vím tak && je logický součin. Tedy znamená že musí být obě hodnoty pravdivé aby se podmínka vyplnila. A když napíšu !isset()tak to znamená že není nastavena ... poté tedy nechápu váš komentář.
24.7.2011 21:43 Miloš
Rozbalit Rozbalit vše Re: chyba při předávání session
Ano, ale Vy testujete NEnastavení těch dvou podmínek. Čili, aby podmínka byla pravdivá, nesmí být ani $_SESSION["login"]["ID"] ani $_SESSION["login"]["authority"] nastaveno. Ale jakmile jedna z nich je, podmínka již neplatí, což ve Vašem případě znamená, že skript běží dál i za podmínky, že třeba

$_SESSION["login"]["ID"] = 25

a $_SESSION["login"]["authority"] není vůbec definováno.

Protože isset($_SESSION["login"]["ID"]) == true, tak už celá Vaše podmínka je nepravdivá...
Smelik Martin avatar 24.7.2011 21:47 Smelik Martin | skóre: 5
Rozbalit Rozbalit vše Re: chyba při předávání session
Takže správným řešením je

if(!isset($_SESSION["login"]["ID"]) || !isset($_SESSION[login]["authority"]))

24.7.2011 21:56 Miloš
Rozbalit Rozbalit vše Re: chyba při předávání session
Ano, pokud chcete, aby obě hodnoty byly hned od začátku definované.

A máte tedy $_SESSION["login"]["authority"] hned v úvodním skriptu (pokus.php) a i dále (neco.script.php) definovanou? Co například
var_dump($_SESSION["login"]["authority"])
nebo rovnou
var_dump($_SESSION)
?
24.7.2011 21:48 Kit
Rozbalit Rozbalit vše Re: chyba při předávání session
To znamená, že chyba se zahlásí pouze v případě, že není nastavena proměnná ID a zároveň není nastavena proměnná authority.

Pokud alespoň jedna z proměnných existuje, skript pokračuje dál bez odhlášení. Je to tak správně?
Smelik Martin avatar 24.7.2011 21:50 Smelik Martin | skóre: 5
Rozbalit Rozbalit vše Re: chyba při předávání session
Má to být tak že v případě kdy neexistuje alespoň jedna z proměných tak se provede podmínka. tzn původní řešení by mělo být správně...
24.7.2011 21:57 Kit
Rozbalit Rozbalit vše Re: chyba při předávání session
"alespoň jedna" znamená logický součet, tedy ||.

Jestliže neexistuje jedna_proměnná NEBO neexistuje druhá_proměnná, proveď přihlášení.

Tady snad nefungují De Morganovy zákony?
Smelik Martin avatar 24.7.2011 22:04 Smelik Martin | skóre: 5
Rozbalit Rozbalit vše Re: chyba při předávání session
Ano podmínka byla špatně nícméně to pořád neřeší proč když v pokus.php session jsou obě nastavené správně a potvrdil jsem si to výpisem session pomocí print_r($_SESSION). proč při odeslání formuláře který se zpracovaava v neco.script.php už hodnoty session nastavené nejsou....
24.7.2011 22:11 Miloš
Rozbalit Rozbalit vše Re: chyba při předávání session
Čili jsou celé $_SESSION prázdné nebo jenom $_SESSION["login"]["authority"]?
Smelik Martin avatar 24.7.2011 22:13 Smelik Martin | skóre: 5
Rozbalit Rozbalit vše Re: chyba při předávání session
momentálně mi to vypisuje array() tzn. jsou obě prázdné..
24.7.2011 22:16 Miloš
Rozbalit Rozbalit vše Re: chyba při předávání session
To vypadá na nějakou chybu v posloupnosti úkonů... Přidejte sem ještě kód z pokus.php, prosím.
Smelik Martin avatar 24.7.2011 22:19 Smelik Martin | skóre: 5
Rozbalit Rozbalit vše Re: chyba při předávání session
CheckAuthorityToSection($_SESSION["login"]["authority"],$page);


if($page == "sestaveni" && $authen == true)
{	
	
	//Nejprve je třeba vybrat zaměstnance
	$form = new FormularBuilder();
	$form->FormStart($root."scripts/empl_prirazeni_set.script.php", "post","","vyber_zamestnance");
	$form->FormSelectOptionIdInValue("Zaměstnanec", "add_empl", $zam, $zamID,1,$zE);
	$form->FormHiddenItem($_GET["mesic"],"mesic");
	$form->FormHiddenItem($_GET["rok"],"rok");
	$form->FormSubmitButton("Vybrat");
	$form->FormEnd();
	
		
}
else if($page == "sestaveni" && $authen == false)
{
	echo "
"; echo "Nemáte přístup do této sekce"; echo "
"; } include "include/footer.php"; ?>
Smelik Martin avatar 24.7.2011 22:21 Smelik Martin | skóre: 5
Rozbalit Rozbalit vše Re: chyba při předávání session
session_start();
if(!isset($_SESSION["login"]["ID"]) || !isset($_SESSION["login"]["authority"]))
{
    header('Location: index.php');
}

include "include/header.php";
include "include/sidebar.php";

//Inicializace oprávnění
$access = new AuthorityManager();
$authen = $access->CheckAuthorityToSection($_SESSION["login"]["authority"],$page);


if($page == "sestaveni" && $authen == true)
{	
	
	//Nejprve je třeba vybrat zaměstnance
	$form = new FormularBuilder();
	$form->FormStart($root."scripts/empl_prirazeni_set.script.php", "post","","vyber_zamestnance");
	$form->FormSelectOptionIdInValue("Zaměstnanec", "add_empl", $zam, $zamID,1,$zE);
	$form->FormHiddenItem($_GET["mesic"],"mesic");
	$form->FormHiddenItem($_GET["rok"],"rok");
	$form->FormSubmitButton("Vybrat");
	$form->FormEnd();
	
		
}
else if($page == "sestaveni" && $authen == false)
{
	echo "
"; echo "Nemáte přístup do této sekce"; echo "
"; } include "include/footer.php";
24.7.2011 22:17 Kit
Rozbalit Rozbalit vše Re: chyba při předávání session
Protože $_SESSION definuješ uvnitř funkce.
Smelik Martin avatar 24.7.2011 22:27 Smelik Martin | skóre: 5
Rozbalit Rozbalit vše Re: chyba při předávání session
I kdyby tak to neřeší ten problém že ve skriptu pokus.php session je nastavené a při odeslání formuláře pomocí POST na skript neco.script.php se data ze session ztratí....
24.7.2011 22:33 Kit
Rozbalit Rozbalit vše Re: chyba při předávání session
Pokud je $_SESSION lokální, tak se nemůže odeslat.

Tady však začínám mít tušení, že po odeslání dat metodou POST neděláš v navavazujícím skriptu po jejich zpracování header('Location...
Smelik Martin avatar 24.7.2011 22:35 Smelik Martin | skóre: 5
Rozbalit Rozbalit vše Re: chyba při předávání session
Tento skript zpracuje například formulář...

session_start();
if(!isset($_SESSION["login"]["ID"]) || !isset($_SESSION["login"]["authority"]))
{
    header('Location: ../index.php');
    exit;
}

include "../include/config.inc.php";
include "../class/mysql.class.php";
include "../include/function.inc.php";

//Inicializace db spojení
$db = MySQL::instance();
$db->connect(HOST,DB,USER,PASS);

if(isset($_POST["empl"]))
{
	print_r($_SESSION);
	if($_POST["mesic"]!="" || $_POST["rok"]!="")
	{
		header('Location: ../view.php?page=mes-vyp-hod&mesic='.$_POST["mesic"].'&rok='.$_POST["rok"].'&empl='.$_POST["empl"].'');
		exit;
	}
	else
	{
		header('Location: ../view.php?page=mes-vyp-hod&empl='.$_POST["empl"].'');
		exit;
	}	
	
	
}
header('Location: ../view.php?page=mes-vyp-hod');

24.7.2011 22:49 Kit
Rozbalit Rozbalit vše Re: chyba při předávání session
Tak teď už mě napadá jen: Děláš header('Location... i po zpracování přihlášení (ověření autenticity a vyrobení $_SESSION)?
Smelik Martin avatar 24.7.2011 22:52 Smelik Martin | skóre: 5
Rozbalit Rozbalit vše Re: chyba při předávání session
Ano. Přihlášení a nastaveni session proběhne ve skriptu auth.script.php ze kterého se přesměruje na uvodni stranku info.php pomoci header('Location ../info.php');

25.7.2011 01:06 Miloš
Rozbalit Rozbalit vše Re: chyba při předávání session
Pořád mi není jasné, jak jsou $_SESSION["login"] vlastně tvořeny a kdy jsou tvořeny. V uvedených skriptech je nevidím. Pokud při prvním přihlašení se nedaří nic zapsat a při druhém ano, řekl bych že se data do $_SESSION["login"] zapsala ne ve skriptu pro přihlášení, ale někde jinde. Používáte vůbec při odhlašování session_destrox()? A proč Vám chybí v této větvi
if(!isset($_SESSION["login"]["ID"]) || !isset($_SESSION["login"]["authority"]))
{
    header('Location: index.php');
}
exit?

Celé to na mě působí, že session_start() v přihlašovacím skriptu voláte až poté, co jste vložil data do $_SESSION["login"].

Pokud to totiž chápu správně, tak dejme tomu na stránce enter.php uživatel vloží své přihlašovací údaje, kde je formulář odešle na auth.script.php. Po ověření správnosti se vytvoří $_SESSION["login"] a uživatel je přesměrován na info.php. Zde nějaký způsobem může vybrat pokus.php, který odesílá data na neco.script.php, kde by se pak měl vrátit zpět na pokus.php.

A teď je podstatné, co se vlastně po prvním přihlášení děje. Tvrdíte, že
Když vypnu a zapnu prohlížeč pokusím se zapsat něco a přesměruju se na neco.script.php tak session nastavené není. Tzn vrátím se zpět. Odhlásím se přihlásím se znovu a znovu se pokusím zapsat něco a přesměruje mě to na neco.script.php tak už session nastavené je správně a všechno je ok
, čili je podle mého podstatné, i jakým způsobem probíhá odhlašování ze systému.

Vložte sem tedy, prosím, ještě část skriptu auth.script.php, kde bude vidět, jakým způsobem $_SESSION["login"] vytváříte a i skript pro odhlášení, ať je vidět, jak se odhlašujete. A znovu opakuji, proč Vám chybí za header() exit?
Smelik Martin avatar 25.7.2011 10:04 Smelik Martin | skóre: 5
Rozbalit Rozbalit vše Re: chyba při předávání session
Přihlašování probíhá ve skriptu auth.script.php kde zavolam třídu auth.class.php a použiju tři metody...

public function CheckAuthorizationWithAuthority($login,$pass)
	{
		/**
		 * SQL dotaz, který ověření nejprve uživatele a poté oprávnění
		 */
		$sql = "select * from users where login='".$login."' and pass='".$pass."'";
		$vysledek = $this->db->query($sql);
		$zaznam = $this->db->fetch_object($vysledek);
		
		if($zaznam->active == "1")
		{	
			if($this->db->num_rows($vysledek) == 1)
			{
				/**
			 	* V případě kladného výsledku vrátí true
			 	*/
				
				$this->SetSession("ID", $zaznam->id);
				$this->SetSession("authority", $zaznam->authority);
				return true;			
			}
			else
			{	
				return false;
			}
		}
		else
		{
			return false;
		}	
	}
	
	/**
	 * Odhlásí uživatele a zničí session
	 */
	public function LogoutUser()
	{
		$_SESSION = array();
	 	session_destroy();
	 	return true;
	}
	
	/**
	 * Nastaví session na potřebné parametry
	 * @param $name
	 * @param $value
	 */
	private function SetSession($name,$value)
	{
		$_SESSION['login'][$name] = $value;
	}

Řešení 1× (Smelik Martin (tazatel))
Smelik Martin avatar 25.7.2011 11:49 Smelik Martin | skóre: 5
Rozbalit Rozbalit vše Re: chyba při předávání session
Vyřešeno. Po přepsání všech podmínek a dopsani exit; ke všem přesměrováním a následnému promazání cookies a znovu přihlášení už se problém neobjevil.
Smelik Martin avatar 24.7.2011 22:15 Smelik Martin | skóre: 5
Rozbalit Rozbalit vše Re: chyba při předávání session
akorát nechápu toto. Když vypnu a zapnu prohlížeč pokusím se zapsat něco a přesměruju se na neco.script.php tak session nastavené není. Tzn vrátím se zpět. Odhlásím se přihlásím se znovu a znovu se pokusím zapsat něco a přesměruje mě to na neco.script.php tak už session nastavené je správně a všechno je ok. Prostě jenom při prvním přihlášení a první akci. Vyzkoušel jsem to ted ve třech prohlížečích.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.