Black-Berry
17.09.2008, 10:35:50
Wpadł mi do głowy pewnien pomysł ale chciałbym go zweryfikowac bo moje 'genialne' pomysły często bywają mylne

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
17.09.2008, 10:59:37
Zeby ukraść komuś id sesji to trzeba ukrasc ciasteczko. Wiec ukradnie całe ciasteczko a nie tylko jego część. Wiec pomysł bezsensowny.
Black-Berry
17.09.2008, 11:03:58
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
17.09.2008, 11:17:05
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
17.09.2008, 11: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.
dr_bonzo
17.09.2008, 11:27:23
A co jak user straci ciacho z nr sekwencji, lub loguje sie po raz pierwszy? (== ukradniecie tylko ciacha sesyjnego)
Black-Berry
17.09.2008, 11:29:24
Jeśli straci to sesja wygasa. Jeśli włacza przeglądarkę (loguje się) po raz pierwszy dostaje numer sekwencji = 0;
wookieb
17.09.2008, 11:30:34
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
17.09.2008, 11:48:00
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.
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?

Sugestie mile widziane.
mike
17.09.2008, 11:50:23
Cytat(Black-Berry @ 17.09.2008, 12:48:00 )

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?

Sugestie mile widziane.
Skasowanie starego i dodanie nowego to to samo co uaktualnienie starego, nie?
UPDATE jest odpowiedzią
Black-Berry
17.09.2008, 11:54:35
fakt:) Idiota ze mnie

.
Rzecz jednak w tym, że jesli bede updatował w taki sposób to znowu wykonam dodatkowe zapytanie na insert:
<?php
private function _save($aSessionId)
{
$this->dbDriver->query(
"INSERT INTO $this->dbTable SET
`id` = '".mysql_valid_string($aSessionId,32)."',
`last_update` = NOW()
ON DUPLICATE KEY UPDATE
`last_update` = NOW()"
);
}
?>
wookieb
17.09.2008, 12:01:11
Tak

Tylko ze najpierw rekord zostanie usuniety a potem dodany

Wiec jak tutaj dasz update?
Black-Berry
17.09.2008, 12: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.
wookieb
17.09.2008, 12:09:40
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
Black-Berry
17.09.2008, 12:14:13
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
17.09.2008, 12:15:38
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
17.09.2008, 12:23:48
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
17.09.2008, 15:48:59
tak ale musisz sprawdzic czy rekord istnieje bo jesli nie to musisz insertowc a nie updatowac. Czyli masz dodatkowe zapytanie.
wookieb
17.09.2008, 15:55:38
A znasz zapytanie replace?

Najlepsze do tego zadania.
Black-Berry
17.09.2008, 15:59:05
Nie

Zapodaj proszę.
mike
17.09.2008, 16:12:57
Cytat(Black-Berry @ 17.09.2008, 16:59:05 )

Nie

Zapodaj proszę.
Znasz słowo kluczowe i dupska nie ruszysz do dokumentacji? Nie żartuj sobie nawet leniu jeden!
Black-Berry
17.09.2008, 16:28:15
@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.