Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: pytanie o koszyk i bezpieczeństwo
Forum PHP.pl > Forum > PHP
nieraczek
Chciałbym napisać własny koszyk na zakupy z wykorzystaniem sesji. W sesji 'koszyk' przechowuje:
id_ksiazki
tytul
cena
ilosc
cena_wszystkich_ksiazek (musi być bo na każdej stronie wyświetlam cenę zamówienia)

Przy dodawaniu/usuwaniu książki cena_wszystkich_ksiazek jest zmieniana. Przy składaniu zamówienia, do bazy danych wprowadzam do kolumny cena_zamowienia wartosc z $_SESSION['koszyk']['cena_wszystkich_ksiazek']. Zastanawiam sie czy to bezpieczne ? To znaczy jak ktos usunie sesje 'koszyk' to nie bedzie mogl zlozyc zamowienia, ale chodzi mi o to czy ktos moze zmienic wartosc $_SESSION['koszyk']['cena_wszystkich_ksiazek'] na np. 0 ?

Raczej chyba nie, bo jakby mógł zmieniać wartość sesji to i np. na wielu stronach wymagających logowania po zalogowaniu przelogowywać się na innego użytkownika.
Fifi209
Cytat(nieraczek @ 11.07.2009, 08:21:18 ) *
Chciałbym napisać własny koszyk na zakupy z wykorzystaniem sesji. W sesji 'koszyk' przechowuje:
id_ksiazki
tytul
cena
ilosc
cena_wszystkich_ksiazek (musi być bo na każdej stronie wyświetlam cenę zamówienia)

Przy dodawaniu/usuwaniu książki cena_wszystkich_ksiazek jest zmieniana. Przy składaniu zamówienia, do bazy danych wprowadzam do kolumny cena_zamowienia wartosc z $_SESSION['koszyk']['cena_wszystkich_ksiazek']. Zastanawiam sie czy to bezpieczne ? To znaczy jak ktos usunie sesje 'koszyk' to nie bedzie mogl zlozyc zamowienia, ale chodzi mi o to czy ktos moze zmienic wartosc $_SESSION['koszyk']['cena_wszystkich_ksiazek'] na np. 0 ?

Raczej chyba nie, bo jakby mógł zmieniać wartość sesji to i np. na wielu stronach wymagających logowania po zalogowaniu przelogowywać się na innego użytkownika.


Istnieje pojęcie takie jak przechwytywanie sesji etc.
Jeżeli nie masz własnego serwera to nic nie jest bezpieczne, pomysł z sesjami jest udany pod warunkiem napisania/skorzystania z (własnego) session handlera.
ayeo
Witam!

Ja mam tylko taką małą uwagę odnośnie Twojego koszyka. Koszy nie powinien przechowywać ceny, a jedynie id produktu. Załóżmy, że dodaję sobie produkt do koszyka, ale go nie kupuję. Ty zmieniasz cenę produktu. Ja wracam za tydzień i kupuję produkt po starej cenie. Odświeżanie tych danych jest bezsensu

Pole "cena wszystkich książek" nie jest dobrym pomysłem. Jeżeli nie chcesz zliczać ilości książek osobnym zapytaniem to trzymaj dane o wartości koszyka i ilości produktów w tabeli konkretnego usera.

To tylko tak przy okazji.

Pozdrawiam!
Fifi209
Cytat(ayeo @ 11.07.2009, 08:42:54 ) *
Witam!

Ja mam tylko taką małą uwagę odnośnie Twojego koszyka. Koszy nie powinien przechowywać ceny, a jedynie id produktu. Załóżmy, że dodaję sobie produkt do koszyka, ale go nie kupuję. Ty zmieniasz cenę produktu. Ja wracam za tydzień i kupuję produkt po starej cenie. Odświeżanie tych danych jest bezsensu

Pole "cena wszystkich książek" nie jest dobrym pomysłem. Jeżeli nie chcesz zliczać ilości książek osobnym zapytaniem to trzymaj dane o wartości koszyka i ilości produktów w tabeli konkretnego usera.

To tylko tak przy okazji.

Pozdrawiam!


Po części się zgodzę, ale przecież sesje też mają swoją żywotność.
ayeo
Witam!

Koszyk trzyma się w bazie. Identyfikator koszyka (dla niezalogowanego) w ciastku. Jeżeli dodałem sobie coś w sklepie do koszyka to chcę to mieć jak wracam za 2 miesiące. Pomijam już fakt, że znacznie to zwiększa sprzedaż.

Pozdrawiam!
Fifi209
Cytat(ayeo @ 11.07.2009, 08:57:40 ) *
Witam!

Koszyk trzyma się w bazie. Identyfikator koszyka (dla niezalogowanego) w ciastku. Jeżeli dodałem sobie coś w sklepie do koszyka to chcę to mieć jak wracam za 2 miesiące. Pomijam już fakt, że znacznie to zwiększa sprzedaż.

Pozdrawiam!


Pierwsze słyszę o 2 miesięcznym koszyku, moim zdaniem przechowywanie tysięcy koszyków jest do...
Jak wykryjesz czy użytkownik który przerwał sesję, chce ją dokończyć czy też nie?
ayeo
Witam!

