Chủ Nhật, 17 tháng 6, 2012

Tự động lock ip khi bị ddos attack

Cơ chế:
Khi 1 ip gửi 1 request tới site của bạn. code sẽ tạo ra 1 file log ghi lại ip đó, và url mà ip đó truy cập.

Ví dụ : 113.22.70.69 - http://mydomain.com/4rum/index.php

nếu ip 113.22.70.69 truy cập nhanh và liên tiếp 5 lần vào cùng 1 url như trên thì code sẽ lock ip 113.22.70.69 bằng cách tạo ra 1 file htaccess
và ghi lệnh deny from 113.22.70.69
Soạn thảo 1 file : banip.php

<?php
$n = 5; // Chặn ip nếu 5 lần nhanh và liên tiếp truy cập vào 1 URL
$ban = strpos($_SERVER***91;'REQUEST_URI'***93;, "vbshout.php")?0:1;
$in = "\n".$_SERVER***91;'REMOTE_ADDR'***93;." - ".$_SERVER***91;'REQUEST_URI'***93;;
$log = fopen('banip.log','a'); fwrite($log, $in); fclose($log);
$list = file('banip.log',FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$last = count($list) - 1;
if($last >1000) { $in = "Deny from all"."\n";
$lock = fopen('.htaccess','a'); fwrite($lock, $in); fclose($lock); }
elseif($last > $n) { for($i = 1; $i < $n; $i++) if($list***91;$last - $i***93; != $list***91;$last***93 $ban = 0;
} else { $ban = 0; }
if($ban) { $in = "Deny from ".$_SERVER***91;'REMOTE_ADDR'***93;."\n";
$lock = fopen('.htaccess','a'); fwrite($lock, $in); fclose($lock);}
?>
Edit :global.php ( Nếu là Forum) thêm vào
include 'banip.php';
Đoạn code này :
if($last >1000) { $in = "Deny from all"."\n";
........
Khi 1 ip truy cập vào site. code sẽ ghi ip đó vào 1 dòng
Sau đó sẽ đếm tổng số dòng trong file log. nếu lớn hơn 1000 dòng trong 1 thời gian nhất định (Dấu hiệu bị tấn công bonet) thì sẽ ghi vào file
htaccess lệnh deny from all.Các bạn có thể lập lịch xoá file htaccess và file log theo 1 thời gian quy định bằng cron job trong cpanel của host
reset.php
<?php
if(file_exists('.htaccess')) unlink('.htaccess');
if(file_exists('banip.log')) unlink('banip.log');
?>
Sau đó dùng chức năng cron job của cpanel mà trỏ về reset.php .ví dụ 5 phút nó sẽ xóa file hta và log

Không có nhận xét nào: