![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 4 340 Pomógł: 542 Dołączył: 15.01.2006 Skąd: Olsztyn/Warszawa Ostrzeżenie: (0%) ![]() ![]() |
napisalem prosty skrypt dodawania komentarzy na stronke i mam pytanie jak zrobic zeby skrypt nie dodawal ciagle tygo samego po nacisnieciu odswieżania??
---- Posty będące duplikacją postów już zawartych w temacie, będą bez ostrzeżenia usuwane. Ma to zapobiedz tworzeniu się zbędnego śmietnika moderator |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 660 Pomógł: 13 Dołączył: 9.06.2004 Skąd: Wrocław i okolice Ostrzeżenie: (0%) ![]() ![]() |
Możesz albo zablokować możliwość dwóch postów tego samego usera na dany temat pod sobą, albo sprawdzać np. czy pierwsze (powiedzmy) 50 znaków poprzedniego posta, różnią się od tego właśnie dodawanego.
|
|
|
![]()
Post
#3
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 94 Pomógł: 0 Dołączył: 6.02.2005 Ostrzeżenie: (0%) ![]() ![]() |
w prosty sposób można to osiągnąć, mianowicie:
np.:
a w forumularzu:
teraz po odświeżeniu strony, 2 raz nie doda się wpis do bazy (IMG:http://forum.php.pl/style_emoticons/default/guitar.gif) Ten post edytował huntercs 27.03.2006, 11:25:08 |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 4 340 Pomógł: 542 Dołączył: 15.01.2006 Skąd: Olsztyn/Warszawa Ostrzeżenie: (0%) ![]() ![]() |
a jezeli chcem zrobic to przy zapisie do pliku .txt??
Moze jest to banalne pytanie ale naprawde niewiem |
|
|
![]()
Post
#6
|
|
Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
to nie ma znaczenia, co robisz po submicie formularza, w skrypcie
|
|
|
![]()
Post
#7
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Cytat(huntercs @ 2006-03-27 12:23:36) w prosty sposób można to osiągnąć, mianowicie: np.:
a w forumularzu:
teraz po odświeżeniu strony, 2 raz nie doda się wpis do bazy (IMG:http://forum.php.pl/style_emoticons/default/guitar.gif) no nie do konca tak jest. tu chodzi o taki refresh przez wcisniecie F5 lub ctrl+r, a nie ponowne wcisniecie ręcznie submita. Taki refresh o którym mowa, wysyla jeszcze raz ten sam formularz, z tymi samymi polami i wartościami. Tu nic nie da, ze ty dodasz dodatkowe pole, gdyż ono nie zostanie przy refreshu uwzględnione |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 4 340 Pomógł: 542 Dołączył: 15.01.2006 Skąd: Olsztyn/Warszawa Ostrzeżenie: (0%) ![]() ![]() |
to chyba najlepszym sposobem jest po nacisnieci submita zrobic zapis i przekierowac na stronke na ktorej sa wyswielane komentarze
Ten post edytował skowron-line 28.03.2006, 11:13:59 |
|
|
![]()
Post
#9
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Ja to robię jeszcze inaczej.
PRzy tworzeniu formularza, generują unikalny identyfikator, na podsawie chociazby timestampa i czegos tam jeszcze. Identyfikator ten dokladam do formularza, jako wartość pola ukrytego. Po wyslaniu formularza sprawdzam, czy dany identyfikator jest zapisany w sesji. jesli nie, zapisuję go do sesji a formularz akceptuję jako prawidlowy. jesli jednak ten identyfikator jest juz zapisany w sesji, znaczy ze jest to refresh i dane z formularza odrzucam. Dzieki takiemu podejsciu, mogę pozostac dalej na stronie z formularzem, bez przekierowania. Jest to mi czasami potrzebne. |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 4 340 Pomógł: 542 Dołączył: 15.01.2006 Skąd: Olsztyn/Warszawa Ostrzeżenie: (0%) ![]() ![]() |
a do bazy danych to wymyslilem ze moge wyciagnac ostatni rekord z bazy i porownac go z wpisywanym i jesli bedzie identczny to odrzucic. to chyba nienajgorsze rozwiazanie
Ten post edytował skowron-line 28.03.2006, 20:53:48 |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 94 Pomógł: 0 Dołączył: 6.02.2005 Ostrzeżenie: (0%) ![]() ![]() |
tylko po co mieszać do tego bazę? dodaktowe zapytanie... (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
lepiej zrobić z COOKIE/SESSION coś podobnego do tego co zaproponował nospor |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 743 Pomógł: 0 Dołączył: 11.11.2003 Skąd: Toruń Ostrzeżenie: (0%) ![]() ![]() |
A nie prościej zrobić np. dodanie commenta po czym header("Location: adres.php");
I wszystkie F5 z głowy ? |
|
|
![]()
Post
#13
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) ![]() ![]() |
Cytat(huntercs @ 2006-03-28 23:01:57) tylko po co mieszać do tego bazę? dodaktowe zapytanie... (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Ależ jakie dodatkowe zapytanie? Wystarczy nałożyć kluch UNIQUE. Kliknij w linka, którego dałem na górze wątku. Ja uważam że to jest najlepsze rozwiązanie. Nie angażujesz żadnej sesji, ciasteczek ani niczego. Po prostu działa (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) |
|
|
![]()
Post
#14
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Cytat Wystarczy nałożyć kluch UNIQUE. Ale nalozysz klucz na wszystkie pola? a co jesli rekord moze sie powtorzyc poprzez jawne wpisanie? A co jesli nie mozna zalozyc unique na zadne pole, gdyz kazde z osobna moze sie powtarzac. Osobiscie nie podoba mi ten sposob zabezpieczenia przed refreshem. Nie bedziemy przeciez zmieniac struktury bazy tylko pop to by uniknać refresha. Do tego są inne rzeczy juz tu wymienione
|
|
|
![]()
Post
#15
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) ![]() ![]() |
Cytat(nospor @ 2006-03-29 08:59:38) a co jesli rekord moze sie powtorzyc poprzez jawne wpisanie? A co jesli nie mozna zalozyc unique na zadne pole, gdyz kazde z osobna moze sie powtarzac. Więc należy wybarć kombinacją pól, które powtarzać się nie powinny. W 99% przypadków kombinacja taka istnieje. Cytat(nospor @ 2006-03-29 08:59:38) Osobiscie nie podoba mi ten sposob zabezpieczenia przed refreshem. Nie bedziemy przeciez zmieniac struktury bazy tylko pop to by uniknać refresha. Do tego są inne rzeczy juz tu wymienione Prezcież to nie jest zmiana struktury bazy. Przy jej projektowaniu powinno się założyć unikalność na pola, które tego wymagają. A poza tym gdyby to do aplikacji klienckiej miało należeć kontrolowanie unikalności wprowadzanych danych, to po co w bazach byłby w ogóle ten mechanizm. Ja uważam że najlepiej baza zadba sama o siebie, mało tego jest to sapoób właśnie do tego stworzony, i jeszcze mniej tego (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) najwygodniejszy. Nie powiesz mi ~nospor, że pisanie mechanizmów ciasteczek, zapisywanie informacji w sesji, ciągłe pilnowanie tego jest wygodniejsze niż blok try ... catch i wyrzucanie wyjątku z odpowienim kodem (1062 w tym przypadku). |
|
|
![]()
Post
#16
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
dalej sie z tobą nie zgadzam. Istnieją przecież tabele, w których nie może byc pol unikatowcyh. nie dlatego ze baza na to nie pozwala, ale dlatego, ze zalozenia dla danej tabeli na to nie pozwalają. a konkretnie pozwalają na takie same rekordy. moze tak byc.
Cytat Nie powiesz mi ~nospor, że pisanie mechanizmów ciasteczek, zapisywanie informacji w sesji, ciągłe pilnowanie tego jest wygodniejsze niż blok try ... catch i wyrzucanie wyjątku z odpowienim kodem (1062 w tym przypadku). Obys sie nie zdziwil (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Zalezy czego uzywasz. Ja uzywam wlasnej klaski do formualrzy. Wiesz jak sa sprawdzam czy byl refresh czy nie? O tak:No i niepowiesz mi chyba, ze jest to nie wygodne (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) edit: Cytat Prezcież to nie jest zmiana struktury bazy. źle sie wyslowilem. chodzilo mi, ze nie bede zakladal uniqow jesli nie potrzebuje, tylko poto by refresha uniknąc
|
|
|
![]()
Post
#17
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) ![]() ![]() |
Ładnie, bardzo ładnie.
Ja to robię tak:
Połączenie Agavi i Creole'a. Jak mi wyskoczy wyjątek to mogę z aplikacją zrobić wszystko, zależy to od tego jaki. Każdy ma swój najlepszy sposób (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) |
|
|
![]()
Post
#18
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
A że ja upierdliwy jestem...
A co w przypadku, gdy mamy formularz, ale jego wynik nie jest zapisywany do bazy, tylko wysylany mailem? Jest to tzw. formularz kontaktowy. Wtedy uniqi na bazie nam nic nie dadzą (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Oczywiście można wówczas użyc header, lub sesje. A jeszcze pytanko bo nie sprawdzalem tego nigdy. Zalozmy ze uzywamy header, zeby przekierowac po wyslaniu formularza. A czy jest mozliwa sytuacja, ze koles zanim zostanie przekierowany zdązy wcisnąć F5, czyli tym samym ponownie wysle ten sam formularz? |
|
|
![]()
Post
#19
|
|
Grupa: Zarejestrowani Postów: 4 340 Pomógł: 542 Dołączył: 15.01.2006 Skąd: Olsztyn/Warszawa Ostrzeżenie: (0%) ![]() ![]() |
ja napisalem cos takiego i dziala
prosze o lekka krytyke jesli komus sie nie bedzie podobac (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) |
|
|
![]()
Post
#20
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
ale o ile dobrze wczytuje sie w ten kod, to ty zrobiles to, co zaproponowal wczesniej huntercs (i to nie dokladnie tak). Jak juz pisalem wczesniej to nie zadzial przy refreshu.
W jaki sposob ty to testowales? Bo to wyglada tak: jesli wcisniesz zapisz, to dogenerowujesz do formularza hiddena, z ostatnim wpisem z bazy, ale ten wpis nie jest tym, co aktualnie dodajesz. Potem sprawdzasz, czy wpis z bazy z hiddena rowny jest aktualnemu. To bedzie rowne dopiero przy ktoryms tam razie. A wsytuacji, gdy wygenerujesz formularz pierwszy raz, wscisniesz zapisz a potem dasz refresh, to ci nie zadziala. No chyba ze mamy co innego na mysli mówiąc refresh (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) |
|
|
![]()
Post
#21
|
|
Grupa: Zarejestrowani Postów: 4 340 Pomógł: 542 Dołączył: 15.01.2006 Skąd: Olsztyn/Warszawa Ostrzeżenie: (0%) ![]() ![]() |
To ma byc tak:
wpisujesz jakis text i naciskasz submit wtedy on wyciaga ostatni wpis porownuje go z tym co wpisales jesli jest inny to zapisuje. Potem jak nacisniesz F5 to znow sprawdza i jesli jest taki sam to go odrzuca. P.S trzeba dopisac jeszcze jesli pola sa puste zeby nie zapisywal do bazy Ten post edytował skowron-line 29.03.2006, 10:39:41 |
|
|
![]()
Post
#22
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Cytat wpisujesz jakis text i naciskasz submit wtedy on wyciaga ostatni wpis porownuje go z tym co wpisales jesli jest inny to zapisuje. Ale Twoj skrypt co pokazales, tego nie realizuje. Po wcisnieciu submita, ty ostatni wpis do bazy zapisujesz w polu ukrytym, a potem sprawdzasz, czy to pole ukryte zgadza się z tym co wpisales. Tylko sęk w tym, ze zmienna pola ukrytego, nie jest jeszcze utworzona... Nie po pierwszym submicie. A po refreshu tez nie będzie, gdyz refresh wysyla jeszcze raz poprzednio wyslany formularz
|
|
|
![]()
Post
#23
|
|
Grupa: Zarejestrowani Postów: 4 340 Pomógł: 542 Dołączył: 15.01.2006 Skąd: Olsztyn/Warszawa Ostrzeżenie: (0%) ![]() ![]() |
nospor zwracam honor przeanalizowalem ten skrypt i nie dziala jak nalezy.
Ten post edytował skowron-line 30.03.2006, 10:16:51 |
|
|
![]()
Post
#24
|
|
Grupa: Zarejestrowani Postów: 211 Pomógł: 0 Dołączył: 30.03.2006 Skąd: Żary Ostrzeżenie: (0%) ![]() ![]() |
Da sie zrobic jakos tak, zeby dodaj i zapisz bylo w jednym pliku??
Jak wtedy mam uzywac zmiennych?
Ten post edytował Krisu 31.03.2006, 20:21:44 |
|
|
![]()
Post
#25
|
|
Grupa: Zarejestrowani Postów: 72 Pomógł: 0 Dołączył: 23.06.2004 Skąd: Rzeszów Ostrzeżenie: (0%) ![]() ![]() |
nospor, a mógłbyś napisać jak potem z tej sesji wyrzucasz indentyfikator tak aby było gotowe na kolejne użycie formularza ?
|
|
|
![]()
Post
#26
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
@tes ja go nie wyrzucam. Jak pisalem, generuję unikalne identyfikatory. Przy kolejnym uzyciu formularza, generowany jest kolejny unikatowy identyfikator (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
|
|
|
![]()
Post
#27
|
|
Grupa: Zarejestrowani Postów: 1 590 Pomógł: 185 Dołączył: 19.04.2006 Skąd: Gdańsk Ostrzeżenie: (0%) ![]() ![]() |
Porównać IP gościa i czas - moim zdaniem najlepszy i uniwersalny sposób.
$_SERVER['REMOTE_ADDR'] - pobiera IP gościa time() - czas Można zapisać IP i czas w bazie txt/sql (dużo baz standardowo zapisuje IP i czas dodania, wtedy już jesteśmy w domu), lub przejściowo w zmiennych. Potem wystarczy użyć prostego warunku IF - jeśli IP są różne to wysyła, jeśli identyczne to liczy różnicę czasów, jeśli różnica czasów jest mniejsza niż np. 60 sekund to nie pozwala wysłać. |
|
|
![]()
Post
#28
|
|
Grupa: Zarejestrowani Postów: 269 Pomógł: 0 Dołączył: 6.02.2006 Ostrzeżenie: (0%) ![]() ![]() |
Ja stosuje prosta metode, poprostu za pomocą JS lub php przenosze gościa do nowej strony z podziekowaniami lub z wyswietleniem wynikow /w zaleznosci od potrzeb/.
JS:
php:
gdzie funkcja adres ma postac:
|
|
|
![]()
Post
#29
|
|
Grupa: Zarejestrowani Postów: 181 Pomógł: 9 Dołączył: 28.08.2006 Skąd: Katowice Ostrzeżenie: (0%) ![]() ![]() |
O rany, zaczęliście całą religię do tego problemu dobudowywać (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) Ja używam czegoś co jednocześnie jest filtrem antyspamowym. Tworzę przy dodawaniu komentarza cookie z czasem dodania ostatniego komenta i później przy dodawaniu następnego, sprawdzam kiedy dodany był poprzedni.
Chyba, że czegoś nie doczytałem i problem rzeczywiście wymaga większego sprytu? ;> |
|
|
![]()
Post
#30
|
|
Grupa: Zarejestrowani Postów: 793 Pomógł: 32 Dołączył: 23.11.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Może większego nie, ale jak ja szybko piszę i odpowiadam na wiele postów, to musiał byś wiedzieć czy to było w tym dziale i czy to ten sam post czy następny...
Czasem jest szybka wymiana zdań i ciężko ustalić czy się coś dodaje drugi raz czy pierwszy. |
|
|
![]()
Post
#31
|
|
Grupa: Zarejestrowani Postów: 45 Pomógł: 0 Dołączył: 18.08.2007 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
Niepotrzebnie zakładałem nowy wątek - więc dopisuję tu swoje trzy grosze na temat techniki z headerem - czyli Redirect After Post pattern (w linku).
Rozwiązanie które proponuję nie wymaga żadnego kombinowania z "natywnym" kodem aplikacji ani z kombinowaniem na bazie danych. Zadziała dla wszystkich skryptów aplikacji napisanych wcześniej i nie będzie też trzeba wymyślać nowych sposobów zabezpieczania dla kolejnego formularza - skryptu. |
|
|
![]()
Post
#32
|
|
Grupa: Zarejestrowani Postów: 375 Pomógł: 20 Dołączył: 28.07.2006 Ostrzeżenie: (0%) ![]() ![]() |
Jeżeli chcemy tylko ochronić skrypt przed przypadkowym wciśnięciem F5, dobrym rozwiązaniem jest wysyłanie formularzy za pomocą AJAX. (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) W wyznaczonym miejscu (np. między nawigacją) otrzymujemy taki wynik (np. komentarze, informację o przebiegu akcji, wypełniony formularz + błędy do poprawy), jaki otrzymalibyśmy, wysyłając je tradycyjnie. Oczywiście kod JS powinien nadpisywać atrybuty <form> lub submit i przejąć kontrolę nad formularzem.
Ten post edytował WebCM 30.12.2007, 14:54:37 |
|
|
![]()
Post
#33
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
źle.
Ajax/js nie jest rozwiązaniem na problemy. Owszem, ma to wspomóc ale nie zastąpic. Zabezpieczenia po stronie serwera muszą być, niezależnie czy wspomagasz się js/ajax czy nie. Bo jak ktoś sobie wyłączy js to albo twoja strona nie bedzie dla niego dostępna, albo co gorsza - Twoja strona będzie bezbronna bo nie pomyslales ze ktos moze nie uzywac js. |
|
|
![]()
Post
#34
|
|
Grupa: Zarejestrowani Postów: 40 Pomógł: 2 Dołączył: 14.07.2006 Ostrzeżenie: (0%) ![]() ![]() |
to moze i ja dorzuce swoje 3 grosze.
# rozwiazanie w stylu js/ajax jest moim zdaniem chybione, bo po co wogole angazowac ajaxa do rzeczy tak banalnej jak wyslanie formularza. # rozwiazanie z dodawaniem ukrytego pola do formularza po kliknieciu submit w formularzu tez nie bedzie dzialalo, bo klikniecie F5 powoduje wyslanie ponownie TEGO SAMEGO formularza, wiec nie zostanie wyslany nowy z nowo wygenerowanym polem - a chodzi tutaj chyba o zabezpieczenie przez refresh'em a nie ponownym klikaniem w submit. kolega wczesniej podawal przyklad:
a w forumularzu:
i tak jak napisalem to oczywiscie nie dziala, bo klikniecie F5 (refresh) nie powoduje ponownej generacji formularza czyli pole
nie zostanie wyslane z formularzem # rozwiazanie z zapisywaniem IP oraz czasu i sprawdzanie czy nowy post jest z tego samego IP co ostatni, jesli tak to ile minelo czasu - jest rowniez niepoprawne. po pierwsze co jesli dodaje dwa posty w roznych topicach w bardzo krotkim czasie? z tym oczywiscie mozna sobie poradzic, bo mozna sprawdzac czy nowy post jest z tego samego topicu czy nie, ale na jakiej zasadzie ma byc liczony czas po ktorym mozna ponownie dodac posta? 60 sekund jak zaproponowal kolega wyzej? to klikne F5 po 65 sekundach. 120 sekund? to klikne F5 po 125 sekundach? 240 sekund? itd. To rozwiazanie moze byloby i dobre, ale na calkowicie inny problem. Na spamerow, trolli czy inne typu wynalazki, czyli zablokowanie mozliwosci wysylanie duzej ilosci postow przez tego samego uzytkownika w krotkim czasie. Ale bynajmniej nie jest to rozwiazanie na refresh o ktory sie w tym topicu rozchodzi. # rozwiazanie z przechwytywaniem wyjatkow z bazy owszem dziala, ale tylko jesli zapisujemy tresc formularza do bazy. a co jesli ma byc zapisywany do pliku, wyslany mailem, czy cokolwiek innego ma sie z nim dziac? # rozwiazanie z dodawaniem atrybutow UNIQUE do pol bazy zadziala jak wyzej - tylko w przypadku, gdy dane z formularza maja wyladowac w bazie. Wiec jak to najlepiej zrobic i tak zeby dzialalo zawsze? # jednym z rozwiazan jest to o czym zapewne wiekszosc z was wie. czyli przekierowanie w pliku do ktorego odwoluje sie akcja formularza. jesli mamy formularz: to w pliku wykonaj_akcje.php zapisujemy:
# drugie rozwiazanie, ktore ja osobiscie najczesciej stosuje, jest to o czym pisal nospor. w momencie generowania formularza generujemy pole typu "hidden" z jakims hashem/tokenem czy jak tam kto woli nazywac. ma to byc jakis unikalny ciag znakow/liczb:
wartosc tego pola zapisujemy do sesji, do cookie, do pliku albo do bazy - jak komu w danej chwili wygodniej/jakie ma mozliwosci. w przypadku zapisu da bazy tabela z postami bedzie miala dodatkowe pole "hash". po kliknieciu F5 (refresh) zostanie wyslany ten sam formularz, czyli dokladnie z tym samym hashem - nie bedzie on od nowa wygenerowany. teraz wystarczy sprawdzic czy dany hash mamy juz w sesji, w bazie, w cookie, w pliku czy gdziekolwiek indziej i problem z powtorzeniem zalatwiony i tutaj juz nie chodzi o sprawdzenie czy to ten sam uzytkownik, to samo IP, ponownie ten sam tekst czy cokolwiek innego - sprawdzamy dokladnie to o co chodzi - czy jest proba ponownego wyslania tego samego formularza. |
|
|
![]()
Post
#35
|
|
Grupa: Zarejestrowani Postów: 18 Pomógł: 4 Dołączył: 13.03.2007 Ostrzeżenie: (0%) ![]() ![]() |
Jeżeli chcemy zrobić to za pomocą sesji to sugerując się wskazówkami be2k możemy to zrobić w następujący sposób:
Dodajemy wpis do formularza pamiętając, że same wywołanie funkcji nie wyświetli danych. Musimy dodać echo:
Funkcja generateHash():
A teraz nasz plik php, który odbiera dane z formularza:
Po odświeżeniu strony jeszcze raz zostaną wysłane wszystkie zmienne z formularza do skryptu. Jeżeli zawartość sesji adduser już istnieje i jest identyczna jak zawartość $_POST['hash']; tzn. że ten formularz był już wysłany. |
|
|
![]()
Post
#36
|
|
Grupa: Zarejestrowani Postów: 79 Pomógł: 3 Dołączył: 23.12.2008 Skąd: Piaseczno Ostrzeżenie: (0%) ![]() ![]() |
hmm... najprościej to chyba przed przetwarzaniem i zapisem danych sprawdzić czy np.
no i oczywiście po zapisaniu danych do bazy ustawiasz $_SESSION['poszlooo']='1' a jak już będzie bezpiecznie to znów zmieniasz wartość na '0' czyli można wysyłać formularz :-) A jeżeli np. ma być jeden komentarz na stronkę przy każdej sesji to można
czy coś podobnego :-) Pozdrawiam Ten post edytował mlattari 27.02.2009, 01:39:42 |
|
|
![]()
Post
#37
|
|
Grupa: Zarejestrowani Postów: 331 Pomógł: 30 Dołączył: 11.11.2008 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
u mnie problem znika wraz z samym tokenem - za każdym razem po wysłaniu skryptu zapisany wcześniej klucz z obrazka antyspamowego jest czyszczony do postaci '', wtedy przy naciśnięciu F5 skrypt wyświetli komunikat z prośbą o przepisanie poprawnego kodu z obrazka, a to oznacza że za pomocom F5 się nie będzie dało zdublować wpisu. Druga rzecz to oczywiście sesja + adresy IP, ale o tym już pisano wyżej ;-)
|
|
|
![]()
Post
#38
|
|
Grupa: Zarejestrowani Postów: 41 Pomógł: 9 Dołączył: 8.02.2009 Ostrzeżenie: (0%) ![]() ![]() |
Hmm jak tak czytam wasze wypowiedzi to o mało nie popadam w paranoję (IMG:style_emoticons/default/blinksmiley.gif) "Czy aby na pewno dobrze to rozwiązałem". Zapisanie w sesji informacji w stylu $_SESSION['poszło']==true sprawdza się jeśli masz tylko jeden formularz a i też nie zawsze bo wystarczy otworzyć stronę z formularzem w nowej zakładce i zmienna zostanie wyczyszczona.
Jak już doszliście do wspólnego wniosku jeśli dane nie są wysyłane do bazy danych sprawa się komplikuje. Pomyślałem więc kiedyś, że wykonam hash md5 z wysłanych danych przez użytkownika i zapiszę w sesji ale jako jedną z wartość tablicy (IMG:style_emoticons/default/winksmiley.jpg) A żeby się nie nazbierało multum kluczy to sesja wygasa po 30 minutach braku aktywności. Czekam na maratończyka co mi serwer zapcha (IMG:style_emoticons/default/aarambo.gif) Dobre jest też rozwiązanie usera powyżej. Skrypt po odświeżeniu zacznie się domagać prawidłowego klucza z obrazka. ... Chociaż po otwarciu w nowej zakładce formularza po wypełnieniu tego pierwszego trzeba będzie odświeżać obrazek itp. itd... Trudno o idioto-odporny program (IMG:style_emoticons/default/sciana.gif) ;P Ten post edytował Thorang Hoog 17.12.2009, 23:32:49 |
|
|
![]()
Post
#39
|
|
Grupa: Zarejestrowani Postów: 71 Pomógł: 1 Dołączył: 14.12.2004 Ostrzeżenie: (0%) ![]() ![]() |
Temat trochę leciwy, ale jako że przyklejony to chyba ważny i swoje 5 groszy do niego też wrzucę.
# Zgadzam się z Wami, że JS to nie rozwiązanie. Z problemem musi sobie radzić skrypt po stronie serwera na wypadek jeżeli JS będzie wyłączone. # Co do unikalności wpisów w bazie. Jest to dodatkowy indeks, dodatkowe obciążenie przy jego przebudowywaniu (pomijając już kwestię miejsca na dysku). Osobiście korzystam z przekierowania zaraz po wysłaniu formularza. Wszelkie komunikaty o powodzeniu/błędach trzymam w jednej zmiennej sesyjnej. |
|
|
![]()
Post
#40
|
|
Grupa: Zarejestrowani Postów: 125 Pomógł: 14 Dołączył: 2.06.2010 Ostrzeżenie: (0%) ![]() ![]() |
Odkopię trochę temat bo i ja zacząłem poszukiwać sposobu na zablokowanie ponownego wysłania danych. Więc opowiem o swoim sposobie jak wykryć, czy strona została odświeżona lub czy ktoś wycofał się na stronę, która również chce ponownie wysłać dane bo takie przypadki wg mnie zdarzają się częściej.
No to to rzeczy: 2. Kolejne to sprawdzam czy dane ciasteczko jest takie same jak zmienna przesłana przez formularz Kod <?php if (!isset($_COOKIE['krok'])) //sprawdzam czy ciasteczko kontrolujące istnieje { setcookie('krok', 0, time()+259200); //jeżeli nie przypisuje mu wartość 0 i ustawiam tam na jakiś okres czasu )czym dłużej tym lepiej) } //jeżeli formularz został wysłany otrzymamy zmienną $_POST['krok'] if ($_COOKIE['krok']==$_POST['krok']) { $refresh='nie';//jeżeli zmienna z formularza jest równa ciasteczku oznacza to, że nie było odświeżenia strony setcookie('krok', $_POST['krok']+1, time()+259200);i ustawiamy wartość ciasteczka o 1 większą } else { $refresh='tak'; } ?> ... //jakiś tam kod html <?php if ($refresh=='nie') //strona nie była odświeżana więc można przesłać dane { echo 'Przesłane dane: '.$_POST['krok']; } else { echo 'strona została odświeżona!!!'; //albo można pominąć blok else } ?> <form action="" method="POST"> <input type="hidden" name="krok" value="'.$_COOKIE['krok'].'">; <input type="text" name="jakiesdane"> <input type="submit"> </form> ... Jedno ciasteczko, a może nadać się na kilku podstronach, bo nawet wycofanie się na stronę, która musi przetworzyć dane nic nie da (IMG:style_emoticons/default/smile.gif) Oczywiście przydało by się by jeszcze strona sprawdzała czy ciasteczka są włączone ps. jest to skrypt, który sam wymyśliłem bo te sposoby, które podawaliście jakąś mi nie pasowały (IMG:style_emoticons/default/smile.gif) skrypt wpisany tutaj został z lekka okrojony od mojego, wprawdzie mówiąc został napisany od nowa i dlatego jakieś literówki mogą się znaleźć (IMG:style_emoticons/default/smile.gif) Ten post edytował radziopoke 7.02.2011, 17:14:41 |
|
|
![]()
Post
#41
|
|
Grupa: Zarejestrowani Postów: 393 Pomógł: 5 Dołączył: 6.02.2003 Skąd: The.Luciferian.Doctrine.p df Ostrzeżenie: (30%) ![]() ![]() |
dorzuce jeszcze do wypowiedzi wszystkich - prosty i oczywisty sposob: blokowanie przycisku submit, po kliknieciu (wymagane dolaczenie biblioteki jquery do kodu)
|
|
|
![]()
Post
#42
|
|
Grupa: Zarejestrowani Postów: 15 Pomógł: 0 Dołączył: 6.06.2011 Ostrzeżenie: (0%) ![]() ![]() |
Stare już, ale dodam od siebie:
(IMG:style_emoticons/default/oneeyedsmiley02.png) dla małych projektów to wystarczy, przy większych sesja się "wypcha". |
|
|
![]()
Post
#43
|
|
Grupa: Zarejestrowani Postów: 342 Pomógł: 23 Dołączył: 20.01.2011 Skąd: Chełm Ostrzeżenie: (0%) ![]() ![]() |
stary temat ale może coś od siebie raz dam
oczywiście jest to troszkę przerobiony pomysł z innego forum ale do dziś stosuję ten wzorek i zapewniam że działa. Z głowy pisałem bo nie chciało mi się po skryptach szukać czy na tym innym forum. |
|
|
![]()
Post
#44
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 1 Dołączył: 19.12.2009 Ostrzeżenie: (0%) ![]() ![]() |
Mam problem przy wysyłaniu takiego formularza z uploadem plików. Po wciśnięciu submit pliki jest przesyłany na serwer i w tym momencie możemy submit kliknąć parę razy, a tym samym zdublować upload. Ma ktoś jakiś pomysł jak temu zapobiec?
|
|
|
![]()
Post
#45
|
|
Grupa: Zarejestrowani Postów: 2 958 Pomógł: 574 Dołączył: 23.09.2008 Skąd: wiesz, że tu jestem? Ostrzeżenie: (0%) ![]() ![]() |
Ten post edytował CuteOne 16.03.2013, 21:02:27 |
|
|
![]()
Post
#46
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 1 Dołączył: 19.12.2009 Ostrzeżenie: (0%) ![]() ![]() |
Dzięki @CuteOne, pomogło.
|
|
|
![]()
Post
#47
|
|
Grupa: Zarejestrowani Postów: 4 Pomógł: 0 Dołączył: 31.03.2013 Ostrzeżenie: (0%) ![]() ![]() |
Mam podobny problem z powtarzaniem wpisów. Gdzie i co trzeba wpisać aby było ok? Headera nie mam jeszcze więc jeśli to pomoże powiedzcie gdzie i jak. Dopiero zaczynam PHP więc proszę o wyrozumiałość.
|
|
|
![]()
Post
#48
|
|
Grupa: Zarejestrowani Postów: 516 Pomógł: 63 Dołączył: 27.08.2012 Ostrzeżenie: (0%) ![]() ![]() |
odgrzewam kotleta.
co do @up. to po 17stej linijce. czyli robisz header location po zapisie do bazy. Co do całego tematu, to nie wierze w to co tutaj przeczytałem... Po przeczytaniu waszych wypocin stwierdzam, ze sens w tym temacie jest tylko jeden, to idealny przykład na to jak ludzie szukają dziury w całym. kurna, jakieś funkcje, ciastka, sesje, bazy danych... ja pierdziele uwaga, podaje jedyne słuszne rozwiązanie :
niesamowite co ? |
|
|
![]()
Post
#49
|
|
Grupa: Zarejestrowani Postów: 2 355 Pomógł: 533 Dołączył: 15.01.2010 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
Niesamowitą głupotę, to napisałeś, co najwyżej. Po drugie, nie każdy chce robić przekierowanie.
Ten post edytował Damonsson 20.06.2013, 10:41:02 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 24.08.2025 - 17:48 |