W przechowywaniu nawet miliona koszyków nie ma nic złego. Jeśli coś dodałem sobie do koszyka to chce to tam mieć. Nie mam zamiaru wykrywać czy chce dokończyć czy nie. Jeśli wchodząc widzi swój stary koszyk, którym nie jest zainteresowany już to jednym kliknięciem usuwa produkty i tyle.

Mówię cały czas o kliencie niezalogowanym W przypadku zalogowanego niedopuszczalne jest usuwanie koszyka co nie podlega dyskusji.

Pozdrawiam!
Fifi209
Cytat(ayeo @ 11.07.2009, 09:15:43 ) *
Witam!

W przechowywaniu nawet miliona koszyków nie ma nic złego. Jeśli coś dodałem sobie do koszyka to chce to tam mieć.

Pozdrawiam!


Nic złego prócz marnowania zasobów. Może i Ty jako klient wrócisz po 2 miesiącach i będziesz chciał zrealizować zamówienie ale raczej nie każdy.
ayeo
Jeżeli znaczne zwiększenie skuteczności sprzedaży nazywasz marnowaniem zasobów to już Twoja sprawa. Milion rekordów dla dobrej bazy z dobrym indeksem to mały pikuś. Zresztą tu nie chodzi o zasoby. Sklep ma sprzedawać i jeśli ma to robić dobrze trzeba korzystać z dobrych rozwiązań. Jeżeli te rozwiązania wymagają pewnych zasobów to się je po prostu zapewnia.

Około 90% koszyków jest porzucona. Niby dużo, ale jak dobrze policzysz...

Pozdrawiam!
nieraczek
Chodziło mi o sytuację, że po zamknięciu przeglądarki sesja jest kasowana. Bez użycia własnego mechanizmu sesji trzeba jeszcze raz ponownie obliczać cenę zamówienia przed zapisem do bazy danych a nie polegać na S_SESSION['koszyk']['cena_wszystkich_ksiazek'] ? S_SESSION['koszyk']['cena_wszystkich_ksiazek'] używac tylko do wyświetlania ceny zamówienia na każdej stronie ?
ayeo
Cenę i tak musisz obliczać ponownie bo przecież mogła się w międzyczasie zmienić. Bazy danych są budowane przez specjalistów i nie ma co na siłę ich "ulepszać" w PHP. Jak sobie policzy łączną cenę przy każdym odświeżeniu nic jej nie będzie. Jak zauważysz problemy (w co wątpię) to się wtedy zastanów nad jakimś cachowaniem tych danych. Proponuję zwykłe SUM() + GROUP BY user_id biggrin.gif

Pozdrawiam!
viking
Może i fajnie trzymać koszyk przez 2 miesiące ale zazwyczaj bezpieczeństwo danych jest fatalne. Ja zawsze wychodzę z założenia że gdy użytkownik obraca danymi wrażliwymi sesja wygasa jak najszybciej. Minimalizuje się tym samym ryzyko przechwycenia (bo np. w międzyczasie user dorobił się trojana). Że nie wspomnę o braku SSL.
ayeo
Witam!

Nie do końca rozumiem. Jaka różnica w takim wypadku czy trzymam te dane 2 miesiące czy 1 godzinę? Poza tym, żeby zrealizować zamówienie na podstawie koszyka user musi się zalogować przecież. Jeśli ktoś udostępnia swoje hasła (świadomie lub nie) to nic na to nie poradzisz niestety.

Pozdrawiam!
nieraczek
Niekoniecznie musi się zalogować, np. na helion.pl nie musi - takie rozwiązanie jest zdecydowanie wygodniejsze dla użytkownika - użytkownik składa zamówienie bez potrzeby rejestracji, potwierdzenia rejestracji przez kliknięcie linka w emailu i następnie zalogowania i dopiero złożenia zamówienia, w takim wypadku jak wróci za rok do sklepu to znów spróbuje się zarejestrować wypełniając formularz rejestracyjny, by na końcu dowiedzieć się że taki email jest już w bazie (czyli olbrzymia strata czasu na wypełnienie formularza) i trzeba skorzystać z przypomnienia hasła, kliknąć znowu na linka itd. (olbrzymia strata czasu) bo się zapomniało tego hasła - ja tak często mam jak coś zamawiam w sklepach internetowych, denerwuje mnie to potwornie - sama konieczność rejestracji mnie denerwuje. Ja chce tylko złożyć zamówienie - nie chce się REJESTROWAC i LOGOWAĆ exclamation.gif
Chce więc zrobić taki koszyk, który umożliwi składanie zamówień bez potrzeby rejestracji, wystarczy tylko podać dane i potwierdzić zamówienie klikając na linka w emailu. Dlatego wygodnym by było przechowywanie wartości zamówienia w sesji i po dokonaniu zamówienia wprowadzenie do bazy wartosci zamówienia z tej sesji, ale jak rozumiem nie jest to bezpieczne i przed wprowadzeniem wartości zamówienia do bazy należy na podstawie id książek w sesji jeszcze raz obliczyć cenę zamówienia.
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.