2011-12-01 29 views
7

Tôi đang cố gắng tìm cách từ chối mọi truy cập trực tiếp vào các phương thức hành động của mình. Về cơ bản những gì tôi muốn người dùng của tôi nhấp vào liên kết để điều hướng thay vì nhập URL trực tiếp vào thanh địa chỉ trong trình duyệt của họ.Từ chối truy cập URL trực tiếp vào phương thức hành động

Bây giờ tôi biết điều này có thể được thực hiện bằng cách kiểm tra urlreferrer trong đối tượng yêu cầu nhưng điều này không đáng tin cậy và yếu vì urlreferrer có thể dễ dàng sửa đổi và một số bộ bảo mật thực sự xóa nó khỏi yêu cầu.

Vì vậy, bạn có biết cách nào để thực hiện điều này trong asp.net mvc3 không?

+0

thế nào "an toàn" không cần thiết này được? Bạn chỉ muốn ngăn người dùng có thể đánh dấu trang và/hoặc nhập URL? Hay bạn thực sự muốn làm cho nó an toàn chống lại những người thực sự biết làm thế nào để giả mạo Javascript và cookie? –

+0

Tôi muốn làm điều này an toàn nhất có thể, đó là lý do tại sao urlreferrer không thực sự phù hợp vì nó có thể được giả mạo khá dễ dàng – Duy

+0

Điều này có ngăn chặn CSRF không? Hoặc bạn có thực sự cần phải ngăn chặn ngay cả những người dùng "được ủy quyền" khỏi các yêu cầu hợp lệ giả mạo không? –

Trả lời

3

tôi không chắc chắn nhưng có lẽ lời đề nghị này có thể giúp bạn dude cho phép nghĩ rằng bạn có một url như thế này

www.yoursite.com/home.aspx 

ok? để tránh người dùng của bạn trực tiếp lông mày trang này bạn có thể viết lại bạn url như thế này

www.yoursite.com/fdmf489ruv30/home.aspx 

và trong url này phần "fdmf489ruv30" là một chuỗi duy nhất mà bạn đã tạo nó trên session_start và sẽ tiêu diệt nó trên session_end

bạn có nhận được hoặc cần mô tả thêm về ý tưởng này không ?! bạn có thể tìm kiếm loại url viết lại dude này.

+0

Đây là một ý tưởng hay. Nhưng nó sẽ không chỉ có hiệu quả nếu id duy nhất là một chuỗi truy vấn? –

+0

Tôi không thực sự muốn làm điều này bởi vì điều đó sẽ làm cho các url lộn xộn và không seo thân thiện. – Duy

+0

có, là ý tưởng tồi cho SEO (cố gắng để có được thứ hạng tốt hơn trong google bởi các khái niệm khác về SEO). và về chuỗi truy vấn, tôi đã không kiểm tra nếu self.try của tôi và nói tôi kết quả –

0

Cách nhanh chóng để làm điều đó là đặt một phiên chứa số ngẫu nhiên trong hành động chuyển hướng, cũng chuyển số ngẫu nhiên làm tham số cho hành động khác.

Bên trong hành động khác (chuyển hướng), so sánh giá trị của phiên với thông số của hành động. Nếu các giá trị bằng nhau, người dùng sẽ đến đó bằng cách nhấn nút, nếu không, người dùng sẽ đến đó bằng cách thay đổi URL. Hy vọng nó giúp.

question on Stackoverflow

0

Đó là không thể cách an toàn đảm bảo rằng người dùng có thẩm quyền KHÔNG THỂ giả mạo yêu cầu hợp lệ.
Sau khi tất cả, nếu trình duyệt có thể tạo "yêu cầu hợp lệ", thì người dùng được ủy quyền có thể là!

Tuy nhiên, đây là một yêu cầu bất thường và tôi muốn biết động lực đằng sau nó là gì?

Tuy nhiên, có một số cách gây khó khăn hơn trong việc giả mạo yêu cầu.
Vì không có phương pháp nào hoàn toàn an toàn, bạn có thể thử obfuscate và làm cho nó tẻ nhạt để ai đó giả mạo yêu cầu của bạn.

Như những người khác đã đề xuất, bạn có thể tạo "mã thông báo" ngẫu nhiên mỗi phiên và yêu cầu nó trong URL (hoặc dưới dạng đường dẫn hoặc dưới dạng chuỗi truy vấn).

Sẽ tốt hơn nếu bạn sử dụng JavaScript cho việc này. Hiển thị đầu vào bị ẩn với "mã thông báo" này. Sau đó, chặn sự kiện click của mỗi liên kết, thêm giá trị "mã thông báo" vào URL, sau đó điều hướng đến URL.

Bạn có thể tăng cường JavaScript bằng cách nào đó "xử lý" mã thông báo của bạn trước khi sử dụng nó và rút gọn JavaScript của bạn để làm xáo trộn nó ... điều này chắc chắn sẽ ngăn chặn ngay cả những người dùng ở mức trung bình.

Có rất nhiều giải pháp khả thi, nhưng giải pháp "đúng" thực sự phụ thuộc vào hành vi cụ thể mà bạn đang cố gắng ngăn chặn.

+0

Đồng ý với điều này. Bạn đang cố gắng để thực hiện? Bạn có thể tạo một thùng chứa trang html chung và sử dụng các hành động dựa trên ajax để trả về html mà bạn đã nhúng. Các hành động Ajax có thể bị hạn chế truy cập url trực tiếp thông qua các thuộc tính hoặc các mã thông báo ẩn khác. – Roman

7

Dưới đây là mã cho phương pháp NoDirectAccessAttribute để hạn chế truy cập trực tiếp đến bất kỳ lớp hoặc hành động phương pháp áp dụng các thuộc tính NoDirectAccess

using System; 
using System.Web.Mvc; 
using System.Web.Routing; 

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] 
public class NoDirectAccessAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (filterContext.HttpContext.Request.UrlReferrer == null || 
        filterContext.HttpContext.Request.Url.Host != filterContext.HttpContext.Request.UrlReferrer.Host) 
      { 
      filterContext.Result = new RedirectToRouteResult(new 
          RouteValueDictionary(new { controller = "Home", action = "Index", area = "" })); 
     } 
    } 
} 

Sử dụng các bộ lọc hành động như sau đối với bất kỳ bộ điều khiển hay hành động phương pháp mà bạn don' t muốn sử dụng để yêu cầu trực tiếp

[NoDirectAccess] 
public ActionResult IsUsernameUnique() 

Trong ví dụ trên, bất kỳ truy cập trực tiếp vào phương thức hành động IsUsernameUnique sẽ tự động chuyển hướng người dùng đến phương pháp hành động Home/Index.

+1

nó giải quyết vấn đề một số phạm vi (một số cấp độ) – Aji

0

Sử dụng mã này trong Global.asax.cs và Gọi [NoDirectAccess] cho tất cả các bộ điều khiển

//Prevent direct URL access: Call [NoDirectAccess] to all controllers to block 
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] 
    public class NoDirectAccessAttribute : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      if (filterContext.HttpContext.Request.UrlReferrer == null || 
         filterContext.HttpContext.Request.Url.Host != filterContext.HttpContext.Request.UrlReferrer.Host) 
      { 
       filterContext.Result = new RedirectToRouteResult(new 
           RouteValueDictionary(new { controller = "Home", action = "Login", area = "" })); 
      } 
     } 
    } 
Các vấn đề liên quan