![]() |
![]() ![]() |
![]() |
![]() ![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 28 Pomógł: 0 Dołączył: 24.06.2009 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Witam. No więc wymyśliłem sobie taki bajerek:
Funkcja generująca klucz:
Funkcja sprawdzająca klucz:
Przykład użycia:
i sprawdzanie:
Czy to wystarczające zabezpieczenie przed np. wysłaniem formularza z innego serwera albo przed ingerencją użytkownika w formularz i przekazywane dane? Ten post edytował andrzejt17 14.05.2011, 20:48:40 |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 729 Pomógł: 346 Dołączył: 4.04.2009 Ostrzeżenie: (0%) ![]() ![]() |
Nie
-------------------- |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 28 Pomógł: 0 Dołączył: 24.06.2009 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Widzę, że idzie opornie. Wiem, że to sens na pewno jakiś ma. Pytanie więc, czy można to bardziej ulepszyć.
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 1 729 Pomógł: 346 Dołączył: 4.04.2009 Ostrzeżenie: (0%) ![]() ![]() |
Można np. dodając captche. Zadałeś proste pytanie to dostałeś prostą odpowiedź. To co zrobiłeś od biedy można nazwać csrf, zabezpiecza to tylko przed tym, że użytkownik nie zostanie przez inną witrynę zmuszony do wysłania formularza. Nie zablokuje bota.
-------------------- |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 28 Pomógł: 0 Dołączył: 24.06.2009 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Nie no, nie chodziło mi o bota
![]() |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 1 729 Pomógł: 346 Dołączył: 4.04.2009 Ostrzeżenie: (0%) ![]() ![]() |
I nie dawaj tego w get tylko jako pole hidden w formularzu, na pewno wizualnie będzie lepsze. Dodatkowo ma kolejną wadę mając otwarty 2 razy ten formularz tylko drugi będzie można wysłać, pierwszy będzie miał już podmienionego tokena
i sprawdzaj czy w tablicy $_SESSION['secureKey'] jest pole o tym kluczu -------------------- |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 28 Pomógł: 0 Dołączył: 24.06.2009 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Robię to w GET dlatego, że klucz nie będzie mi potrzebny tylko w formularzach. Będą takie miejsca, gdzie nie będzie można odebrać klucza postem więc musi być get. Chyba, że ciastko?
Podaną wadę widzę jako zaletę ![]() ![]() Po co robić tablice asocjacyjne dla klucza? oO |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 1 729 Pomógł: 346 Dołączył: 4.04.2009 Ostrzeżenie: (0%) ![]() ![]() |
Po pierwsze ktoś może otworzyć stronę w zakładce i kliknąć przez przypadek 2 razy. Zamknie 2 okno uzupełni cały formularz i nagle się okaże, że formularz gucio zrobił. Większość userów powie p... nie chcę mi się drugi raz i oleje sprawę.
Po drugie o ile w rejestracji spoko (pomijając pierwszy punkt) to np. przy komentarzach na wielu stronach po otworzeniu zakładek będzie to działać dokładnie tak samo jak wyżej. Po trzecie po to: -szybsze sprawdzenie czy jest ustawiony token -bezproblemowe usuwanie tokena -zamiast true można ustawić np. czas życia tokena i przy sprawdzaniu patrzeć czy nie upłynął -------------------- |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 28 Pomógł: 0 Dołączył: 24.06.2009 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Jak user nie umie klikać to nie mój problem
![]() ![]() W wypadku komentarzy to w ogóle by nie zdało egzaminu. Wyobraź sobie, że nawet jak będzie captcha to mając 2 zakładki to captcha będzie aktualna tylko w tej drugiej (używam własnej captchy i kod jest przechowywany w $_SESSION. Ten twój magiczny sposobik musiałbym też do tokena wdymać. Może będę to robił parami? Coś w stylu klucz i podklucz. Według mnie to zda egzamin. Dzięki temu każda otwarta strona będzie mogła mieć własny key. Coś w stylu lol.php?lubie=packi&key=blablabla&subkey=tratata A przy sprawdzaniu trzepanie $_SESSION['secureKey'] w poszukiwaniu klucza tablicy o nazwie 'tratata' i sprawdzi czy wartość zmiennej z takim kluczem tablicy równa się z 'blablabla'. $_SESSION['secureKey']['tratata'] bedzie miał wartość 'blablabla' Dobrze rozumuję? == EDIT == O jaa.. dopiero po kilku przeczytaniach twojego "$_SESSION['secureKey'][md5(uniqid()] = true);" zrozumiałem idee jegzo działania. Coś w stylu tym co ja napisałem, tylko, że klucz w GET będzie kluczem w tablicy $_SESSION['secureKey'] a potem skrypt sprawdzający obczai, czy jest taki klucz i czy ma wartość true ![]() ![]() Jest tylko jeden mankament. Jeśli jakiś user wejdzie sobie w formularz i przemieli mój skrypt np 20 razy przez F5 to utworzy się 20 tablic w $_SESSION['secureKey'] no i generalnie kaszanka trochę będzie. Może np. zrobić, że może tam być tylko 5 tablic? Jeśli przekroczy 5 tablic to wszystkie zostaną usunięte a najnowszy klucz zostanie wygenerowany i zapisany raz jeszcze ;> A tak btw. to wkradł Ci się tam błąd: == EDIT2 == Wykombinowałem sobie takie cacko:
Nie wiem czy będzie śmigało ale na logikę powinno hulać ![]() == EDIT3 == Powyższy przykład miałby kłopot z wygenerowaniem klucza i przekazaniem go przez GET bo przecież są tam tablice. Posiedziałem jednak i wymyśliłem sbie coś takiego:
Śmiga aż miło. Keneruje tokeny to max 5 a potem tworzy następny i usuwa najstarszy. Kod chyba najprościej napisany jak się tylko da ![]() Jak by było coś nie zrozumiałe: $_SESSION['secureKey']['lastKeyID'] przechowuje ID najnowszego klucza z tokenem. Pętla przetrzepuje każde 5 tablic z kluczami począwszy od najnowszej. Jeśli się zgadza z podanym przez usera to nadaje mu wartość 'empty' i zwraca true. Nie mogę niestety użyć unset() dla tablicy, która trzymała klucz bo potem skrypcik mógłby działać nieprawidłowo bo mógłby mieć dziury w ID tablic. Swoją drogą chyba jednak zostanę przy tym, by userowi dać tylko jeden token. Przy metodzie z pięcioma może sobie wygenerować kilka tokenów, wkleić je do swojego formularza na swojej stronie i próbować się wbić do mnie z wcześniej wygenerowanymi tokenami. Wiem, ze sporo tego ale jak już tu dobrnąłeś to co o tym myślisz? ;> Ten post edytował andrzejt17 15.05.2011, 00:36:58 |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 1 729 Pomógł: 346 Dołączył: 4.04.2009 Ostrzeżenie: (0%) ![]() ![]() |
Po to możesz sobie dać żywotność klucza na np. 10-15 minut po których klucz będzie usuwany np.
wersja z kluczami o tym samym czasie wygasania
Wersja z kluczami o różnym czasie życia
A czy w tablicy będzie 5 czy 1000 tokenów to nie ma jakiejś gigantycznej różnicy. Cytat Jak user nie umie klikać to nie mój problem Właśnie oto chodzi, że to twój problem ![]() A i nie stworzy się 20 tablic tylko jedna tablica 20 elementowa. Ps. jeżeli już lecieć twoim sposobem to:
i i możesz teraz używać albo przy przesyłąniu $_GET['key'] albo $_POST['key'] przy obu równocześnie post będzie w $_REQUEST['key']
Choć jak patrzę to sobie po prostu utrudniasz życie ograniczając się do 5 tokenów np. na forum php jest użyta bardzo podobna metoda co podałem razem z postem przesyłany jest auth_key -------------------- |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 28 Pomógł: 0 Dołączył: 24.06.2009 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
No dobrze
![]() ![]() |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 1 729 Pomógł: 346 Dołączył: 4.04.2009 Ostrzeżenie: (0%) ![]() ![]() |
Sam piszesz, że będziesz to wykorzystywał w różnych miejscach, to znacznie lepiej mieć jeden stały kod do tego niż się rozbijać na niewiadomo ile. Myśl przyszłościowo, a nie na dzień dzisiejszy. Z resztą co to szkodzi, aby user miał 200 tokenów? Cały kilobajt czy 2 danych w sesji co to jest? Raz, że niby będziesz wygodniej operował (w drugiej metodzie masz możliwość ustawiania czasu życia dla każdego tokena osobno).
zalety : -większa kontrola nad tokenami -szybkość ich sprawdzania -niemal nieograniczona ilość otwartych formularzy -znacznie prostszy kod w utrzymaniu wady: -po każdym odświeżeniu strony nowy token bez usuwania starego (który zostanie usunięty dopiero po upłynięciu jego czasu życia) -------------------- |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 28 Pomógł: 0 Dołączył: 24.06.2009 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Dobra, dzięki bardzo za rady ;p Tak czy inaczej rozważę to jeszcze. Póki co nie wybiorę jeszcze sposobu, pomyśle nad tym jak przygotuję cały serwis graficznie i przyjdzie mi to wszystko oskryptować
![]() Dziękówka i pozdro ![]() |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 13.07.2025 - 15:29 |