Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SESSION] Genialny pomysł na obronę sesji
Forum PHP.pl > Forum > PHP
Black-Berry
Wpadł mi do głowy pewnien pomysł ale chciałbym go zweryfikowac bo moje 'genialne' pomysły często bywają mylne smile.gif

Co gdybyśmy przy każdej sesji wysyłali do ciasteczka aktualny numer wywołania sesji a następnie sprawdzali czy każde wywołanie następuje kolejno po sobie. Wtedy nawet jeśli ktoś ukradnie ciastko sesyjne to nie trafi nigdy z numerkiem (prawie nigdy).
wookieb
Zeby ukraść komuś id sesji to trzeba ukrasc ciasteczko. Wiec ukradnie całe ciasteczko a nie tylko jego część. Wiec pomysł bezsensowny.
Black-Berry
ale będą 2 osobne ciastka. Jesli ktos ukradnie np id=2234234 oraz run=12 a w miedzy czasie prawdziwy użytkownik wykona ze 2 akcje to run zmieni się na 14. Wywołanie sesji o id=2234234 z run=12 bedzie oznaczało ze klucza używa złodziej poniwaz mozliwe są tylko wykonania run=run+1;
wookieb
Identyczny efekt uzyskujesz odnawiając id sesji na każdej stronie.
2 osobne ciastka?
Ciasto jest jedno tylko mogą być w nim różne wartości. Kradnąc ciastko, kradniesz wszystkie wartości.
Black-Berry
mówisz o session_regenerate_id i standardowym ustawieniu PHP? Sprawdzałeś kiedyś czy to działa? Przed cwilą wstawiłem: http://pl2.php.net/session_regenerate_id" title="Zobacz w manualu PHP" target="_manual na początek skryptu. Ciasteczko sesyjne się nie zmienia. Chyba jednak coś nei dziął tak jak powinno.
dr_bonzo
A co jak user straci ciacho z nr sekwencji, lub loguje sie po raz pierwszy? (== ukradniecie tylko ciacha sesyjnego)
Black-Berry
Jeśli straci to sesja wygasa. Jeśli włacza przeglądarkę (loguje się) po raz pierwszy dostaje numer sekwencji = 0;
wookieb
Cytat(Black-Berry @ 17.09.2008, 12:25:40 ) *
mówisz o session_regenerate_id i standardowym ustawieniu PHP? Sprawdzałeś kiedyś czy to działa? Przed cwilą wstawiłem: http://pl2.php.net/session_regenerate_id" title="Zobacz w manualu PHP" target="_manual na początek skryptu. Ciasteczko sesyjne się nie zmienia. Chyba jednak coś nei dziął tak jak powinno.


No ba. Działa jak ta lala.
Black-Berry
U mnie nie działa. Mam serwer na nazwa.pl. Po wstawieniu tej komendy na samym początku skryptu nic się nie zmienia po ponownych odświeżeniach. Zresztą nic to nie da bo i tak mam sesje na bazie.

Edit: Jednak dziła, coś musiałem spiepszyć. Regeneracja Id to faktycznie lepszy pomysł. Nie wiedziałe że można tak to robić stąd te moje głupie pomysły. Wielkie dzięki za pomoc. Temat chyab do zamknięcia.

smile.gif Edit2 : Jeśli masz sesję na bazie i chcesz regenerować ID sesji to musisz wykonać conajmniej jedno dodatkowe zapytanie żeby usunąć stary wpis. Wtedy mój sposób ma zastosowanie praktyczne. No chyba że ktoś wie jak wykonać regenerate_id na bazie danych tak aby zapis nowego wiersza odbył się w tym samym zapytaniu co kasowanie poprzedniego? smile.gif Sugestie mile widziane.
mike
Cytat(Black-Berry @ 17.09.2008, 12:48:00 ) *
smile.gif Edit2 : Jeśli masz sesję na bazie i chcesz regenerować ID sesji to musisz wykonać conajmniej jedno dodatkowe zapytanie żeby usunąć stary wpis. Wtedy mój sposób ma zastosowanie praktyczne. No chyba że ktoś wie jak wykonać regenerate_id na bazie danych tak aby zapis nowego wiersza odbył się w tym samym zapytaniu co kasowanie poprzedniego? smile.gif Sugestie mile widziane.
Skasowanie starego i dodanie nowego to to samo co uaktualnienie starego, nie?
UPDATE jest odpowiedzią tongue.gif
Black-Berry
fakt:) Idiota ze mnie haha.gif.

