Autor Zpráva
jrm
Profil
Mám stránky, na kterých řeším OnLine několik úloh, např. návrh sestavy regulátoru podle zadaného počtu I/O v technologii, registraci firemního SW a jeho odblokování, ...
Pro předávání proměnných mezi stránkami používám i sessions. Aby se úlohy mezi sebou neovlivňovali, volím pro každou jiný název session.
Na locale vidím, že jméno vzniklého session_souboru na HDD je v podstatě stejně šifrované jako předtím, když jsem jméno session nezadával. Asi to zadané jméno příkazem session_name("cosi") bylo použito k šifrování.
A to je to, na co se chci zeptat. Je to tak? Případně co všechno se bere v potaz při tvorbě nových sessions od jednoho návštěvníka. Použiji jiný prohlížeč, místo FF třeba Operu = další session_soubor, atd.?
A zadám-li neměnné jméno do příkazu session_name("cosi") tak doufám, že bude pro každého návštěvníka zvlášť vytvořen jeho vlastní session_soubor na serveru.
Dědek děkuje mladíkům za správné odpovědi...
temistokles
Profil
Session_name je len identifikácia daného náhodného reťazca, lepšie asi povedať na príklade:
- Ak používaš na prenos sessions cookie, tak sa cookie bude voľat tak, ako je nastavené v session_name
napr: session_name -> sid ..... vtedy sa bude cookie volať sid
- Ak používaš vkladanie do URL, je to obdobné...

Čo všetko ovplyvňuje výber 32 miestneho náhodného reťazca síce neviem, ale je to postavené na semináhode. V skutočnosti je mizerná rpavdepodobnosť, že odhalí niekto session len náhodnou voľbou (rádovo 1 : 16^32), session_name je teda len na pomenovanie samotnej premennej u užívateľa (v URL adrese, cookie).
krteczek
Profil
použij při přihlášení uživatele funkci session_regenerete_id(); ta zajistí že dva rozdílní uživatelé nedostanou session se stejným názvem po sobě
pmasarik
Profil
použij při přihlášení uživatele funkci session_regenerete_id(); ta zajistí že dva rozdílní uživatelé nedostanou session se stejným názvem po sobě - Tak s týmto nesúhlasím.

session_regenerete_id(); - zabezpečí že pri každom reloade sa tebe zmení session_id, nie že to id nedostane niekto iný.
Ak nepoužiješ túto funkciu tak počas jedného sedenia dokým sa napríklad neodhlásiš budú všetky sessions uložené na servery pod jedným ID. Pri použití tej funkcie sa bude ID meniť a potencionálny útočník má menšiu šancu ho odchytiť a zneužiť.

jrm - vôbec nerieš čo riešiš, dve rovnaké ID sa dvom užívatelom určite nepridelia, o to sa stará samotné PHP.
session_name je len na to aby si vedel pristupovat k spravnemu obsahu nič viac.
krteczek
Profil
pmasarik: psal jsem při přihlášení, to znamená jen jednou, je zbytečné stále generovat nové session_id viz: http://php.vrana.cz/prihlasovani-uzivatelu.php jedná se o ochranu před session fixation

jrm: funkci session_name() nepoužívej ale používej přímo $_SESSION['nazev']
pmasarik
Profil
krteczek napísal si ta zajistí že dva rozdílní uživatelé nedostanou session se stejným názvem po sobě, čo je ale zle povedané, lebo táto funkcia zabezpečí len to, že sa staré ID v tvojej relácii zmení na nové. Nijako nezabezpečí že moje ID nedostane druhý užívatel.

Citujem - session_regenerate_id — Update the current session id with a newly generated one

Mne išlo o poukázanie na zlé vysvetlenie čo urobí tá funkcia o nič iné :)
krteczek
Profil
Dalším typem útoku je Session Fixation. Jedná se o útok, kdy útočník klientovi nastaví nějakou hodnotu Session ID (podstrčením odkazu na webu, v e-mailu nebo např. přímou editací uživatelových cookies) a jakmile se uživatel přihlásí, tak tuto Session ID použije pro sebe. Obrana proti tomuto typu útoku je v PHP poměrně jednoduchá – stačí před prováděním citlivých operací jako je přihlašování zavolat funkci session_regenerate_id, která způsobí změnu Session ID, takže původní ID útočník nebude moci využít.
jrm
Profil
Dík za info, asi jsem můj problém špatně popsal - nejedná se mi o problematiku napadení.

