2011-11-05 31 views
5

Tôi đã được giao bài tập về nhà, nơi tôi cần tạo một hình ảnh xác thực để đăng nhập vào phần 'nhận xét'.Theo dõi các lần đăng nhập bằng cookie PHP

Tôi có hình ảnh xác thực hoạt động tốt, không vấn đề gì. Chúng tôi cũng có nhiệm vụ giữ số lần thử không thành công tại hình ảnh xác thực. Không vấn đề gì.

Đây là vấn đề của tôi. Chúng tôi được thông báo rằng người dùng được phép thử bao nhiêu lần tùy ý, tuy nhiên, nếu họ thất bại 5 lần trong giới hạn ba mươi giây, họ sẽ bị khóa trong ba phút.

Tôi hiểu cách theo dõi 5 lần thử bị mất, nhưng bạn sẽ theo dõi thời gian trên lần thử này như thế nào? Nếu người dùng đã thử 4 lần trong 15 giây, và sau đó đợi một phút (hoặc ít hơn, rõ ràng), đồng hồ được đặt lại và họ có thêm 5 lần thử. Hơn nữa, nếu họ đã thử hai lần và chờ 30 giây, những nỗ lực sẽ thử lại.

Tôi có cần đặt cookie thời gian, cookie đếm thứ cấp (để đi cùng với cookie đếm ban đầu) và theo dõi bắt đầu bộ đếm thứ cấp và chỉ xem bộ đếm đó có tăng lên 5 không? Bạn sẽ làm điều này như thế nào?

EDIT:

Phải xin lỗi, rõ ràng là tôi không hoàn toàn rõ ràng về tình hình của mình. Trong bài tập về nhà, nó được quy định nghiêm ngặt, chúng ta phải sử dụng cookie để thực hiện nhiệm vụ này. Chúng tôi không xem xét thực hành hay bảo mật tốt nhất vào thời điểm này, người hướng dẫn chỉ đơn giản là muốn chúng tôi cảm thấy thoải mái với cookie. Thật không may, phiên không phải là một lựa chọn cho tôi, tôi phải sử dụng cookie.

+5

Thực hiện kiểm tra bảo mật phía máy khách = lỗi ... – Amber

Trả lời

3

Cho bạn đã gắn thẻ tên này là PHP, chỉ cần bắt đầu phiên với session_start(). Điều đó cung cấp cho mỗi người dùng một ID duy nhất thông qua một cookie và bạn có thể lưu trữ các lần đăng nhập của họ trong mảng $_SESSION trên máy chủ. Tại mỗi lần đăng nhập, bạn có thể kiểm tra các nỗ lực đã ghi được lưu trữ trong phiên và xem liệu chúng có vượt quá tỷ lệ cố gắng cho phép hay không.

Tất nhiên, cảnh báo thông thường giữ: Trên hệ thống bảo mật thực, kẻ tấn công sẽ không thể duy trì cookie phiên đó trong nhiều lần thử - họ sẽ bỏ qua nó, buộc phải tạo phiên trống mới mỗi lần .

+0

Chúng ta nên dạy các phương pháp hay nhất tại đây, phải không? Do khách hàng có thể đặt lại phiên đó bằng cách bán các cookie của họ, đây không phải là một ý tưởng hay. – Brad

+1

Đó là chính xác những gì tôi chỉ ra trong đoạn thứ hai ... –

+0

Tôi thấy điều đó. Tôi sẽ không có chút ngạc nhiên khi thấy ai đó đến và thực hiện những gì bạn đã gợi ý, bất chấp cảnh báo của bạn, đơn giản vì nó "dễ hơn". Ồ, tôi đoán đó là vấn đề của họ. – Brad

2

Tôi sẽ không làm điều này trong cookie! Người dùng có thể vượt qua điều này một cách dễ dàng, làm cho hệ thống của bạn trở nên không an toàn.

Bạn nên đăng nhập mọi lần đăng nhập trong cơ sở dữ liệu. Sau đó, chỉ cần truy vấn cho các lần thử được thực hiện trong khoảng thời gian được chỉ định của bạn khi họ cố đăng nhập. Nếu họ đã thử quá thường xuyên, đừng để họ vào.

2

Vì đây là bài tập về nhà, không có mã cho bạn!

Ở mức cao, tất cả những gì bạn cần làm là lưu trữ dấu thời gian thay vì "đếm". Sau đó, trên mỗi yêu cầu, bạn có thể quăng dấu thời gian cũ hơn 30 giây và đếm phần còn lại.

0

Tôi sẽ triển khai thông số như hiện tại và không cố gắng diễn giải nó. Nó sẽ làm tăng sự phức tạp của vấn đề.

Để triển khai, tôi đề xuất sử dụng phiên hoặc nhật ký phía máy chủ thay vì xử lý cookie được tạo bằng tay. bạn có thể giữ thời gian của mỗi lần đăng nhập cho người dùng, trước khi mỗi lần xác thực kiểm tra 5 lần thử cuối cùng. nếu thời gian giá trị đầu tiên nhỏ hơn ba mươi giây, hãy thông báo cho người dùng và tắt biểu mẫu đăng nhập trong 5 phút. bạn có thể lưu trữ thời gian mở khóa biểu mẫu trong phiên người dùng (bằng cách thêm giây chờ đợi vào lần thử thất bại cuối cùng) và vì vậy mọi yêu cầu cho biểu mẫu đăng nhập sẽ không thành công nếu thời gian của máy chủ nhỏ hơn mở khóa thời gian.Khi biểu mẫu được mở khóa, hãy xóa dấu thời gian mở khóa trên phiên người dùng và bật lại biểu mẫu.

1

Vấn đề bảo vệ hệ thống của bạn khỏi người dùng độc hại phải được xử lý phía máy chủ. Bạn có thể sử dụng kết hợp IP và tên người dùng cố gắng đăng nhập để tạo mã định danh duy nhất cho cá nhân đó. Nếu kết hợp thông tin đăng nhập đó cố gắng bắt buộc đăng nhập, hãy chặn cá nhân đó trong 5 phút.

0

Tôi sẽ ghi lại mỗi lần thử không thành một mảng trong phiên.

Dưới đây là một số mã và mã giả.

<? 
// Check if they are locked out. 
if ($_SESSION['lockedOutTime'] < (time() - (3*60))) { 

    // they are locked out; don't attempt login 

    // notify them that they are still locked out 



// If they aren't locked out, allow them to attemp the login 
} else { 

    // Attempt login 
    // ... 

    // if failed... log it 
    $_SESSION['failedLoginAttempts'][] = time(); 

    $thirtySecondsAgo = time(); 
    $failedAttemptsInTheLastThirtySeconds = 0; 


    // count failed login attempts in the last 30 seconds 
    foreach ($_SESSION['failedLoginAttempts'] as $failedAttempTime) { 

     if ($failedAttempTime >= $thirtySecondsAgo) { 

      $failedAttemptsInTheLastThirtySeconds++; 

     } 

    } 

    // Check if they are over the limit 
    if ($failedAttemptsInTheLastThirtySeconds >= 5) { 

     // lock em out 
     $_SESSION['lockedOutTime'] = time(); 

     // Notify user they have been locked out 
     // ... 

    } 



} 

?> 
Các vấn đề liên quan