Article View: pl.comp.www
Article #396272Re: Jak pokazać ścieżkę dostępu do dokumentu?
From: Marek
Date: Mon, 09 Mar 2009 10:58
Date: Mon, 09 Mar 2009 10:58
93 lines
6412 bytes
6412 bytes
> Uparcie robisz na opak :) > > Formularz kontaktowy _powinien_ używać POST, bo ma efekt uboczny - > wysłanie e-maila. Więc nie robię na opak :-) Ponadto chyba każdy submit formularza ma na celu mieć efekt uboczny? Po to się to robi aby wysłać email, dodać do koszyka (bazy danych) noiwą pozycję zamówienia, zaktualizować w bazie danych ilości zamawianych produktów itp. W żadnym z tych przypadków akcja POST nie może się powtórzyć przy np. odświeżeniu. > Dlatego należy robić walidację danych! Mam walidację lecz to za mało. Nie wolno np. pola nazwać "email" bo boty spamowe wiedzą wtedy co tam wpisać. Pole powinno nazwyać się "dupa" lub coś w tym stylu. Pozostałem pola to imię, nazwisko, treść - więc nie ma czego walidować. > Nie rób bezbronnych aplikacji (security by obscurity) polegając na tym jak > bardzo komuś się (nie)chce. Zrób to porządnie tak, żeby nie było > oczywistych dziur w użyciu danych POST, GET, cookies i innych. Nie robię - nawet robię sporo więcej: stosuję ID transakcji a w skrajnych przypadkach - generowanie wartości pola przez JS. > Powiedziałem dobrym botom. Te złe i tak będą ci łaziły po wszystkich > formularzach - GET (harvestery) i POST (spamboty). Hmmm... założyłem, że się przejęzyczyłeś. A co to zmieni jeśli złe i tak będą spamowały - jak sam napisałeś? Dobre przecież nie są źródłem spamu. > Nie rozumiem o czym mówisz. Wyszukiwarka = GET. Koszyk = POST. > Wyszukiwarka != koszyk. Ok... może przykład. Jestem na karcie produktu. Dodaję produkt do koszyka (np. POST), w koszyku aktualizuję ilość (POST) klikam wstecz i co dostaję? Z pewnością nie stronę produktową lecz komunikat o próbie submitu formularza. W "moim" podejściu te dwa POSTy nie są widoczne dla przeglądarki i wstecz przenosi tam gdzie user oczekuje - do produktu. > Przeglądarka wysyła POST. Obrabiasz dane, wysyłasz status 303 i nagłówek > Location. Przeglądarka załaduje nową stronę używając GET. Wracanie działa > tak, jak zawsze powinno. Hmm.. ciekawe. Poeksperymentuję bo faktycznie nie pomyślałem o takim podejściu. Mam jednakże pewną wątpliwość... a co jeśli naszą intencją jest pozostanie na tej samej stronie? Przykładowo taki przypadek ma miejsce przy aktualizacji ilości w koszyku albo akceptacji kryteriów w wyszukiwarce. > To jest mniejwięcej to, co opisałeś na początku wątku. Sęk w tym, żeby to > stosować tylko wtedy, gdy potrzeba POST (czyli nie przy wyszukiwaniu) i > żeby URL podany w Location zawierał coś unikalnego zależnego od danych z > POST, jeśli ma z nimi jakiś związek (jeśli wyświetlasz tylko stronę z > "dziękujemy za wysłanie formularza", to nie musi być unikalny. Jeśli > wyświetlasz "dodałeś czajnik do koszyka", to powinien być unikalny, żeby > po dodaniu czegoś innego do koszyka użytkownik na pewno nie dostał strony > o czajniku). Tak, ja nawet dołączam ID transakcji - nie tylko jest wtedy unikalny lecz nie pozwala na celowe powtórzenie operacji. Każdy moduł programowy CMS'a, który przetwarza dane z formularzy bada zgodność ID transakcji z formularza z poprzednio obowiązującym i dopiero wtedy traktuje dane jako uwierzytelnione. Każde przeładowanie = nowy ID. > Jeśli masz w aplikacji choć odrobinę abstrakcji, to powinno dać się używać > GET na początku i bezboleśnie przerobić na POST, jeżeli ilość pól urośnie > do niebezpiecznego rozmiaru. Ja dmucham na zimne i POST stosuję wszędzie :-) Szczerze mówiąc tylko przy wyszukiwarce widziałbym uzasadnienie stosowania GET ale to też obarczone byłoby ryzykiem. Nie chciałem wdawać się w szczegóły lecz widzę, że powinienem. Otóż w swoim CMSie udostępniam możliwość konfigurowania wyszukiwarki z poziomu sekcji redakcyjnej. Właściciel sklepu / portalu / prostej strony WWW sam decyduje jakie kryteria i w jakich wyszukiwarkach w systemie mają być dostępne. Mało tego - sam określa jakie cechy posiada dany dokument / produkt. Wszystkie z nich mogą stanowić kryteria wyszukiwania - to kwestia kliknięcia tylko. Tak więc chcąc uniknąć niespodzianek związanych z przekroczeniem długości GET - stosuję POST. > W praktyce jednak z tym się nie spotykam. Formularz, który ma kilkaset pól > albo opcji do zaznaczenia w <select> najczęściej jest też zbyt > skomplikowany dla użytkowników i robi zbyt wiele rzeczy na raz. Taki > formularz dzielę na mniejsze (coś a'la wizard) albo wybór spośród setek > indywidualnych opcji zamieniam na coś innego - np. wybór całych > grup/kategorii albo wg. tagów/słów kluczowych. Takie wielopolowe formularze mają zastosowanie np. przy ręcznym aktualizowaniu cen produktów. Wtedy dobrze jest wykorzystać listę produktów i pól cenowych. Natomiast w wielu pozostałych przypadkach wystarczy jedno pole aby przepełnić możliwości GET. Takim polem jest np. "treść wiadomości" w formularzu kontaktowym lub "uwagi do zamówienia" w koszyku. Nie ogranicznam ilości znaków bo nie powinienem.
Technical Details
Message-ID:
<gp2sop$gqu$1@achot.icm.edu.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news2.icm.edu.pl!not-for-mailReferences:
<gor2lh$feg$1@achot.icm.edu.pl> <gor893$ook$1@nemesis.news.neostrada.pl> <gor9bq$oip$1@achot.icm.edu.pl> <gorb3n$a5b$1@atlantis.news.neostrada.pl> <gorvec$t65$1@achot.icm.edu.pl> <op.uqd2icdoutk0y1@aimac.local> <gotpj5$2v3$1@achot.icm.edu.pl> <op.uqfg6ae2utk0y1@aimac.local> <gougar$te3$1@achot.icm.edu.pl> <op.uqfuuky8utk0y1@aimac.local>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news2.icm.edu.pl!not-for-mail From: "Marek" <marek1967@spam.interia.pl> Newsgroups: pl.comp.www Subject: Re: Jak pokazać ścieżkę dostępu do dokumentu? Date: Mon, 9 Mar 2009 11:58:31 +0100 Organization: http://news.icm.edu.pl/ Lines: 94 Message-ID: <gp2sop$gqu$1@achot.icm.edu.pl> References: <gor2lh$feg$1@achot.icm.edu.pl> <gor893$ook$1@nemesis.news.neostrada.pl> <gor9bq$oip$1@achot.icm.edu.pl> <gorb3n$a5b$1@atlantis.news.neostrada.pl> <gorvec$t65$1@achot.icm.edu.pl> <op.uqd2icdoutk0y1@aimac.local> <gotpj5$2v3$1@achot.icm.edu.pl> <op.uqfg6ae2utk0y1@aimac.local> <gougar$te3$1@achot.icm.edu.pl> <op.uqfuuky8utk0y1@aimac.local> NNTP-Posting-Host: chello084010100080.chello.pl Mime-Version: 1.0 X-Trace: achot.icm.edu.pl 1236596313 17246 84.10.100.80 (9 Mar 2009 10:58:33 GMT) X-Complaints-To: abuse@icm.edu.pl NNTP-Posting-Date: Mon, 9 Mar 2009 10:58:33 +0000 (UTC) X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.5579 X-Priority: 3 X-Newsreader: Microsoft Outlook Express 6.00.2900.5512 X-MSMail-Priority: Normal Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit