2009-05-20 44 views
20

Sự cố web phổ biến là nơi người dùng nhấp vào nút gửi của biểu mẫu nhiều lần để máy chủ xử lý biểu mẫu nhiều lần. Điều này cũng có thể xảy ra khi người dùng chạm vào nút quay lại đã gửi biểu mẫu và do đó nó được xử lý lại.Những phương pháp nào có sẵn để ngăn chặn nhiều postbacks của một form trong ASP.NET MVC?

Cách tốt nhất để ngăn điều này xảy ra trong ASP.NET MVC là gì?

khả năng như tôi nhìn thấy nó là:

  1. Vô hiệu hóa nút sau khi nộp - điều này được quanh nhiều lần nhấp chuột nhưng không phải là chuyển hướng
  2. Có hành động tiếp nhận chuyển hướng ngay lập tức - trình duyệt dường như rời khỏi những chuyển hướng ra về lịch sử
  3. Đặt một dấu hiệu duy nhất trong phiên và về hình thức - nếu chúng phù hợp xử lý theo hình thức - nếu không muốn nói rõ ràng các hình thức cho một tươi nộp

Có nhiều hơn không?

Có một số triển khai cụ thể nào trong số này không?

Tôi có thể thấy tùy chọn thứ ba được triển khai dưới dạng ActionFilter với phần mở rộng HtmlHelper theo cách tương tự với công cụ chống giả mạo.

Mong muốn được nghe từ bạn MVC'ers ngoài kia.

Trả lời

16

Thường thì mọi người bỏ qua những cách thông thường nhất để xử lý này đó là sử dụng phím nonce.

Bạn có thể sử dụng PRG như những người khác đã đề cập nhưng nhược điểm với PRG là nó không giải quyết được vấn đề kích đúp vào, nó đòi hỏi một chuyến du lịch bổ sung cho các máy chủ để chuyển hướng, và kể từ khi bước cuối cùng là yêu cầu GET bạn không có quyền truy cập trực tiếp vào dữ liệu vừa được đăng (mặc dù nó có thể được chuyển qua như một tham số truy vấn hoặc được duy trì ở phía máy chủ).

Tôi thích giải pháp Javascript vì nó hoạt động nhất thời gian.

Phím phi thường tuy nhiên, luôn luôn hoạt động. Phím nonce là một GUID duy nhất ngẫu nhiên được tạo ra bởi máy chủ (cũng được lưu trong cơ sở dữ liệu) và được nhúng vào biểu mẫu. Khi người dùng POST biểu mẫu, khóa nonce cũng được đăng. Ngay sau khi POST đến máy chủ, máy chủ xác minh khóa không tồn tại trong cơ sở dữ liệu của nó. Nếu có, máy chủ sẽ xóa khóa khỏi cơ sở dữ liệu và xử lý biểu mẫu. Do đó, nếu người dùng POST hai lần, POST thứ hai sẽ không được xử lý bởi vì khóa nonce đã bị xóa sau khi xử lý POST đầu tiên.

Phím nonce có lợi thế bổ sung ở chỗ nó mang lại sự bảo mật bổ sung bằng cách ngăn chặn replay attacks (người đàn ông ở giữa đánh hơi yêu cầu HTTP của bạn và sau đó phát lại nó cho máy chủ coi đó là hợp pháp).

+0

Ý tưởng thú vị, một điều tôi sẽ thêm là bạn nên đặt chuỗi trong một giao dịch: 1) kiểm tra nonce 2) quá trình 3) xóa nonce. Nếu bạn không làm điều này nguyên tử bạn có một điều kiện chủng tộc, nơi bài viết có thể được xử lý nhiều lần, đặc biệt. nếu quá trình xử lý mất một lúc để hoàn thành (và người dùng thiếu kiên nhẫn). Một điều tôi vẫn chưa rõ ràng là, nếu POST phát hiện một bản sao gửi, những gì cần được trả lại cho người dùng? Một trang cho biết bài đăng đang được xử lý? – DSO

+0

Tôi sẽ xóa khóa nonce trước và sau đó thực hiện quá trình xử lý để đơn giản hóa mọi thứ. Làm thế nào để xử lý một dupe là một quyết định thiết kế và tùy thuộc vào bạn. Tuy nhiên, phản hồi mô tả về những gì vừa xảy ra sẽ giúp người dùng đánh giá cao ứng dụng web của bạn hơn nữa. – aleemb

+0

Bạn đã từng thấy việc triển khai các khóa nonce trong ASP.NET MVC bằng cách sử dụng ActionFilters có lẽ? Tôi có thể tưởng tượng điều này sẽ làm cho việc thực hiện rất đơn giản và tái sử dụng. Nó cũng có thể sử dụng một DB hoặc chỉ đơn giản là một biến phiên. – WooWaaBob

1

Điều này thực sự không phải là MVC cụ thể, nhưng mẫu chúng tôi theo dõi trên các trang web của chúng tôi là các hành động được thực hiện bằng các cuộc gọi AJAX, chứ không phải là POST toàn trang. Vì vậy, điều hướng đến một url không bao giờ thực hiện một hành động, chỉ cần hiển thị biểu mẫu. Cuộc gọi AJAX sẽ không có trong lịch sử

0

Cùng với việc vô hiệu hóa các nút, bạn có thể thêm div trong suốt trên toàn bộ trang web để việc nhấp không thực hiện. Chúng tôi làm điều này tại nơi làm việc của tôi và thêm một nhãn thân thiện nhỏ cho biết yêu cầu xử lý ..

5

Bạn phải luôn trả lại chuyển hướng dưới dạng phản hồi HTTP cho POST. Điều này sẽ ngăn không cho POST xảy ra lần nữa khi người dùng điều hướng qua lại bằng các nút Chuyển tiếp/Quay lại trong trình duyệt.

Nếu bạn lo lắng về việc người dùng nhấp đúp vào nút gửi của bạn, chỉ cần một tập lệnh nhỏ sẽ tắt chúng ngay khi gửi.

+0

gì về js không đáng yêu của chúng tôi sử dụng? – redsquare

+0

Các tập lệnh có thể không xâm nhập và chèn vào theo cách sẽ không làm phiền các trình duyệt/người dùng không phải js. Nếu bạn vẫn lo lắng về việc gửi biểu mẫu kép, bạn cần một số logic phía máy chủ để xử lý điều đó. – mookid8000

+0

thats những gì tôi đã nhận được tại. Logic được thực hiện tốt hơn phía máy chủ hơn là dựa vào js – redsquare

2

Bạn có thể muốn nhìn vào mô hình Post-Redirect-Get (PRG):

+1

Mẫu PRG không giải quyết được vấn đề người dùng nhấp vào gửi nhiều lần. – DSO

+0

Không, nó không - nó giải quyết vấn đề nút quay lại mặc dù –

+0

bạn có thể dễ dàng ngăn chặn việc nhấp đúp bằng một hàm javascript đơn giản. – josephdotca

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