2008-10-25 29 views
16

Cách tốt nhất để xử lý khách truy cập là tạo URL của riêng họ và thay thế những gì chúng tôi mong muốn trở thành ID với bất kỳ thứ gì họ thích?ASP.Net MVC - xử lý các thông số URL xấu

Ví dụ:

ASP.Net MVC - handling bad URL parameters

Nhưng người dùng có thể chỉ là một cách dễ dàng thay thế các URL với:

https://stackoverflow.com/questions/foo

Tôi đã nghĩ đến việc làm cho mọi thông số điều khiển chức năng một String, và sử dụng Integer.TryParse() trên chúng - nếu điều đó trôi qua thì tôi có ID và có thể tiếp tục, nếu không tôi có thể chuyển hướng người dùng đến Chế độ xem không xác định/không tìm thấy hoặc chỉ mục.

Ngăn xếp ngăn xếp xử lý độc đáo và tôi cũng muốn - bạn làm như thế nào hoặc bạn sẽ đề xuất điều gì?

Trả lời

12

Dưới đây là một ví dụ về một tuyến đường như của bạn, với một hạn chế về số lượng:

routes.MapRoute(
    "Question", 
    "questions/{questionID}", 
    new { controller = "StackOverflow", action = "Question" }, 
    new { questionID = @"\d+" } //Regex constraint specifying that it must be a number. 
); 

Ở đây chúng ta thiết lập các questionID để có ít nhất một số. Điều này cũng sẽ chặn bất kỳ url nào chứa bất kỳ thứ gì ngoài số nguyên và cũng ngăn không cho hàm int có thể vô hiệu.

Lưu ý: Điều này không tính đến số tài khoản lớn hơn phạm vi Int32 (-2147483647 - +2147483647). Tôi để điều này như một bài tập để người dùng giải quyết. :)

Nếu người dùng nhập url "câu hỏi/foo", họ sẽ không nhấn vào hành động Câu hỏi và bỏ qua nó, vì nó không bị ràng buộc tham số. Bạn có thể xử lý nó tiếp tục trong một tuyến đường bắt/tuyến mặc định nếu bạn muốn:

routes.MapRoute(
    "Catchall", 
    "{*catchall}", // This is a wildcard routes 
    new { controller = "Home", action = "Lost" } 
); 

Thao tác này sẽ đưa người dùng đến hành động bị mất trong Bộ điều khiển chính. Bạn có thể tìm thêm thông tin về ký tự đại diện here.

NB: Catchall phải cư trú là tuyến đường LAST. Đặt nó tiếp tục lên chuỗi sẽ có nghĩa rằng điều này sẽ xử lý tất cả những người khác bên dưới nó, do bản chất lười biếng của các tuyến đường trong ASP.NET MVC.

+2

điều này giống như một cách khá tốt để xử lý người dùng điên =) – JOBG

+2

Thay vì dòng cuối cùng: 'new {questionID = @ "\ d {1,}"}', Scott Hanselman sử dụng cú pháp hơi ngắn hơn: 'new { questionID = @ "\ d +"} 'có nghĩa là cùng một điều. Nguồn: http://www.asp.net/learn/mvc-videos/video-7093.aspx – Andrew

+1

Vâng, cả hai đều khá giống nhau. Tôi có xu hướng đặt tôi vào các dấu ngoặc nhọn như vậy bởi vì tôi tự động tạo các tuyến đường của mình từ cơ sở dữ liệu và nó tiết kiệm cho tôi một chút logic khi tôi muốn chỉ định rõ số lượng chữ số tối đa. –

0

Vấn đề với cách tiếp cận đó là chúng vẫn có thể truyền một số nguyên không ánh xạ tới một trang. Chỉ cần trả lại 404 nếu họ làm điều đó, giống như bạn làm với "foo". Nó không phải là một cái gì đó để lo lắng về trừ khi bạn có ý nghĩa bảo mật rõ ràng.

+0

Chắc chắn, tôi phải kiểm tra Số nguyên là hợp lệ, nhưng đang sử dụng Chuỗi làm kiểu tham số Chức năng theo cách để đi? - ví dụ về TaskList (http://www.asp.net/learn/mvc/tutorial-01-cs.aspx ~ 35min 43s) mạnh mẽ loại ID thành Số nguyên và kết quả này là lỗi khi 'foo' được chuyển vào: o/ – Andrew

3

Trong ASP.NET MVC, bạn có thể xác định bộ lọc triển khai giao diện IActionFilter. Bạn sẽ có thể trang trí hành động của mình với thuộc tính này để nó sẽ được thực hiện vào, trước hoặc sau hành động của bạn.

Trong trường hợp của bạn, bạn sẽ xác định nó sẽ được thực hiện "trước" hành động của bạn. Vì vậy, bạn sẽ có thể hủy bỏ nó nếu có lỗi trong các tham số được truyền. Lợi ích chính ở đây là bạn chỉ viết mã kiểm tra các tham số đã truyền một lần (nghĩa là bạn xác định nó trong bộ lọc của bạn) và sử dụng nó bất cứ nơi nào bạn muốn trong các hành động điều khiển của mình.

Đọc thêm về MVC lọc ở đây: http://haacked.com/archive/2008/08/14/aspnetmvc-filters.aspx

2

Bạn có thể chỉ hạn chế như biểu thức thông thường hoặc xác định ràng buộc tùy chỉnh. Hãy nhìn vào bài viết trên blog này để biết thêm thông tin:

http://weblogs.asp.net/stephenwalther/archive/2008/08/06/asp-net-mvc-tip-30-create-custom-route-constraints.aspx

Bạn vẫn sẽ cần phải đối phó với những tình huống mà id 43.243 không có bản đồ để bất cứ điều gì mà có thể bị xử lý như một IActionFilter hoặc trong điều khiển của bạn trực tiếp.

5

Dưới đây là một số thông tin hữu ích có thể hữu ích. Nếu bạn có một phương pháp hành động

public ActionResult Edit(int? id) 
{} 

sau đó nếu có ai đó gõ

/Home/Edit/23 

tham số id sẽ là 23. tuy nhiên nếu ai đó trong

/Home/Edit/Junk 

sau đó id sẽ null là khá mát mẻ. Tôi nghĩ rằng nó sẽ ném một lỗi đúc hoặc một cái gì đó. Nó có nghĩa là nếu id không phải là một giá trị null thì nó là một số nguyên hợp lệ và có thể được chuyển tới các dịch vụ của bạn, vv cho tương tác db.

Hy vọng điều này sẽ cung cấp cho bạn một số thông tin mà tôi đã tìm thấy trong khi thử nghiệm.

+0

Ngoài ra, sẽ có lỗi mô hình trong ModelState phản ánh sự cố với tham số "id". –

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