Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Formularz + antyflood
Forum PHP.pl > Forum > Przedszkole
misieqq
Witam.
Mam skrypcik formularza zapisującego dane do pliku

  1. <?php
  2.  
  3. $pole1 = trim($_POST['pole1']);
  4.  
  5. if(empty($pole1) and empty($pole2)) {
  6.  
  7. echo '<form action="" method="post">
  8.  
  9. <input type="text" name="pole1" style="width: 300px;" /><br />
  10.  
  11. <input type="submit" value="Wyslij" />
  12. </form>';
  13. }
  14. else {
  15.  
  16. // dane pochodz&sup1;ce z formularza
  17. $dane = $pole1.", "."\n";
  18. // przypisanie zmniennej $file nazwy pliku
  19. $file = "baza.txt";
  20. // uchwyt pliku, otwarcie do dopisania
  21. $fp = fopen($file, "a");
  22. // blokada pliku do zapisu
  23. flock($fp, 2);
  24. // zapisanie danych do pliku
  25. fwrite($fp, $dane);
  26. // odblokowanie pliku
  27. flock($fp, 3);
  28. // zamkni&ecirc;cie pliku
  29. fclose($fp);
  30.  
  31. echo "dane zostały zapisane ";
  32.  
  33.  
  34. }
  35. ?>


(skrypt miał dwa pola ale ja zmieniłem tak, że teraz jest jedno, metodą prób i błędów ;p - proszę nie bić.)
Jestem zielony z php i mam pytanko jak poprawnie dodac do tego skryptu zabezpieczenie antyfloodowe, żeby użytkownik mogł cos do formularza wpisywać np raz na 10min questionmark.gif
Z góry dziękuję za odpowiedzi.
Pozdrawiam
black.old.cat
  1. <?php
  2. // Sprawdzamy czy aktualny czas jest "mniejszy" niz czas w pliku.
  3. // Jezeli tak to wyswietlamy krotki komunikat i konczymy wykonywanie skryptu.
  4. if(@file_get_contents('antyflood.txt') > time())
  5. {
  6. echo 'Formularz zostal zablokowany na kilka min.';
  7. }
  8.  
  9. $pole1 = trim($_POST['pole1']);
  10. if(empty($pole1) and empty($pole2))
  11. {
  12. echo '<form action="" method="post">
  13. <input type="text" name="pole1" style="width: 300px;" /><br />
  14. <input type="submit" value="Wyslij" />
  15. </form>';
  16. }
  17. else
  18. {
  19. $dane = $pole1.", "."\n";
  20. $file = "baza.txt";
  21. $fp = fopen($file, "a");
  22. flock($fp, 2);
  23. fwrite($fp, $dane);
  24. flock($fp, 3);
  25. fclose($fp);
  26. echo "dane zostaly zapisane ";
  27.  
  28. // Zapisujemy do pliku aktualny czas + czas zablokowania formularza (w sekundach).
  29. file_put_contents('antyflood.txt', time()+600);
  30. }
  31. ?>
misieqq
dzięki za odpowiedź ale cos nie dziala jak należy. ustawiam czas na 60 sek, gdy wpisuje cos, dane sie zapisują ale gdy proboje za minute dalej pisze, ze formularz jest zablokowany, po 10min jest to samo. a w pliku antylfood txt zamiast 60 pojawia sie 1257793244 dry.gif
Blame
Poczytaj sobie o funkcji time. Gwarantuje ci, że będziesz wiedział skąd to 1257793244. Usuń tłumienie błędów czyli tą małpę przed file_get_contest i zobacz co się dzieje.
misieqq
no dalej nie dziala sad.gif
potreb
A nie lepiej to zrobić w sesji, zauważ że file_put_contents tworzy plik u ciebie na serwie, także jeżeli plik zostanie utworzony, przy okazji zostanie zablokowana możliwość wysyłania innemu użytkownikowi, także rozwiązanie z sesjami jest jak najbardziej okey lub cookies. Oczywiście też to rozwiązanie ma minusy, jednak wydaje się być najlepsze.

