6 Lipiec 2009

jQuery+PHP sposób na krótką sesję…

Tworząc studioGallery napotkałem na pewien problem związany z zabezpieczeniem pliku, który zapisuje dane do bazy. Zakładając, że tradycyjna sesja w PHP trwa 180 sekund (3. minuty), a napisanie tekstu (artykułu) często może zająć więcej czasu, zacząłem szukać innego sposobu przekazania klucza, który byłby zgodny z tym, zapisanym w sesji.
Tradycyjna metoda polega na wstawieniu ukrytego pola formularza z wartością równą wygenerowanemu kluczowi, i zapisaniu do sesji takiej samej wartości.
W pliku docelowym sprawdzamy przekazany klucz z formularza z wartością sesji i jeśli są równe, wykonujemy dalszą część kodu. Jednak jeśli na stronie będziemy przebywać więcej, pisząc np. bardzo długi artykuł, sesja w PHP wygaśnie i nie będzie zgodna z wartością pola formularza.

Rozwiązanie tego problemu jest bajecznie proste. Wystarczy utworzyć jakiś plik PHP, którego zadaniem będzie wygenerowanie klucza, zapisanie go do sesji i wyświetlenie jego wartości.
Teraz z pomocą przychodzi jQuery.
Przed przesłaniem formularza do pliku, który zapisuje dane do bazy, metodą GET łączymy się z plikiem, pobieramy wartość klucza, podstawiamy do zmiennej i przesyłamy dalej formularz metodą POST.

W efekcie za każdym razem, kiedy będziemy przesyłali dane z formularza, skrypt wcześniej będzie pobierał aktualną wartość klucza, którą równocześnie zapisywać będzie do sesji, co będzie równoznaczne z tym, że klucz zawsze będzie taki sam, jak ten w sesji.

Przykładowy wygląd skryptu jQuery może mieć następującą postać:

$.get('plik_generujacy_klucz.php', function(sResopnse) {
	var key = sResponse;
	var dane_z_formularza = $('#nasz-formularz').serialize()+'&key='+key;
	$.post('plik_do_zapisu_danych.php', dane_z_formularza, function() {
	    // dalsza część kodu po przesłaniu danych...
	});
});

Oczywiście, zamiast przesyłać go metodą POST, można dodać go po adresie jako wartość GET.
Należy jednak pamiętać, że nie zwalnia nas to od przefiltrowania pól formularza i usunięcia ewentualnej niepotrzebnej treści. Nie zalecałbym tej metody w przypadku dodawania komentarzy, gdyż może to zwiększyć ilość spamu (choć wcale nie musi).

Sposób, który opisałem tyczy się raczej panelu administracyjnego i służyć ma jedynie użytkownikom, którzy potrzebują dużo czasu na dodanie treści na stronę, a w przypadku tradycyjnej metody przesyłania wartości KLUCZA, ograniczani byli 3.minutową żywotnością sesji.
Często bowiem spotykałem się z sytuacjami, że pisząc jakiś post, news, czy artykuł musiałem dość często stosować metodę ctrl+a, ctrl+c, ctrl+v, gdyż zdarzało się, że po przesłaniu formularza witał mnie tekst z informacją, że wykonałem niedozwoloną operację, bowiem mój klucz sesji wygasł i nie był zgodny z wartością przesyłaną przez formularz.

Opisałem zatem prosty sposób na rozwiązanie tego problemu.