Jde mi o to, že na stránkách mám několik samostatných úloh a pro předávání proměnných mezi stránkami jsem používal jediné sessions pro jednoho návštěvníka.
Pokud si však návštěvník stránek otevřel víc oken/panelů a v každém řešil jinou úlohu na stránkách, tak samozřejmě vítězily proměnné s posledně zpracovávané stránky, případně návštěvník prošel v jednom okně/panelu stránkou, na které byl výmaz session...

Proto pro každou samostatnou úlohu chci pojmenovat sessions jinak, aby se jedinému návštěvníkovi založily sessions pro každou úlohu zvlášť. Mé pokusy na locale naznačují, že se tak snad děje.
Chtěl jsem proto vědět, ve kterých (případně dalších) případech se pro jednoho návštěvníka vytváří další sessions.

Pro pojmenování sessions v každé samostatné úloze používám příkaz session_name("jmeno_ulohy"). Počítám s tím, že i když je JMENO_ULOHY pro všechny návštěvníky stejné, budou každému zvlášť vygenerovány jeho vlastní sessions pro každou úlohu.
Jen pro můj klid - je tomu tak?
krteczek
Profil
jo takhle:-)
takže používej superglobální pole $_SESSION
pro každou stránku můžeš mít její název jinačí: $_SESSION['tato_stranka'] ,$_SESSION['jina_stranka'] , $_SESSION['jina_session'], nebo i pole $_SESSION['user']['jmeno'], $_SESSION['user']['prijmeni'] ... takže pokud potebuješ přenášet nějaká data jen v rámci určité skupiny stránek tak si pojmenuješ session tak abys vedel že patří jen pro toto a jinde je hledat nebudeš.

nicméně pokud jde o použití session_regenerate_id() tak před nastavením session u přihlášení tuto fci zavolej (pro klid duše ;-))
temistokles
Profil
jrm: funkci session_name() nepoužívej ale používej přímo $_SESSION['nazev']
Mne sa marí, že je v tom trochu rozdiel :D Ak sa nemýlim, session_name nazve premennú session-ov, ale zápis $_SESSION['nazev'] de facto vytvorí pole v session :). Overiť to však nemôžem, lebo mi dosť blbne DNS :)
krteczek
Profil
pardon pisu blbosti...
jrm
Profil
Zjištění po mých pokusech na locale:

1)
a)
vstoupím na úvodní stránku index.php, přes kterou se mi načítají v podstatě skoro všechny ostatní stránky
(např.
http://localhost/index.php?file=./0_uvodni.php
http://localhost/index.php?file=./produkty/hw2/36_pl2obecne.php
http://localhost/index.php?file=./produkty/hw2/38_centraly.php
http://localhost/index.php?file=./produkty/hw2/41_ccpu21.php
http://localhost/index.php?file=./obchod/16_obchod.php
http://localhost/index.php?file=./download/113_katalog2007.php
ale i
http://localhost/index.php?file=./php/disp/12_index.php
pro OnLine návrh zobrazovačů XDM
)
= vytvoří se standardní sessions bez použití jejich přejmenování

b)
Stránkám pro klasické prohlížení bych ponechal původní sessions, dalším úlohám jako je OnLine návrh zobrazovačů zkouším přiřadit nový název sessions s cílem, aby se mi vytvořil další soubor sessions na HDD. Bezúspěšně, protože volání sessions je v tomto případě společné přes index.php v kořenovém adresáři.

Proto zkouším dát podmínku do index.php pro návrh XDM, a to před session_start();
if ($_SESSION['id']=="12") session_name('navrhXDM');
zda mi vznikne další soubor sessions.
Bezúspěšně - soubor zústává původní, přibudou proměnné pro návrh XDM.

Takže v tomto případě mne napadá vytvořit pole sessions pro každou úlohu (jako je návrh XDM) zvlášť, tj. přidat do každé $_SESSION['promenna'] stejné úlohy další index:
$_SESSION['uloha']['promenna]
Dál bych musel zrušit nyní použité session_destroy() a před zahájením každé úlohy smazat pouze její pole sessions.

2) nový soubor sessions se mi na HDD vytvoří pokud nejdu přes klasické
http://localhost/index.php?file=./cesty/id_JmenoSouboru.php
ale přímo a do nového okna/panelu
http://localhost/php/reg/interni.php
V tomto případě pomáhá session_name('uloha').
-------------------------------------------------------------

Tušíte někde chybu nebo máte jiný nápad?

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0