Najlepiej jak po wypełnieniu formularza wyślesz ciasteczko + lifetime 10 minut i później sprawdzisz tylko czy istnieje. Najszybsza metoda.
misieqq
Cytat(potreb @ 9.11.2009, 22:27:16 ) *
A nie lepiej to zrobić w sesji, zauważ że file_put_contents tworzy plik u ciebie na serwie, także jeżeli plik zostanie utworzony, przy okazji zostanie zablokowana możliwość wysyłania innemu użytkownikowi,

wlasnie to zauwazylem przed chwilą. Tylko mozesz mi napisac jak mam te sesje zrobic ;p
Fifi209
Metoda z cookie - najszybsza? Chyba najprostsza do złamania, nie widzę żadnych plusów tej metody.

@topic
Zapisuj wszystko w sesji do tego została tworzona. Ew. jeżeli masz tam logowanie to dla konkretnego użytkownika (np. w bazie)
misieqq
zadnego logowania nie mam jak juz pisalem jestem zielony z php i nie myslalem, ze z tym bedzie tyle problemów.
Jak zrobic to zapisywanie do sesji questionmark.gif
Fifi209
Może najpierw przeczytać co to są sesje i jak z tego korzystać ?
http://pl.wikibooks.org/wiki/PHP/Sesje
http://www.php.net/manual/en/book.session.php

Tutaj gotowca nie dostaniesz, to nie ten dział, tutaj możesz się tylko czegoś nauczyć.
potreb
Cytat(fifi209 @ 9.11.2009, 22:32:29 ) *
Metoda z cookie - najszybsza? Chyba najprostsza do złamania, nie widzę żadnych plusów tej metody.


Oczywiście, że tak, tylko nie przesadzajmy z super zabezpieczaniami. Zwykły user nie będzie usuwał cookiesa, bo nie wie co to, a już taki fifi mógłby kombinować, dwa sesję też można obejść, restart przegladarki.
Fifi209
Cytat(potreb @ 9.11.2009, 22:39:56 ) *
Oczywiście, że tak, tylko nie przesadzajmy z super zabezpieczaniami. Zwykły user nie będzie usuwał cookiesa, bo nie wie co to, a już taki fifi mógłby kombinować, dwa sesję też można obejść, restart przegladarki.

Dlatego najlepiej mieć użytkowników, którzy się muszą logować i poprzez odpowiednie zapytania manipulować na danych w bazie.
misieqq
wiec postanowilem zrobic formularz który jako zabezpieczenie bedzie mial obrazki captcha. wszystko zrobilem wedle instrukcji lecz nie wyswietlają mi się te obrazki tylko jest puste pole.

  1.  
  2. <?php
  3. if (!$_POST)
  4. {
  5. // prosty formularz zawierający dwa pola
  6. echo '<form action="" method="post" form name="form1">
  7.  
  8. <input class="mail" name="pole1" type="text"/>
  9. <img id="captcha" src="/securimage/securimage_show.php" alt="CAPTCHA Image">
  10. <input type="text" name="captcha_code" size="10" maxlength="6">
  11.  
  12. <input type="submit" value="Wyślij">
  13. </p>
  14. </form>';
  15. }
  16. else
  17. {
  18. include_once $_SERVER['DOCUMENT_ROOT'] . '/securimage/securimage.php';
  19.  
  20. $securimage = new Securimage();
  21. if ($securimage->check($_POST['captcha_code']) == false)
  22. {
  23. // the code was incorrect
  24. // handle the error accordingly with your other error checking
  25.  
  26. // or you can do something really basic like this
  27. die('The code you entered was incorrect. Go back and try again.');
  28. }
  29.  
  30. $pole1 = strip_tags(trim($_POST['pole1']));
  31.  
  32.  
  33. // dane pochodzące z formularza
  34. $dane = $pole1."\n";
  35. // przypisanie zmniennej $file nazwy pliku
  36. $file = "baza.txt";
  37. // uchwyt pliku, otwarcie do dopisania
  38. $fp = fopen($file, "a");
  39. // blokada pliku do zapisu
  40. flock($fp, 2);
  41. // zapisanie danych do pliku
  42. fwrite($fp, $dane);
  43. // odblokowanie pliku
  44. flock($fp, 3);
  45. // zamknięcie pliku
  46. fclose($fp);
  47.  
  48. echo "Dane zostały zapisane!<br />";
  49. echo "text2<br />";
  50. }
  51. ?>
  52.  
