cập nhật: không sử dụng chế độ ngủ() để hạn chế tốc độ! điều này không có ý nghĩa gì cả. tôi không có một giải pháp tốt hơn trên tay.
một khởi đầu tốt sẽ là chỉ sleep(1);
sau lần đăng nhập không thành công - dễ triển khai, gần như không có lỗi.
1 giây không nhiều đối với con người (đặc biệt là vì nỗ lực đăng nhập của con người không xảy ra thường xuyên), nhưng 1 giây/thử sức mạnh vũ phu ... sloooow! tấn công từ điển có thể là một vấn đề khác, nhưng nó nằm trong cùng một miền.
nếu kẻ tấn công bắt đầu quá có thể kết nối để phá vỡ điều này, bạn đối phó với một loại tấn công DOS. vấn đề được giải quyết (nhưng bây giờ bạn đã có một vấn đề khác).
một số công cụ bạn nên xem xét:
- nếu bạn khóa các tài khoản Chỉ duy nhất trên cơ sở mỗi IP, có thể có vấn đề với mạng riêng.
- nếu bạn khóa các tài khoản Chỉ duy nhất trên cơ sở tên truy cập, tấn công từ chối dịch vụ tấn công agains tên người dùng được biết sẽ có thể
- khóa trên cơ sở IP/tên người dùng (trong đó username là một trong những tấn công) có thể làm việc tốt hơn
đề xuất của tôi: khóa hoàn toàn không được mong muốn (DOS), do đó, một lựa chọn tốt hơn là: đếm số lần đăng nhập cho một tên người dùng nhất định từ một IP duy nhất. bạn có thể làm điều này với một bảng đơn giản failed_logins: IP/username/failed_attempts
nếu thông tin đăng nhập thất bại, wait(failed_attempts);
giây. mỗi xx phút, chạy tập lệnh cron giảm failed_logins:failed_attempts
một.
xin lỗi, tôi không thể cung cấp giải pháp đã được tạo trước, nhưng điều này không đáng kể để thực hiện.
okay, được thôi.đây là mã giả:
<?php
$login_success = tryToLogIn($username, $password);
if (!$login_success) {
// some kind of unique hash
$ipusr = getUserIP() . $username;
DB:update('INSERT INTO failed_logins (ip_usr, failed_attempts) VALUES (:ipusr, 1) ON DUPLICATE KEY UPDATE failed_logins SET failed_attempts = failed_attempts+1 WHERE ip_usr=:ipusr', array((':ipusr' => $ipusr));
$failed_attempts = DB:selectCell('SELECT failed_attempts WHERE ip_usr=:ipusr', array(':ipusr' => $ipusr));
sleep($failed_attempts);
redirect('/login', array('errorMessage' => 'login-fail! ur doin it rong!'));
}
?>
từ chối trách nhiệm: này có thể không làm việc trong khu vực nhất định. điều cuối cùng tôi nghe là ở châu Á có cả một quốc gia NAT (cũng vậy, tất cả đều biết kung-fu).
giải pháp tốt và đơn giản Tôi đồng ý, nhưng nó vẫn yêu cầu tương tác cơ sở dữ liệu. Điều gì xảy ra nếu tôi chỉ cần thêm độ trễ 1 giây giữa phát hiện đăng nhập không thành công và hiển thị lại màn hình đăng nhập? Điều này sẽ buộc cả bot và con người phải chờ đợi sự chậm trễ. Đối với một con người nó không phải là nhiều, và ít người sẽ làm một đăng nhập sai, trong khi cho một bot nó là khá dài. Bạn nghĩ sao? – Ferdy
không thực sự hữu ích, vì tôi có thể thực hiện N yêu cầu đồng thời. khối thứ hai xảy ra trên cơ sở theo yêu cầu, do đó, N yêu cầu đồng thời kết thúc sau một chút hơn 1 giây (do máy chủ có thể xử lý tải). vì vậy về nguyên tắc, tôi có thể khởi chạy 10.000 yêu cầu và yêu cầu họ hoàn thành sau một vài giây, bởi vì chúng không nối tiếp. – stefs
cũng có, có> 80.000 giây mỗi ngày. 80.000 không phải là nhiều cho sức mạnh vũ phu, nhưng nó có thể đủ cho một cuộc tấn công từ điển. – stefs