Rzecz jednak w tym, że jesli bede updatował w taki sposób to znowu wykonam dodatkowe zapytanie na insert:

  1. <?php
  2. private function _save($aSessionId)
  3.        {
  4.            $this->dbDriver->query(
  5.                "INSERT INTO $this->dbTable SET
  6.                    `id` = '".mysql_valid_string($aSessionId,32)."',
  7.                    `data` = '".serialize($this->data)."',
  8.                    `last_update` = NOW()
  9.                ON DUPLICATE KEY UPDATE
  10.                    `data` = '".serialize($this->data)."',
  11.                    `last_update` = NOW()"
  12.            );
  13.        }
  14. ?>
wookieb
Tak smile.gif Tylko ze najpierw rekord zostanie usuniety a potem dodany smile.gif Wiec jak tutaj dasz update? smile.gif
Black-Berry
No właśnie nie da się tego zrobić. Tak czy inaczej będzie dodatkowe zapytanie zdaniem. Dlatego gdybym wysyłał sessionrun w ciastku byłoby wydajniej.
wookieb
Cytat(Black-Berry @ 17.09.2008, 13:03:46 ) *
No właśnie nie da się tego zrobić. Tak czy inaczej będzie dodatkowe zapytanie zdaniem. Dlatego gdybym wysyłał sessionrun w ciastku byłoby wydajniej.

Nie za bardzo widze jak ono zwiekszy ci wydajność.
Pamiętaj, że nie musisz też używac session_regenerate_id();

napiszesz własną funkcję która sama wygeneruje nowy id. Wysle ciacho. i wtedy sobie zrobisz bez problemu update smile.gif
Black-Berry
Tak ale jesli wysle ciacho a potem wykonam funkcje którą przedstawiłem wyżej to w bazie danych będa się gromadzić wpisy ze starymi ID. Przy 1.000 osobach na stronie jak kazdy kliknie na cos 20 razy to juz masz 20.000 wpisów w baze które usuną się dopiero po 15 min.
mike
Cytat(Black-Berry @ 17.09.2008, 13:14:13 ) *
Przy 1.000 osobach na stronie jak kazdy kliknie na cos 20 razy to juz masz 20.000 wpisów w baze które usuną się dopiero po 15 min.
Przecież dla bazy to jest śmieszna ilość. Czym się martwisz?
wookieb
moze mały algorytm?

1) Zapisujesz aktualny klucz sesyjny
2) generujesz nowy klucz sesyjny
3) wysylasz nowy klucz do ciasteczka
4) updatujesz rekord w bazie w sensie zamieniasz w rekordzie tylko klucz.
Black-Berry
tak ale musisz sprawdzic czy rekord istnieje bo jesli nie to musisz insertowc a nie updatowac. Czyli masz dodatkowe zapytanie.
wookieb
A znasz zapytanie replace? smile.gif Najlepsze do tego zadania.
Black-Berry
Nie smile.gif Zapodaj proszę.
mike
Cytat(Black-Berry @ 17.09.2008, 16:59:05 ) *
Nie smile.gif Zapodaj proszę.
Znasz słowo kluczowe i dupska nie ruszysz do dokumentacji? Nie żartuj sobie nawet leniu jeden!
Black-Berry
@mike Nie zasmiecaj wątków i wyluzuj bo nerwowy jestes. Chodziło mi o rozwinięcie myśli bo komenda REPLACE nic mi nie da.

Cytat
REPLACE works exactly like INSERT, except that if an old row in the table has the same value as a new row for a PRIMARY KEY or a UNIQUE index, the old row is deleted before the new row is inserted


Przeciez jesli zapisuję coś do bazy z nowym kluczem to stary nie zostanie usunięty.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.