2008-10-29 35 views
5

Làm cách nào để bạn đảm bảo đúng cách người dùng không giả mạo giá trị chuỗi truy vấn hoặc giá trị url hành động? Ví dụ, bạn có thể có một hành động Xóa nhận xét trên CommentController của bạn, trong đó có một CommentID. Url hành động có thể trông giống như/Nhận xét/Xóa/3 để xóa nhận xét bằng id 3.Bảo mật với giá trị QueryString trong Asp.net MVC

Bây giờ rõ ràng bạn không muốn bất kỳ ai có thể xóa nhận xét 3. Thông thường về chủ sở hữu của nhận xét hoặc quản trị viên có cho phép làm như vậy. Tôi đã thấy bảo mật này thực thi các cách khác nhau và muốn biết một số bạn làm như thế nào.

Bạn có thực hiện nhiều cuộc gọi cơ sở dữ liệu để truy xuất nhận xét và kiểm tra xem tác giả của nhận xét có khớp với người dùng gọi hành động xóa không?

Thay vào đó bạn có vượt qua CommentID và UserID xuống thủ tục được lưu trữ, người thực hiện xóa và thực hiện Xóa nơi UserID và CommentID bằng các giá trị được chuyển vào không?

Có tốt hơn để mã hóa các giá trị chuỗi truy vấn không?

Trả lời

18

Bạn không.

Đó là một nguyên tắc cốt yếu của chương trình, đặc biệt là trong thời đại ngày nay, đó bạn không bao giờ tin tưởng bất kỳ đầu vào mà xuất phát từ người dùng, trình duyệt, khách hàng, vv

Nó cũng là một hồng y quy tắc lập trình mà bạn có lẽ không nên cố gắng thực hiện mã hóa và bảo mật cho mình, trừ khi bạn thực sự biết mình đang làm gì. Và ngay cả khi bạn biết bạn đang làm gì, bạn sẽ chỉ còn một bước trước những cái bánh tard-cracker. Những người thông minh vẫn sẽ cười bạn.

Thực hiện truy vấn bổ sung để đảm bảo người dùng đã đăng nhập có tập hợp quyền phù hợp. Điều đó sẽ làm cho cuộc sống của mọi người trở nên đơn giản hơn nhiều.

0

điều sôi nổi tôi đã thực hiện lấy chuỗi truy vấn, nén nó, Base64 hoặc chỉ hex mã hóa nó, để "commentid = 4 & userid = 12345" trở thành "mã = 1a2b23de12769"

Đó là cơ bản "An ninh thông qua tối nghĩa "nhưng nó làm cho rất nhiều công việc cho một người nào đó cố gắng để hack trang web.

0

Bạn không thể dễ dàng thực hiện việc này.

Tôi có những kỷ niệm đáng yêu về trang web đã sử dụng url hành động để xóa.

Tất cả đều tốt cho đến khi họ bắt đầu tìm kiếm thu thập thông tin mạng nội bộ.

Rất tiếc, dữ liệu tạm biệt.

Tôi khuyên bạn nên sử dụng giải pháp theo đó bạn không sử dụng truy vấn cho bất kỳ điều gì bạn không muốn chỉnh sửa.

+0

Sau đó, làm thế nào để bạn đề nghị tôi sửa/xóa mọi thứ sau đó? Hãy nhớ rằng tôi đang sử dụng Asp.net MVC – Vyrotek

+0

Bạn nên POST cho các phương thức điều khiển của mình để gọi xóa - và xác minh thông tin đăng nhập yêu cầu (cookie/username/password/whatever) trước khi thực hiện xóa. Xem bài đăng của @ Schotime. –

1

Bạn cũng có thể chỉ cho phép yêu cầu bài đăng để xóa hành động điều khiển bằng cách sử dụng thuộc tính Accept Verbs như được thấy bên dưới.

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Delete(int? id) 
{ 
    //Delete 
} 

Sau đó, bạn cũng có thể sử dụng thẻ antiforgery như đã thảo luận ở đây:

http://blog.codeville.net/2008/09/01/prevent-cross-site-request-forgery-csrf-using-aspnet-mvcs-antiforgerytoken-helper/

+1

Trong MVC 2.0 bạn cũng có thể gọi Http delete. Chỉ cần đặt [HttpDelete] thay vì [HttpPost] lên hành động của bạn và sau đó gửi biểu mẫu bằng cách sử dụng giao thức xóa thay vì đăng. – Josh

3

Vyrotek: Phương pháp đầu vào là không quan trọng. GET, POST, được mã hóa/obfuscated GET - không có sự khác biệt thực sự.Bất kể cách ứng dụng của bạn nhận các lệnh, để thực hiện một hành động quản trị, nó phải đảm bảo rằng người dùng phát hành được phép làm những thứ mà anh ta muốn. Việc kiểm tra sự cho phép phải diễn ra SAU KHI lệnh được nhận và TRƯỚC KHI nó được thực thi. Nếu không, nó không có bảo mật nào cả.

6

Enrypting và giải mã params truy vấn là một quá trình tầm thường và có một số ví dụ tuyệt vời về cách để làm như vậy sử dụng một HttpModule ở đây trên StackOverflow.

"You Do không", "Bạn không thể", hoặc "Đó không phải là dễ dàng" là phản ứng đơn giản là không thể chấp nhận được trong ngày và tuổi tác ...

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