PageRenderTime 56ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 0ms

/upload/libs/exaBD.php

http://gesior-aac.googlecode.com/
PHP | 157 lines | 104 code | 22 blank | 31 comment | 33 complexity | 53174f2a10b56d440c90bd1d9d73b68b MD5 | raw file
Possible License(s): GPL-3.0, LGPL-2.1
  1. <?php
  2. /*
  3. exaBotDefender 1.0
  4. http://www.web6.pl/exaBotDefender/
  5. Skrypt na licencji GPL
  6. Pomoc przy konfiguracji i administracji VPS: http://vps.web6.pl/
  7. */
  8. # KONRFIGURACJA:
  9. /**
  10. Miejsce zapisywania logow przez skrypt. Katalog ten wraz ze wszystkimi
  11. podkatalogami musi miec nadane uprawnienia do zapisu. Skrypt automatycznie
  12. czy?ci zawarto?? tego katalogu raz na 24 godziny.
  13. */
  14. if(empty($bd_save_dir))
  15. $bd_save_dir = './bdsave/';
  16. /** Maksymalna ilosc wywolan skryptu w czasie 30 sekund przez dane IP. */
  17. $bd_xlimit['users'] = 20; // dla uzytkownikow przegladajacych strone
  18. /** Czas blokady dostepu do strony w sekundach */
  19. $bd_lock_time = 300;
  20. /** Komunikat blokady */
  21. $bd_page_blocked = 'exaBotDefender. Access to site blocked for 5 minutes for your IP address.';
  22. # KONIEC KONFIGURACJI
  23. #####################################
  24. // jezeli ktos szuka include buga blokujemy dzialanie skryptu
  25. if(!empty($_SERVER['REQUEST_URI']) && strstr($_SERVER['REQUEST_URI'], 'http://') !== false)
  26. die('exaBotDefender. STOP');
  27. // dla potencjalnych botow google, yahoo i msn - przenioslem to tu, bo nie ma sensu zmieniac tej wartosci
  28. $bd_xlimit['searchbots'] = 40;
  29. // czas zbierania danych (domyslnie 30 sekund)
  30. $bd_check_interval = 5;
  31. // ilosc katalogow - uwaga, kolejne kataogi nalezy najpierw utworzyc recznie
  32. $bd_dirs = 10;
  33. $ip_part = (int)($_SERVER['REMOTE_ADDR']{0}.$_SERVER['REMOTE_ADDR']{1});
  34. $UA = !empty($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : false;
  35. // proba google || yahoo || msn
  36. if($ip_part > 62 && $ip_part < 75 && $UA && (
  37. strstr($UA, 'Google') !== false || strstr($UA, 'Yahoo') !== false || strstr($UA, 'msnbot') !== false
  38. )){
  39. $bd_limit = $bd_xlimit['searchbots'];
  40. }
  41. else{
  42. $bd_limit = $bd_xlimit['users'];
  43. }
  44. $now = time();
  45. $bd_lock_stop = false;
  46. $bd_subdir = (abs(ip2long($_SERVER['REMOTE_ADDR']))%$bd_dirs + 1) . '/';
  47. $bd_chckfile = $bd_save_dir.$bd_subdir.$_SERVER['REMOTE_ADDR'];
  48. if(file_exists($bd_chckfile.'.lock')){
  49. $f_time = (int)file_get_contents($bd_chckfile.'.lock');
  50. // jezeli limit wygasl
  51. if($now > $f_time){
  52. @ unlink($bd_chckfile.'.lock');
  53. @ unlink($bd_chckfile);
  54. }
  55. else
  56. $bd_lock_stop = true;
  57. }
  58. if(!$bd_lock_stop){
  59. $TimeToLimit = $bd_check_interval / $bd_limit;
  60. $new_file = true;
  61. if(file_exists($bd_chckfile)){
  62. $fdata = explode(',',file_get_contents($bd_chckfile));
  63. $f_count = (int)$fdata[0] + 1;
  64. $f_time = (int)$fdata[1];
  65. $f_last_time = (int)$fdata[2];
  66. $new_file = false;
  67. // jezeli przekroczono limi wejsc oraz stosunek czas/wejsc jest za maly (<$TimeToLimit)
  68. if($f_count > $bd_limit && (($now - $f_time)/$f_count < $TimeToLimit)) {
  69. // zalozenie locka
  70. if(($fp = @fopen($bd_chckfile.'.lock', 'w')) && flock($fp, LOCK_EX)){ // do an exclusive lock
  71. fwrite($fp, ($now + $bd_lock_time));
  72. flock($fp, LOCK_UN); // release the lock
  73. fclose($fp);
  74. // log zapisujacy fakt zablokowania bota
  75. if(($fp = @fopen($bd_save_dir.'locklog.txt', 'a')) && flock($fp, LOCK_EX)){ // do an exclusive lock
  76. fwrite($fp, date('Y-m-d H:i:s') . ' ' . $_SERVER['REMOTE_ADDR'] . "\n");
  77. flock($fp, LOCK_UN); // release the lock
  78. fclose($fp);
  79. }
  80. }
  81. $bd_lock_stop = true;
  82. }
  83. // zerujemy limit
  84. elseif(($f_last_time + $bd_check_interval) < $now){
  85. $new_file = true;
  86. }
  87. // zapisujemy zmiany do pliku
  88. else{
  89. if(($fp = @fopen($bd_chckfile, 'w')) && flock($fp, LOCK_EX)){ // do an exclusive lock
  90. fwrite($fp, $f_count.','.$f_time.','.$now);
  91. flock($fp, LOCK_UN); // release the lock
  92. fclose($fp);
  93. }
  94. }
  95. }
  96. if($new_file){
  97. if(($fp = @fopen($bd_chckfile, 'w')) && flock($fp, LOCK_EX)){ // do an exclusive lock
  98. fwrite($fp, '1,'.$now.','.$now);
  99. flock($fp, LOCK_UN); // release the lock
  100. fclose($fp);
  101. }
  102. elseif(!is_writable($bd_save_dir.$bd_subdir))
  103. die('exaBotDefender blad: nadaj uprawnienia zapisu dla' . $bd_save_dir.$bd_subdir);
  104. }
  105. }
  106. if($bd_lock_stop === true)
  107. die($bd_page_blocked);
  108. // Czyszczenie wszystkich statystyk raz na 24 godzny
  109. if($f = @ fopen($bd_save_dir.'day.dat', 'r')){
  110. $f_date = chop(fgets($f, 5));
  111. fclose($f);
  112. }
  113. else
  114. $f_date = 0;
  115. $today = date('d');
  116. // warunek wykona sie raz na 24 godziny
  117. if($f_date != $today){
  118. for($i = 1; $i <= $bd_dirs; $i++){
  119. $dir = $bd_save_dir.$i.'/';
  120. if($dh = opendir($dir)){
  121. while(($file = readdir($dh)) !== false)
  122. if($file{0} != '.')
  123. @ unlink($dir.$file);
  124. closedir($dh);
  125. }
  126. }
  127. if($f = @ fopen($bd_save_dir.'day.dat', 'w')){
  128. fputs($f, $today);
  129. fclose($f);
  130. }
  131. else
  132. die('exaBotDefender blad: nadaj uprawnienia zapisu dla' . $bd_save_dir);
  133. }
  134. ?>