2013-04-19 26 views
5

Điều này nghe có vẻ giống như một câu hỏi ngu ngốc, nhưng tôi tự hỏi liệu tôi có thiếu một mẹo ở bất kỳ đâu không.Cách tốt nhất để đảm bảo người dùng đã đăng nhập chỉ thấy dữ liệu của họ

Trường hợp là, tôi có một ứng dụng web sử dụng Simple Memebership, nơi người dùng có thể đăng ký sử dụng nó (ví dụ như chương trình hóa đơn).

Tuy nhiên, họ chỉ có thể xem/cập nhật/xóa thông tin mà chính họ thêm vào cơ sở dữ liệu/ứng dụng web.

Cách tốt nhất để đảm bảo người dùng chỉ nhận được thông tin của họ là gì?

Có thêm một trường Username để mỗi bảng, ví dụ:

public class Invoice 
{ 
    public int InvoiceId { get; set; } 
    public int CustId { get; set; } 
    public string UserName { get; set; } 
} 

public class Item 
{ 
    public int ItemId { get; set; } 
    public int InvoiceId { get; set; } 
    public string UserName { get; set; } 
} 

... và sau đó trong bất kỳ bộ điều khiển truy cập vào dữ liệu, chỉ cần thêm một tấm séc cho tên người dùng trong mọi thắc mắc, ví dụ như:

var Inv = db.Invoices.Where(x => x.UserName = User.Identity.Name); 
var Itm = db.Items.Where(y => y.UserName = User.Identity.Name); 

Đó là những gì tôi đang sử dụng, nhưng tự hỏi nếu điều này là thực hành tốt nhất? Hoặc nếu có một cách đơn giản hơn bây giờ chúng ta đang lên MVC4?

Là nó tốt nhất để sử dụng UserName hoặc UserId từ UserProfile bảng, hoặc dùng nó quan trọng?

Update để thêm rõ ràng sau comments

Vì vậy, 10 người đã đăng ký - và tất cả tạo hóa đơn riêng của họ. Tôi không muốn bất kỳ người dùng nào nhìn thấy bất kỳ hóa đơn người dùng nào khác.

Cảm ơn lời khuyên nào.

Đánh dấu

+0

tôi không này cần phải được thực hiện trên mức độ mã, nhưng thay vào mức độ cơ sở dữ liệu. Nếu người dùng đăng nội dung nào đó, cách tốt nhất là liên kết bài đăng đó với người dùng. Nếu người dùng duyệt đến trang web, truy vấn sẽ truy xuất mọi thứ liên quan đến người dùng đó, vì vậy bạn không phải giải quyết điều đó trong mã. – Terry

+0

Bạn có thể làm điều đó ở bất kỳ đâu ngoài mã? Cơ sở dữ liệu sẽ không biết người dùng sẽ là ai (xin lỗi nếu tôi đã bỏ lỡ điểm của bạn). cảm ơn bạn – Mark

+0

Tại một số thời điểm trong ứng dụng, bạn cần truy xuất thông tin mà người dùng có thể xem. Tại thời điểm đó, bạn đã biết người dùng là ai, vì họ đăng nhập, vì vậy bạn nên có userid ít nhất. Bây giờ khi bạn truy xuất thông tin, hãy sử dụng userid đó để thực hiện truy vấn của bạn và nhận thông tin được liên kết với đúng người dùng. – Terry

Trả lời

2

Nếu bạn thiết lập các mối quan hệ db đúng cách, bạn sẽ có thể tham khảo ví dụ hoá đơn của người dùng như vậy:

var invoices = dbContext.Users.first(u=>u.id == idParam).Invoices; 

Bạn có thể xác minh xem hóa đơn thuộc về người dùng bằng cách kiểm tra

if(dbContext.Invoices.Any(i=>i.invoiceID))//invoice exists? 
{ 
    //Invoice belongs to user? 
    bool invoiceBelongsToUser = dbContext.Users.first(u=>u.id == idParam) 
    .Invoices.Any(i=>i.invoiceID == invoiceIDParam); 
} 
0

Bạn có thể thêm các bộ lọc AuthorizeAttribute đến tập tin global.asax để bảo vệ mọi phương pháp hành động của tất cả các bộ điều khiển.

Và bộ điều khiển không cần phải được ủy quyền:

[AllowAnonymous] 
public ActionResult LogOn() 

securing-your-asp-net-mvc-3-application

+0

Xin lỗi - nếu tôi muốn 'xóa - điều gì xảy ra nếu có hai người dùng, hoặc 200 người dùng tạo hóa đơn của riêng họ - câu hỏi của tôi là cách tốt nhất để ngăn họ xem hóa đơn của bất kỳ ai khác. Cảm ơn bạn. – Mark

3

Những điều tôi sẽ làm là:

  1. Tránh đi qua trong bất kỳ hình thức sử dụng id/chứng chỉ trong bài viết/chuỗi truy vấn, giữ nó ở đâu đó an toàn, như được mã hóa trong cookie và luôn sử dụng điều này khi tạo truy vấn của bạn

  2. Nếu bạn có Id được chuyển trở lại chương trình của mình như một phần của bản chỉnh sửa, hãy đảm bảo các giá trị không bị giả mạo, nếu bạn xuất id trong trường bị ẩn, hãy đảm bảo nó giống như khi nó quay lại đã đi ra ngoài (tấn công tham chiếu trực tiếp này được gọi là)

  3. nếu ứng dụng của bạn yêu cầu chỉnh sửa, chẳng hạn như client/edit/4, luôn đảm bảo id 4 thuộc về người dùng đó trước khi hiển thị.

Một số đọc tốt ở đây trên 10 lỗ hổng đầu: https://www.owasp.org/index.php/Top_10_2010-Main

+0

"được mã hóa trong cookie" vẫn không phải là nơi an toàn. –

+0

Xin chào - Tôi đang sử dụng ASP.Net/MVC4 - và mã thông báo antiforgery và ủy quyền các thuộc tính v.v. vì vậy tôi hy vọng rằng nó sẽ lưu trữ bất kỳ thứ gì cần thiết để duy trì chi tiết "đã đăng nhập", trong khuôn khổ của nó và không tiếp xúc với nó cho khách hàng. Tôi có sai không? – Mark

+0

Tất cả các mã thông báo chống giả mạo là ngăn chặn các cuộc tấn công xss, bạn vẫn cần phải bảo vệ chống lại – Slicksim

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