2011-11-19 28 views
8

Trong mã tôi đã thấy sự sáng tạo này của thẻ cho một trang đăng nhập:lý do cho việc sử dụng một mã thông báo dưới dạng HTML và kiểm tra trong mã PHP

$token = $_SESSION['token'] = md5(uniqid(mt_rand(),true));

Sau đó, dấu hiệu này được lặp lại như một đầu vào ẩn trong biểu mẫu đăng nhập và mã được gửi, mã php để xác thực thông tin đăng nhập cũng kiểm tra mã thông báo này như:

public function isTokenValid() 
{ 
    return (!isset($_SESSION['token']) || $this->_token != $_SESSION['token'])? 0 : 1; 
} 

Việc sử dụng mã thông báo này là gì?

Edit: Trang này là mô tả việc sử dụng của nó: https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet

Trả lời

8

Cách tiếp cận như thế này thường được sử dụng để ngăn chặn CSRF vulnerabilities

+0

cảm ơn bạn.Trang này nói rõ ràng về phương thức mã thông báo này: https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet –

1

này được sử dụng để bảo vệ chống cross-site tấn công yêu cầu giả mạo, trong đó một người dùng không được ủy quyền có thể buộc người dùng hiện đang đăng nhập (được ủy quyền) thực thi các yêu cầu trên trang web của bạn bằng cách tạo các liên kết dẫn đến các bài đăng biểu mẫu.

Ý tưởng là trang web của bạn trước tiên phải tạo mã thông báo chống CSRF và chuyển nó cho khách hàng được ủy quyền. Nhưng mã thông báo đó không được biết đến với kẻ tấn công và phải được sử dụng để hoàn tất yêu cầu hợp lệ trở lại trang web của bạn.

Một cuộc tấn công CSRF ví dụ có thể lôi kéo người dùng nhấp vào liên kết, dẫn đến một bài đăng spam được đăng lên luồng Facebook của người dùng, nếu Facebook không được bảo vệ đúng cách với CSRF bằng mã thông báo. Vì người dùng đã đăng nhập, trang web bị tấn công (Facebook) đã xử lý yêu cầu đăng bài là hợp lệ.

+0

ok cảm ơn bạn Michael. –

1

Tokens rất hữu ích để cung cấp một số mức độ bảo vệ khỏi các cuộc tấn công CSRF và chúng cũng hữu ích cho việc thực thi giới hạn về việc gửi biểu mẫu.

Hoặc đơn giản, có thể được sử dụng để ngăn người khác vô tình gửi cùng một biểu mẫu hai lần bằng cách nhấp vào nút gửi hai lần.

Ví dụ: Bạn đang thực hiện chuyển khoản trực tuyến trên trang web của ngân hàng $ 10 từ tài khoản A sang tài khoản B. Khi màn hình "chuyển tiền" xuất hiện, trong nền là mã thông báo duy nhất. Bạn nhập vào/từ tài khoản và số tiền và nhấn nút gửi, và sau đó nhấn nó một lần nữa do tai nạn trước khi trang tiếp theo tải.

Trình duyệt của bạn gửi HTTP POST hai lần. Đối với yêu cầu đầu tiên, máy chủ nhận được mã thông báo, xác nhận rằng nó hợp lệ, sau đó xóa hoặc đánh dấu nó là không hợp lệ. Đối với yêu cầu thứ hai, máy chủ phát hiện rằng mã thông báo (cùng) không còn giá trị và không xử lý quá trình chuyển. Nếu nó không làm như vậy, bạn sẽ chỉ cần chuyển $ 20 thay vì $ 10.

Một cách để suy nghĩ về nó là khi bạn tải một biểu mẫu bạn nhận được một mã thông báo đặc biệt cho trường hợp đó của biểu mẫu bạn vừa tải. Nếu bạn muốn gửi, hãy sử dụng mã thông báo. Một khi bạn sử dụng mã thông báo nó đã biến mất. Bạn muốn có mã thông báo khác? Tải lại trang/biểu mẫu để nhận một trang khác.

Lưu ý: có nhiều cách để sử dụng JavaScript để tránh nhấp chuột vào nút trùng lặp, cũng nên được sử dụng, nhưng điều này không giúp ích nếu có yêu cầu HTTP trùng lặp vì một số lý do khác (lỗi trình duyệt, vấn đề phần cứng) v.v.) Thẻ phải được sử dụng cho bất kỳ giao dịch nào dẫn đến thay đổi dữ liệu hoặc sử dụng tài nguyên (như in) và không được sao chép một cách vô tình.

+0

Cảm ơn bạn rất nhiều –

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