Gdybym miał użytkownika zalogowanego na mojej stronie, mając zapisany jego identyfikator $_SESSION
, i ze swojej przeglądarki kliknął przycisk „Zapisz”, co spowodowałoby wysłanie żądania AJAX do serwera. Czy jego $_SESSION
i pliki cookie zostaną zachowane w tym żądaniu i czy mogę bezpiecznie polegać na tym, że identyfikator jest obecny w $_SESSION
?
154
HttpOnly
flagę podczas ustawiania pliku cookie, co oznacza, że Twój Javascript nie będzie w stanie zobaczyć pliku cookie. Jednak plik cookie będzie nadal wysyłany zarówno w przypadku żądań AJAX, jak i zwykłych żądań stron i nadal będzie działał dokładnie tak samo. Twój Javascript po prostu go nie zobaczydocument.cookie
.Warning: session_write_close(): Failed to write session data (user)
Ostatnio sporadycznie otrzymuję błąd w projekcie, ale tylko wtedy, gdy żądanie AJAX ma miejsce podczas ładowania pozostałej części strony. Używam bazy danych MySQL dla danych sesji i możliwe, że żądanie strony głównej blokuje tę tabelę, uniemożliwiając dostęp do niej żądaniu AJAX.Jeśli plik PHP żądania AJAX zawierają
session_start()
informacje o sesji, zostaną zachowane. (zablokowanie żądań znajduje się w tej samej domenie)źródło
To, co naprawdę masz, to: czy pliki cookie są wysyłane z żądaniem AJAX? Zakładając, że żądanie AJAX dotyczy tej samej domeny (lub w ramach ograniczeń domeny pliku cookie), odpowiedź brzmi tak. Zatem żądania AJAX z powrotem do tego samego serwera zachowują te same informacje o sesji (zakładając, że wywoływane skrypty wysyłają sesję_start (), jak każdy inny skrypt PHP, który chce uzyskać dostęp do informacji o sesji).
źródło
Cóż, nie zawsze. Korzystając z plików cookie, jesteś dobry. Jednak pytanie „czy mogę bezpiecznie polegać na obecności identyfikatora” skłoniło mnie do rozszerzenia dyskusji o ważny punkt (głównie w celach informacyjnych, ponieważ liczba odwiedzających tę stronę wydaje się dość wysoka).
PHP można skonfigurować tak, aby utrzymywał sesje przez przepisywanie adresów URL zamiast plików cookie. ( Jak to jest dobre lub złe (<- zobacz np. Najwyższy komentarz) to osobne pytanie , teraz trzymajmy się aktualnego, z tylko jedną uwagą boczną: najważniejszy problem z sesjami opartymi na adresach URL - rażący widoczność samego identyfikatora sesji - nie jest to problem z wewnętrznymi wywołaniami Ajax; ale potem, jeśli jest włączony dla Ajax, jest włączony także dla reszty witryny, więc tam ...)
W przypadku sesji przepisywania adresów URL (bez plików cookie) wywołania Ajax muszą same zadbać o to, aby ich adresy URL żądań były odpowiednio spreparowane. (Lub możesz wdrożyć własne niestandardowe rozwiązanie. Możesz nawet uciec się do utrzymywania sesji po stronie klienta , w mniej wymagających przypadkach.) Chodzi o wyraźną ostrożność potrzebną do ciągłości sesji, jeśli nie używasz plików cookie:
Jeśli wywołania Ajax po prostu wyodrębniają adresy URL dosłownie z HTML (otrzymane z PHP), powinno to być OK, ponieważ są już ugotowane (umm, ugotowane).
Jeśli muszą samodzielnie zestawić identyfikatory URI żądań, identyfikator sesji należy dodać do adresu URL ręcznie. (Sprawdź tutaj lub źródła stron generowane przez PHP ( z włączonym przepisywaniem adresów URL ), aby zobaczyć, jak to zrobić.)
Z OWASP.org :
Z postu na forum Ruby :
źródło
Bardzo ważne jest, aby żądania AJAX zachowywały sesję. Najłatwiejszym przykładem jest, powiedzmy, próba wykonania żądania AJAX dla panelu administracyjnego. Oczywiście zabezpieczysz stronę, do której wysyłasz żądanie, aby nie była dostępna dla innych, którzy nie mają sesji, którą otrzymujesz po zalogowaniu administratora. Ma sens?
źródło
Jedną rzeczą, na którą należy uważać, szczególnie jeśli używasz frameworka, jest sprawdzenie, czy aplikacja odtwarza identyfikatory sesji między żądaniami - wszystko, co zależy bezpośrednio od identyfikatora sesji, spowoduje problemy, chociaż oczywiście reszta danych w sesja pozostanie nienaruszona.
Jeśli aplikacja odtwarza identyfikatory sesji w ten sposób, możesz skończyć z sytuacją, w której żądanie AJAX w efekcie unieważnia / zastępuje identyfikator sesji na stronie żądającej.
źródło
To właśnie robią frameworki, np. Jeśli zainicjujesz sesję w kontrolerze frontowym lub skrypcie boostrap, nie będziesz musiał przejmować się jego inicjalizacją ani dla kontrolerów stron, ani dla kontrolerów ajax. Frameworki PHP nie są panaceum, ale robią tak wiele przydatnych rzeczy!
źródło
umieść swoje session () auth na wszystkich stronach serwera akceptujących żądanie ajax:
to chyba jedyny sposób, w jaki kiedykolwiek to zrobiłem.
źródło