potreb
A masz poprawnie ustawione ścieżki??
Twój przykład został żywcem ściągnięty od julka, ale nie wiem czy masz pliki php dla captychy, które trzeba includować, domyślam się że nie.
Także masz tutaj stronę: http://www.phpcaptcha.org/documentation/quickstart/ gdzie masz pliki captchy.
Zreszta twój problem jest z floodowaniem, a nie z captchą, tak??
Taifun
bez captchy jest floodowanie czyli są powiązane.
potreb
Cytat(Taifun @ 10.11.2009, 19:06:50 ) *
bez captchy jest floodowanie czyli są powiązane.


W jakimś sensie tak, ale przydałoby się do tej captchy dać jakiś timelimit, żeby był to antyflood
misieqq
nie jestem az taki głupi zeby tych plików nie sciągnąc. Pliki sa na serwerze i scieżki są poprawne..
potreb
  1. <?php
  2. if (!$_POST)
  3. {
  4. // prosty formularz zawierający dwa pola
  5. echo '<form action="" method="post" form name="form1">
  6.  
  7. <input class="mail" name="pole1" type="text"/>
  8. <img id="captcha" src="securimage/securimage_show.php" alt="CAPTCHA Image">
  9. <input type="text" name="captcha_code" size="10" maxlength="6">
  10.  
  11. <input type="submit" value="Wyślij">
  12. </p>
  13. </form>';
  14. }
  15. if (!isset($_POST))
  16. {
  17. include_once 'securimage/securimage.php';
  18.  
  19. $securimage = new Securimage();
  20. if ($securimage->check($_POST['captcha_code']) == false)
  21. {
  22. // the code was incorrect
  23. // handle the error accordingly with your other error checking
  24.  
  25. // or you can do something really basic like this
  26. die('The code you entered was incorrect. Go back and try again.');
  27. }
  28.  
  29. $pole1 = strip_tags(trim($_POST['pole1']));
  30.  
  31.  
  32. // dane pochodzące z formularza
  33. $dane = $pole1."\n";
  34. // przypisanie zmniennej $file nazwy pliku
  35. $file = "baza.txt";
  36. // uchwyt pliku, otwarcie do dopisania
  37. $fp = fopen($file, "a");
  38. // blokada pliku do zapisu
  39. flock($fp, 2);
  40. // zapisanie danych do pliku
  41. fwrite($fp, $dane);
  42. // odblokowanie pliku
  43. flock($fp, 3);
  44. // zamknięcie pliku
  45. fclose($fp);
  46.  
  47. echo "Dane zostały zapisane!<br />";
  48. echo "text2<br />";
  49. }
  50. ?>


Folder securimage musi być w tym samym katalogu co skrypt. Nie wiem, którą wersję PHPCaptchy masz, ale zastosowanie robiłem dla Version 1.0.3.1 (Mar 23, 2008), czyli ta starsza.
misieqq
dzięki za pomoc ale od 2 godzin proboję cos wykombinowac zeby ten skrypt dzialal jak należy i mi nie wychodzi. Niby obrazki się teraz pokazują ale jak klikne wyślij to tak jak by skrypt się zatrzymywal bo nie pojawia sie zaden komunikat i nic sie nie zapisuje do pliku ;[
potreb
Jeżeli się zatrzymuje, daj jakies echo po die, jeżeli nic się nie wyświetli tzn że warunek nie jest spełniony.
misieqq
dalem i dalej nic

ktoś pomoże questionmark.gif
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.