it-swarm-vi.com

Tôi có nên sử dụng AntiForgeryToken dưới mọi hình thức, thậm chí đăng nhập và đăng ký không?

Tôi đang điều hành một trang web khá lớn với hàng nghìn lượt truy cập mỗi ngày và lượng người dùng khá lớn. Kể từ khi tôi bắt đầu chuyển sang MVC 3, tôi đã đưa AntiForgeryToken vào một số biểu mẫu, sửa đổi dữ liệu được bảo vệ, v.v.

Một số hình thức khác, như đăng nhập và đăng ký cũng sử dụng AntiForgeryToken, nhưng tôi đang trở nên mơ hồ về nhu cầu của họ ở đó ngay từ đầu, vì một vài lý do ...

Hình thức đăng nhập yêu cầu người đăng phải biết thông tin đăng nhập chính xác. Tôi thực sự không thể nghĩ ra bất kỳ cách nào một cuộc tấn công CSRF sẽ có lợi ở đây, đặc biệt nếu tôi kiểm tra xem yêu cầu đến từ cùng một Máy chủ (kiểm tra tiêu đề Người giới thiệu).

Mã thông báo AntiForgeryToken tạo ra các giá trị khác nhau mỗi khi trang được tải. Nếu tôi có hai tab mở với trang đăng nhập, và sau đó thử đăng chúng, thì tab đầu tiên sẽ tải thành công. Cái thứ hai sẽ thất bại với AntiForgeryTokenException (đầu tiên tải cả hai trang, sau đó thử đăng chúng). Với các trang an toàn hơn - đây rõ ràng là một điều ác cần thiết, với các trang đăng nhập - có vẻ như quá mức cần thiết và chỉ yêu cầu sự cố.

Có thể có những lý do khác khiến người ta nên sử dụng hoặc không sử dụng mã thông báo trong các biểu mẫu. Tôi có đúng không khi cho rằng việc sử dụng mã thông báo trong mọi hình thức bài đăng là quá mức cần thiết và nếu vậy - loại hình nào sẽ có lợi từ nó và loại nào chắc chắn sẽ không lợi ích?

P.S. Câu hỏi này cũng được hỏi trên StackOverflow, nhưng tôi không hoàn toàn bị thuyết phục. Tôi nghĩ tôi sẽ hỏi nó ở đây, để biết thêm bảo mật

82
Artiom Chilaru

Có, điều quan trọng là bao gồm các mã thông báo chống giả mạo cho các trang đăng nhập.

Tại sao? Bởi vì tiềm năng cho các cuộc tấn công "đăng nhập CSRF". Trong một cuộc tấn công CSRF đăng nhập, kẻ tấn công đăng nhập nạn nhân vào trang web đích bằng tài khoản của kẻ tấn công. Ví dụ, hãy xem xét một cuộc tấn công vào Alice, một người sử dụng Paypal, bởi một kẻ tấn công độc ác Evelyn. Nếu Paypal không bảo vệ các trang đăng nhập của mình khỏi các cuộc tấn công CSRF (ví dụ: với mã thông báo chống giả mạo), thì kẻ tấn công có thể âm thầm đăng nhập trình duyệt của Alice vào tài khoản của Evelyn trên Paypal. Alice được đưa đến trang web Paypal và Alice đã đăng nhập, nhưng đăng nhập với tên Evelyn. Giả sử Alice sau đó nhấp vào trang để liên kết thẻ tín dụng của cô ấy với tài khoản Paypal và nhập số thẻ tín dụng của cô ấy. Alice nghĩ rằng cô ấy đang liên kết thẻ tín dụng của mình với tài khoản Paypal, nhưng thực ra cô ấy đã liên kết nó với tài khoản của Evelyn. Bây giờ Evelyn có thể mua đồ, và nó được tính vào thẻ tín dụng của Alice. Giáo sư. Điều này là tinh tế và hơi mơ hồ, nhưng đủ nghiêm trọng để bạn nên bao gồm các mã thông báo chống giả mạo cho mục tiêu hành động biểu mẫu được sử dụng để đăng nhập. Xem bài viết này để biết thêm chi tiết và một số ví dụ thực tế về điều đó lỗ hổng.

Khi nào thì có thể bỏ mã thông báo chống giả mạo? Nói chung, nếu mục tiêu là một URL và việc truy cập URL đó không có tác dụng phụ, thì bạn không cần đưa mã thông báo chống giả mạo vào URL đó.

Nguyên tắc cơ bản là: bao gồm mã thông báo chống giả mạo trong tất cả các yêu cầu POST, nhưng bạn không cần nó cho các yêu cầu GET. Tuy nhiên, quy tắc thô này là một xấp xỉ rất thô Nó đưa ra giả định rằng tất cả các yêu cầu GET sẽ không có tác dụng phụ. Trong một ứng dụng web được thiết kế tốt, hy vọng là như vậy, nhưng trong thực tế, đôi khi các nhà thiết kế ứng dụng web không tuân theo hướng dẫn đó và thực hiện các trình xử lý GET có tác dụng phụ (đây là một ý tưởng tồi, nhưng nó không phải là hiếm). Đó là lý do tại sao tôi đề xuất một hướng dẫn dựa trên việc yêu cầu có ảnh hưởng đến trạng thái của ứng dụng web hay không, thay vì dựa trên GET vs BÀI ĐĂNG.

72
D.W.

Trường hợp có thể cần có mã thông báo trên trang đăng nhập là khi bạn cần ngăn người khác đăng nhập độc hại bạn vào trang web với thông tin đăng nhập cụ thể. Tôi có thể thấy đây là trường hợp nếu ai đó đang bị đóng khung cho một cái gì đó yêu cầu đăng nhập với một người dùng chi tiết. Với điều đó đã được nói, đó là một ví dụ giả định.

2
Steve