ShareCode PHP hạn chế tấn công DDOS

10 bài đăng
04.01.2018 / 21:40
hanhphucao
Bài đăng: 2470
Admin
Admin là người tận tâm và luôn hành xử đúng mực.

Một bạn trong diễn đàn nhờ nên mình viết luôn một bài để ai cần vào tham khảo. Nói trước là code hoàn toàn tách từ JohnCMS không thêm bất cứ dòng code nào (căn bản nó khá hoàn chỉnh xét theo kiểu chống đơn giản :D ) nên nếu ai vọc JohnCMS nhiều sẽ thấy quen. Bạn nào không dùng JohnCMS có thể tham khảo hoặc copy, còn ai đang dùng thì ngồi xem, tìm hiểu code :D

Code: Code PHP hạn chế ảnh hưởng của tấn công ddos tách từ JohnCMS.

[IMAGE]

Hướng dẫn:

- Tạo file core.php

- Dán code dưới vào. Lưu lại.

- Tạo đường dẫn: root\files\system\cache\ip_flood.dat. ip_flood.dat là file nhé.

- Thêm require_once('core.php'); vào tất cả các file để hạn chế ảnh hưởng do ddos :lol:

PHP
  1. <?php
  2. error_reporting(E_ALL ^ E_WARNING);
  3. define('ROOTPATH', dirname(__FILE__) . DIRECTORY_SEPARATOR);
  4. class core
  5. {
  6. public static $ip; // Biến địa chỉ IP
  7. public static $ip_via_proxy = 0; // Biến địa chỉ IP tĩnh
  8. public static $ip_count = array(); // Đếm số địa chỉ IP
  9.  
  10. private $flood_chk = 1; // Enabling - Disabling IP in flood
  11. private $flood_interval = '60'; // The time interval in seconds
  12. private $flood_limit = '120'; // The number of requests allowed per interval
  13.  
  14. function __construct()
  15. {
  16. $ip = ip2long($_SERVER['REMOTE_ADDR']) or die('Invalid IP');
  17. self::$ip = sprintf("%u", $ip);
  18.  
  19. if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && preg_match_all('#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#s', $_SERVER['HTTP_X_FORWARDED_FOR'], $vars)) {
  20. foreach ($vars[0] AS $var) {
  21. $ip_via_proxy = ip2long($var);
  22. if ($ip_via_proxy && $ip_via_proxy != $ip && !preg_match('#^(10|172\.16|192\.168)\.#', $var)) {
  23. self::$ip_via_proxy = sprintf("%u", $ip_via_proxy);
  24. break;
  25. }
  26. }
  27. }
  28.  
  29. $this->ip_flood();
  30. }
  31.  
  32. function ip_flood()
  33. {
  34. if ($this->flood_chk) {
  35. $file = ROOTPATH . 'files/system/cache/ip_flood.dat';
  36. $tmp = array();
  37. $requests = 1;
  38. if (!file_exists($file)) $in = fopen($file, "w+");
  39. else $in = fopen($file, "r+");
  40. flock($in, LOCK_EX) or die("Cannot flock ANTIFLOOD file.");
  41. $now = time();
  42. while ($block = fread($in, 8)) {
  43. $arr = unpack("Lip/Ltime", $block);
  44. if (($now - $arr['time']) > $this->flood_interval) continue;
  45. if ($arr['ip'] == self::$ip) $requests++;
  46. $tmp[] = $arr;
  47. self::$ip_count[] = $arr['ip'];
  48. }
  49. fseek($in, 0);
  50. ftruncate($in, 0);
  51. for ($i = 0; $i < count($tmp); $i++) fwrite($in, pack('LL', $tmp[$i]['ip'], $tmp[$i]['time']));
  52. fwrite($in, pack('LL', self::$ip, $now));
  53. fclose($in);
  54. if ($requests > $this->flood_limit) {
  55. die('FLOOD: exceeded limit of allowed requests');
  56. }
  57. }
  58. }
  59. }
  60. new core;
  61. ?>

Lưu ý: Dành cho mấy thanh niên ATSM, đây code hạn chế, nói theo thực tế thì hạn chế xử lý các lệnh bên dưới gây ngốn băng thông và hạn chế việc xử lý quá nhiều yêu cầu khi mà không cần thiết (vì tấn công ddos thì không việc gì phải xử lý cả :D ). Mấy hosting cùi cùi mà bảo là chống ddos (ddos kiểu f5 thì may ra :D ), hay test botnet thì không nên thử, die nhé :D

Chúc các bạn thành công!

Đã chỉnh sửa. hanhphucao (05.01.2018 / 23:42)
04.01.2018 / 21:44
VinaDP
Bài đăng: 627
Member

Muốn học hỏi mà nhìn code trên hết muốn học :yao:

04.01.2018 / 21:51
hanhphucao
Bài đăng: 2470
Admin
Admin là người tận tâm và luôn hành xử đúng mực.
VinaDP đã viết

Muốn học hỏi mà nhìn code trên hết muốn học :yao:

Cứ từ từ mà ngâm =))

04.01.2018 / 22:12
VinaDP
Bài đăng: 627
Member

Đã chèn vào wap, hy vọng nó hoạt động tốt :)

04.01.2018 / 23:38
Ply24
Bài đăng: 32
Member
#cvc

Core này nhét vào mục nào thì hạp nhỉ ?

05.01.2018 / 00:06
hanhphucao
Bài đăng: 2470
Admin
Admin là người tận tâm và luôn hành xử đúng mực.
Ply24 đã viết

Core này nhét vào mục nào thì hạp nhỉ ?

Vào các file system

05.01.2018 / 09:51
VinaDP
Bài đăng: 627
Member
PHP
  1. self::$ip_count[] = $arr['ip'];

self có phải func k vậy?

05.01.2018 / 10:37
tnit2510
Bài đăng: 970
Member

ghét nhất cái antiflood này

05.01.2018 / 10:46
VinaDP
Bài đăng: 627
Member
chuotiube đã viết

ghét nhất cái antiflood này

Tui áp dụng thử rùi ,để coi @mad ddos có còn bị limit k

05.01.2018 / 14:03
nhoxxinhtrai
Bài đăng: 26
Member

chả giảm dc j cả. :D