Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Blokada dodawania wpisu.
Forum PHP.pl > Forum > PHP
moto0095
Witam. Szukam w google i nic nie mogę znaleźć.
Więc mój problem wygląda tak że mam sobie skrypt komentarzy [ oparty na plikach *.txt ] i ostatnio pojawili się SPAMERZY.
I mam takie pytanie jak zablokować (zbanować) IP ale tylko np na 5 min questionmark.gif
Albo czego mam w google szukaćquestionmark.gif
smile.gif
tehaha
zapisujesz w bazie numer IP oraz czas, a potem sprawdzasz czy w tabli istnieje rekord z takim numer IP oraz czasem większym niż 5min temu

czyli masz tabelę np. check_spam z kolumnami:
Id INT
IP varchar
date datetime

i potem robisz zapytanie
  1. $time = date("Y-m-d H:i:s", strtotime("-5 min"));

  1. SELECT id FROM check_spam WHERE ip =$ip AND date > $time
moto0095
A dało by się aby IP zapisywały się w pliku *.txt.

Bo znalazłem coś takiego
  1. oj mam coś lepszego Roberto..
  2. Jest to skrypt pozwalający zbanować ip z panelem administratora (który jak narazie pozwala jednak jedynie na dodanie ip do listy zbanowanych, lecz wkrótce sie to zmieni, znaczy sie dopisze resztę),
  3. plik banned.php - jest to własnie skrypt pozwalający dodawac numery IP do listy, umieść go gdzieś w Panelu Administracyjnym na swojej stronie:
  4.  
  5. <?php
  6. if(isset($_GET['numery']) && $_GET['numery']=='dopisz'){
  7. $plik = fopen("ban.txt", "w");
  8. $ip = $_POST['ip'];
  9. fputs($plik, $ip);
  10. fclose;
  11. echo '<a href="index.php">PRZEJDŹ DO STRONY GŁÓWNEJ</a>';
  12. }else {
  13. echo '<b>DODAJ NUMER IP DO LISTY ZBANOWANYCH</b><br>';
  14. echo '<form method="POST" action="banned.php?numery=dopisz">
  15. <table border="0" width="100%">
  16. <tr>
  17. <td>Numer:</td>
  18. <td><input type="text" name="ip" size="64"></td>
  19. </tr>
  20. <tr>
  21. <td> </td>
  22. <td><input type="submit" value="DODAJ"></td>
  23. </tr>
  24. </table>
  25. </form>';}
  26. ?>
  27.  
  28. plik ban.txt - zostawiasz pusty
  29. plik ip.php - skrypt sprawdza czy dany ip wystepuje na liscie, jesli tak to zabrania dostepu
  30.  
  31. <?php
  32. global $_SERVER;
  33. $ip = file('ban.txt');
  34. foreach($ip as $v){
  35. if(trim($v) == $_SERVER['REMOTE_ADDR']){
  36. die("JESTEŚ ZBANOWANY!!");
  37. } }
  38. ?>
  39.  
  40. aby uniemozliwic dostep do twojej strony podanym numerom ip na swojej stronie musisz dodac:
  41.  
  42. include "ip.php";
  43.  
  44. Mam nadzieje ze skrypt sie przyda, jak bedą pozytywne opinie to dorobię jeszcze funkcje usuwania wybranego ip z listy... oj mam coś lepszego Roberto..
  45. Jest to skrypt pozwalający zbanować ip z panelem administratora (który jak narazie pozwala jednak jedynie na dodanie ip do listy zbanowanych, lecz wkrótce sie to zmieni, znaczy sie dopisze resztę),
  46. plik banned.php - jest to własnie skrypt pozwalający dodawac numery IP do listy, umieść go gdzieś w Panelu Administracyjnym na swojej stronie:
  47.  
  48. <?php
  49. if(isset($_GET['numery']) && $_GET['numery']=='dopisz'){
  50. $plik = fopen("ban.txt", "w");
  51. $ip = $_POST['ip'];
  52. fputs($plik, $ip);
  53. fclose;
  54. echo '<a href="index.php">PRZEJDŹ DO STRONY GŁÓWNEJ</a>';
  55. }else {
  56. echo '<b>DODAJ NUMER IP DO LISTY ZBANOWANYCH</b><br>';
  57. echo '<form method="POST" action="banned.php?numery=dopisz">
  58. <table border="0" width="100%">
  59. <tr>
  60. <td>Numer:</td>
  61. <td><input type="text" name="ip" size="64"></td>
  62. </tr>
  63. <tr>
  64. <td> </td>
  65. <td><input type="submit" value="DODAJ"></td>
  66. </tr>
  67. </table>
  68. </form>';}
  69. ?>
  70.  
  71. plik ban.txt - zostawiasz pusty
  72. plik ip.php - skrypt sprawdza czy dany ip wystepuje na liscie, jesli tak to zabrania dostepu
  73.  
  74. <?php
  75. global $_SERVER;
  76. $ip = file('ban.txt');
  77. foreach($ip as $v){
  78. if(trim($v) == $_SERVER['REMOTE_ADDR']){
  79. die("JESTEŚ ZBANOWANY!!");
  80. } }
  81. ?>
  82.  
  83. aby uniemozliwic dostep do twojej strony podanym numerom ip na swojej stronie musisz dodac:
  84.  
  85. include "ip.php";
  86.  
  87. Mam nadzieje ze skrypt sie przyda, jak bedą pozytywne opinie to dorobię jeszcze funkcje usuwania wybranego ip z listy...


tylko że to blokuje na stałe.
Jak przerobić to aby blokowało na 5 min a nie na zawsze.

questionmark.gif
tehaha
no ale ten skrypt to zajmie kilka linijek więc nie wiem po co Ci gotowiec, lepiej by było na bazie danych ale skoro jej nie chcesz to zapisuj do pliku IP i czas np. w formacie

IP-czas

potem jak sprawdzasz każdąlinjkę dajesz explode na '-' i patrzysz czy jest linijka gdzie jest taki numer IP i czas większy niż 5min temu

czyli wiersz możesz zapisać czymś takim:
  1. $row = $_SERVER['REMOTE_ADDR']."-".date("Y-m-d H:i:s", time());


a potem przy analizowaniu każdej linijki sprawdzasz czymś takim (pisane na kolanie):
  1. $time_5_min_ago = date("Y-m-d H:i:s", strtotime("-5 min"));
  2.  
  3. $rows = explode("\n", $file);
  4.  
  5. foreach($rows as $value)
  6. {
  7. $one_row = explode('-', $value);
  8.  
  9. if($one_row[0] == $_SERVER['REMOTE_ADDR'] && $one_row[1] > $time_5_min_ago)
  10. {
  11. echo "Komentować można tylko raz na 5min.";
  12. }
  13. }
moto0095
Zrobiłem coś takiego ale nie działa sad.gif
Nie wyświetla się żaden błąd, ale też nie zapisuje do pliku.
  1. <?php
  2. $pole1 = trim($_POST['pole1']);
  3. $pole2 = trim($_POST['pole2']);
  4.  
  5. $file = "fip.txt";
  6. $time_5_min_ago = date("Y-m-d H:i:s", strtotime("-5 min"));
  7. $rows = explode("\n", $file);
  8.  
  9.  
  10. if(empty($pole1) and empty($pole2)) {
  11.  
  12. // prosty formularz zawierający dwa pola
  13. echo '<form action="?dod" method="post">
  14. <input type="text" name="pole1" style="width: 200px;" /><br />
  15. <textarea name="pole2" style="width: 200px; height: 100px;">
  16. </textarea><br />
  17. <input type="submit" value="Zapisz" />
  18. </form>';
  19. }else
  20. if(isset($_GET['dod'])){
  21.  
  22. foreach($rows as $value)
  23. {
  24. $one_row = explode('-', $value);
  25. if($one_row[0] == $_SERVER['REMOTE_ADDR'] && $one_row[1] > $time_5_min_ago)
  26. {
  27. echo "Komentować można tylko raz na 5min.";
  28. }
  29. }
  30. }else{
  31. $dane = $_SERVER['REMOTE_ADDR']."-".date("Y-m-d H:i:s", time())."-".$pole1."-".$pole2."\n";
  32. $file = "fip.txt";
  33. $fp = fopen($file, "a");
  34. flock($fp, 2);
  35. fwrite($fp, $dane);
  36. flock($fp, 3);
  37. fclose($fp);
  38.  
  39. echo "Dane zostały zapisane!<br />";
  40. echo "<a href=\"podglad.php\">Zobacz wpisane dane</a>";
  41. }
  42. ?>



questionmark.gifquestionmark.gif

Ja nie wiem gdzie jest błąd sad.gif.

questionmark.gifquestionmark.gif
tehaha
wiesz nie mam dużego doświadczenia na plikach bo zawsze bazy używam, ale wydaje mi się, że w linijkach 5,6 plik najpierw trzeba otworzyć i odczytać przy pomocy funkcji fopen() czyli w linijce 5:
  1. $file = fopen('fip.txt', 'r') or die("Nie udało się otworzyć pliku");


a czy dane są zapisywane poprawnie do pliku?
moto0095
Tak, zapis jest poprawny smile.gif

Niestety nadal nie działa sad.gif.
tehaha
ok to spróbuj z tą funkcją fopen, może nawet od razu po otworzeniu spróbuj go wyświetlić czy coś żeby upewnić się czy w ogóle jest otwierany a jak już to będzie działać to wtedy będzie można analizować dane w nim zapisane
moto0095
Samo zapisywanie, bez tej funkcji blokady IP działa be zarzutu i nie wiem co jest nie tak sad.gif.
Ale jeszcze coś pokombinuję.
tehaha
no tak ale musisz ustalić w którym miejscu coś nie działa np. spróbuj dać
  1. print_r($rows);
w 8 linijce żeby zobaczyć czy plik otwiera jak tu jest ok, to lecisz dalej robisz to samo z $one_row żeby zobaczyć czy tam wszystko jest ok i tak aż do momentu kiedy zlokalizujesz błąd i go naprawisz
moto0095
Pokazało się: Array ( [0] => Resource id #6 )

sad.gif

A jest jakiś inny sposób bez MySQL aby zablokować IP na 5 min.questionmark.gifquestionmark.gif
AndyPSV
zapisuj w bazie danych!
pliki .txt sa zbyt wolne
mortus
Prześledź ten kod i zobacz, co zmieniłem (podświetlone wiersze)
[PHP] blokada.php - pobierz, plaintext
  1. <?php
  2. $pole1 = isset($_POST['pole1']) ? trim($_POST['pole1']) : '';
  3. $pole2 = isset($_POST['pole2']) ? trim($_POST['pole2']) : '';
  4.  
  5. if(file_exists("fip.txt")) $file = file("fip.txt");
  6. $time_5_min_ago = date("Y-m-d H:i:s", strtotime("-5 min"));
  7. // $rows = explode("\n", $file);
  8.  
  9.  
  10. if (empty($pole1) && empty($pole2)) {
  11.  
  12. // prosty formularz zawierający dwa pola
  13. echo '<form action="?dod" method="post">
  14. <input type="text" name="pole1" style="width: 200px;"/><br/>
  15. <textarea name="pole2" style="width: 200px; height: 100px;">
  16. </textarea><br/>
  17. <input type="submit" value="Zapisz" />
  18. </form>';
  19. } else
  20. if (isset($_GET['dod'])) {
  21.  
  22. if(isset($file)) { foreach ($file as $value)
  23. {
  24. $one_row = explode('`', $value);
  25. if ($one_row[0] == $_SERVER['REMOTE_ADDR'] && strtotime($one_row[1]) > strtotime($time_5_min_ago))
  26. {
  27. echo "Komentować można tylko raz na 5min.";
  28. }
  29. } }
  30. // } else {
  31. $dane = $_SERVER['REMOTE_ADDR']."`".date("Y-m-d H:i:s", time())."`".$pole1."`".$pole2."\n";
  32. $file = "fip.txt";
  33. $fp = fopen($file, "a");
  34. flock($fp, 2);
  35. fwrite($fp, $dane);
  36. flock($fp, 3);
  37. fclose($fp);
  38.  
  39. echo "Dane zostały zapisane!<br />";
  40. echo "<a href=\"index.php\">Zobacz wpisane dane</a>";
  41. }
  42. ?>
[PHP] blokada.php - pobierz, plaintext
Po co te zmiany?
moto0095
Wielkie dzięki mortus. Wszystko działa smile.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.