Chủ Nhật, 2 tháng 5, 2010

Giải pháp chống flood cho site


Nếu site bạn không chống flood, hackers có thể dễ dàng flood site bạn, làm database của bạn có thể bị tràn ngập và xuất hiện nhiều dữ liệu dư thừa.


Flood hiểu nôm na có nghĩa là tràn ngập - Khi bạn thiết kế một FORM để nhập dữ liệu, thì bất kỳ ai cũng có thể view sources để xem cấu trúc HTML của FORM bạn thiết kế, vì vậy nếu site bạn không chống flood, hackers có thể dễ dàng flood site bạn, làm DB của bạn có thể bị tràn ngập và xuất hiện nhiều dữ liệu dư thừa.

Thông thường thì trong khi thiết kế một FORM bất kỳ thì phải thoả mãn cấu trúc như sau:


Đoạn code trên sử method="post" có nghĩa là phương pháp lấy dữ liệu là POST, ngoài nó ra bạn còn có thể dùng GET để lấy dữ liệu.

Có thể hiểu nếu method="GET" là dùng nhập dữ liệu ngay trên thanh địa chỉ, điều này cũng khó kiểm soát dữ liệu vì hackers có thể trực tiếp flood qua đường này nếu như không chống flood.

Còn nếu method="POST" thì bắt buộc phải được nhập qua 1 FORM nhất định, hiện tại hầu hết các site điều thiết lập method là POST vì dễ dàng kiểm tra dữ liệu và nhất là phòng chống SQL injection vì ít có hackers để ý đến các FORM lắm.

Có rất nhiều phương pháp để chống flood, tôi xin trình bày vài cách để bạn tham khảo: Sử dụng session, tạo 1 field trong table dùng trong việc lưu trữ IP của máy đang truy cập (Cách này hơi rắc rối nên tôi không trình bày ở đây).

Phương pháp chống flood bằng cách sử dụng SESSION:

1. Tạo FORM: Việc tạo một FORM để nhập dữ liệu không khó, nếu không biết tạo xin hỏi tại box khác vì box này chỉ dành tham khảo về bảo mật ứng dụng web thôi :)

2. Tạo 1 file PHP tên là anti_flood.php, với code sau:



1. 2.
3. session_start();
4.
5. $timeout = 60;
6. $session_name = "action_time";
7.
8. if ( isset($_SESSION["{$session_name}"]) && ( $_SESSION["{$session_name}"] >= time() - $timeout ) )
9. {
10. print "Làm ơn đợi {$timeout} giây rồi quay lại kiếm tôi!!";
11. return false;
12. }
13. $_SESSION["{$session_name}"] = time();
14.
15. ?>

Giải thích:
Dòng thứ 3 dùng session_start() để khởi động dữ liệu của session (Phiên làm việc).

Dòng kế tiếp là để thiết lập thời gian cho một session, mặc định là 60 giây.

Dòng tiếp theo là $session_name, đơn giản chỉ là đặt tên cho session.

Dòng tiếp theo nữa là để kiểm tra thời gian của phiên làm việc trước đó (nếu trước đó có một session đã thực hiện và session đó phải lớn hơn hoặc bằng thời gian hiện tại trừ cho thời gian thiết lập cho mổi session).

+ Điều đó có nghĩa là nếu session đã thực hiện trước đó (session thứ 1) chỉ cách session thứ 2 dưới 60 giây (đây là thời gian do bạn qui định: $timeout = 60) thì sẽ được xét vào dạng Flood data, và ngược lại thì sẽ cho qua và xác nhận hợp lệ.

Và dòng cuối cùng là thiết lập thời gian "hiện tại" cho session "hiện tại".

Có 2 cách để sử dụng đoạn code trên:

Cách 1: Load trực tiếp file anti_flood.php, áp dụng cho site có ít FORM cần chống flood.

1. 2.
3. require_once("anti_flood.php");
4.
5. ?>

Cách 2: Là copy trực tiếp đoạn code của tôi rồi sửa lại tên session để dễ phân biệt cho site có nhiều FORM cần chống flood:

1. 2.
3. require_once("anti_flood.php");
4.
5. ?>

Theo Quantriweb

0 nhận xét:

Đăng nhận xét