Diskuze: PHP session
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 13 zpráv z 13.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
P.S.: I když jsem změnil hodnotu na 0, tak se mi to asi po 5 minutách změnilo (PHPSESSID) a tím došlo k odhlášení.
Ahoj, na trvalejší uchování dat, které netvoří bezpečnostní riziko při odcizení (ID, náhodné řetězce a další identifikační prostředky), je lepší využít COOKIES. U nich si můžeš nastavit dobu platnosti celkem jednoduše a pokud si uživatel COOKIES nepromaže, tuto dobu tebou vytvořená COOKIE vydrží.
Vždy si však dávej pozor na to, co do COOKIES ukládáš. Počítej s tím, že se ukládají do počítače uživatele a je k nim poměrně dobrý přístup pro malware nebo další osoby mající přístup na jeho profil.
Existuje funkce session_regenerate_id, pouziti viz manual php.net.
Session se obvykle samo o sobe neztrati. Muze to byt nejaky problem s
prohlizecem nebo na serveru.
V nejhorsim bych data zkusil ukladat do databaze. V mene horsim cookies, jak
pise Michal Šmahel.
Čekám na odpověď z hostingu, ale spíše to vypadá, že jim GC jede podle cronu, resp. že GC promazává session, které nemá. Protože, když jsem hodil session do jiné složky, do které nemá přístup GC, tak je to v pořádku. Že se změní session_id mi je vcelku jedno, protože si samozřejmě ukládám data do session, ne session_id.
Session regenerate mi v tomto případně asi nepomůže, protože, když hodnoty v session nevydrží ani 3 hodiny, tak je problém někde jinde.
Druhý problém, který jsem řešil byl v tom, že slavný Foxydesk chat má v sobě mazání session (session_destroy) a startování session se @. Když jsem chtěl hodit session do jiné složky, tak mi to tam přegenerovávalo session dvakrát a prohlížeč resp. server nevěděl co s tím.
Takže, když to shrnu, tak problém vidím v tuto chvíli u hostingu a ve Foxydesku. Dám vědět, zda to bylo opravdu GC.
Session ma tusim expire time kolem 17 nebo 30 min. Jestli si to treba nepletes cookies, kde se da nastavit i nekolik dni. V tom pripade bych sel do databaze a propojil to na id zakaznika.
Ano, muzou mit nastavene promazavani session cronem. Je to sice nezvykle, smazat uplne vse, nehlede na cas, ale dava to smysl.
Mno, nastavil jsem session path na každou doménu a subdoménu zvlášť,
tedy by již do toho neměl GC hrabat. Vyhodil jsem Foxydesk, který v tom
dělal mrdník.
Situace je takové, že jeden web drží dobře, druhý prostě informovaci v
session neudrží (session ID jako takové mi je vcelku jedno, jestli se mění
co 5 minunt nebo co hodinu).
Už s tím začínám být zoufalý.
Předpokládám, že rozdíl mezi ukládání do vlastní složky nebo do DB není rozdíl, přemýšlím správně?
Obávám se, že to budu muset překopat a namísto session použít na tu jednu jedinou identifikaci cookies.
Kde ještě hledat?
Pouzit db.
Do cookies muzes ulozit hash, ktery ziska od prihlasovaciho systemu. Ten hash mu
ulozis do db s casem posledniho kliknuti. Proste, cely ten system kolem
prihlaseni predelat ze session na db.
session_regenerate_id - mozna to pomuze, mozna ne. Jestli ti session mazou uplne, tak to asi nepomuze. Na jednom serveru jsem to musel pouzivat.
Mozna si session prepisujes. Muzes zkusit na prvni radek dat ob_start. Ale
musi to byt uplne prvni radek stranky, pred prvnim echo. Podobne musi byt
session_start.
Pokud tam vypises error nebo jen zalomeni radku, muze byt server nastaven tak,
ze odesila aktualni ukoncenou cast php kodu uzivateli. Vytvori tedy header.
Nemas tam session_start, tak ti session odhlasi.
Na serveru je mozne nastavit jine chovani. Proto ti to mozna jinde funguje.
Je to pak problem spatne napsaneho kodu.
- - -
Hele, takhle, tezko rici, v cem je problem. Problem mas u sebe. Vyrob jednoduchy
priklad, 1-2-3 ministranky, ktere resi jen to prihlaseni. Aby jsme to mohly
testovat. Mozna od zacatku mas chybny kod. Nevidime, kde mas chybu, nemuzeme
poradit, co s tim. Tak, co ocekavas?
Tady je kód, který mi neudrží hodnoty v session:
index.php
<?php
session_start();
echo "Start: ".date('Y-m-d H:i:s')."<br>";
echo 'Session:<br>';
echo $_SESSION['jmeno']; echo '<br>';
echo $_SESSION['redirect_logout']; echo '<br>';
echo $_SESSION['level']; echo '<br>';
echo session_id();
login.php
<?php
session_start();
$_SESSION['jmeno'] = 'Josef Novak';
$_SESSION['redirect_logout'] = 'URL';
$_SESSION['level'] = '42';
echo '<meta http-equiv="refresh" content="0;url=index.php">';
Já se nebráním tomu, že je chyba na mé straně, nicméně když nefunguje spolehlivě ani tento jednoduchý kód, tak to spíše vidím na chybu na straně serveru.
At uz tam dam header nebo location, tak mi to na localhost funguje.
-- index.php --
<?php
session_start();
echo "index";
include "print.php";
?>
-- login.php --
<?php
session_start();
$_SESSION['jmeno'] = 'Josef Novak';
$_SESSION['redirect_logout'] = 'URL';
$_SESSION['level'] = '42';
echo "login";
//include "print.php";
//echo '<meta http-equiv="refresh" content="0;url=index.php">';
header('Location: index.php')
?>
-- logout.php --
<?php
session_start();
session_unset();
//@unset($_SESSION);
echo "logout";
include "print.php";
?>
-- page.php --
<?php
session_start();
echo "page";
include "print.php";
?>
-- print.php --
<ul>
<li><a href="index.php">index</a></li>
<li><a href="page.php">page</a></li>
<li><a href="login.php">login</a></li>
<li><a href="logout.php">logout</a></li>
</ul>
<?php
echo "<pre>";
//echo "File: " . __FILE__ . "<br>";
echo "Time: " . date('Y-m-d H:i:s') . "<br>";
echo "Session:";
var_dump($_SESSION) . "<br>";
echo "Session id:" . session_id();
?>
Ale jako podezrele je to presmerovani pres meta tag.
Jeste by to mohlo souviset propojovanim obsahu http a https do jedne stranky, ze
to server blokuje treba.
Muzes zkusit tohle:
-- login.php ---
<?php
session_start();
$_SESSION['jmeno'] = 'Josef Novak';
$_SESSION['redirect_logout'] = 'URL';
$_SESSION['level'] = '42';
echo "login";
//include "print.php";
//echo '<meta http-equiv="refresh" content="0;url=index.php">';
header('Location: index.php?sid='.session_id());
?>
-- index.php --
<?php
session_start();
if (isset($_GET['sid']))
{
session_id($_GET['sid']);
}
echo "index";
include "print.php";
?>
Nemyslim si, ze to bude nejaky rozdil. Na localhostu mam pokazde stejne
sid.
4658ltuots107ogeaj8n7r86j3
Ta session funguje, nastaví se hodnoty. Jen po nějaké době hodnoty vypadnout, ikdyž by vypadnout neměli. Nastavil jsem tam ještě session_save_path a drží to.
Tedy to spíše vypadá, že problém budu mít někde v kódu, ale nevím kde. Spíš bych se tedy přikláněl k tomu, že to odešle někde něco a pošle to novou session. nicméně všude kde to mám, tak session start se spouští na začátku scriptu a chyby neeviduji.
Může to mít spojitost s ob_start, které používáme pro zvýraznění textu?
Tak ještě jeden poznatek.
Večer jsem si uložil do session hodnoty. Napsal si název session. Dnes ráno jsem se ještě před aktualizací stránky podíval zda soubor existuje a bohužel již ne. Tedy ke smazání došlo během noci.
Jak je možné, že se session smazala ze složky, do které by např. GC neměl mít přístup. Složku jsem definoval pomocí session_save_path.
Tak to nakonec dopadlo tak, že hosting nastavil gc na delší dobu a vypadá, že to jede.
Zobrazeno 13 zpráv z 13.