[英]Security approach in web application
我正在用 ASP.NET / C# 設計一個 Web 應用程序,其中每個注冊用戶都可以根據他們的用戶 ID 添加/修改/刪除行。
舉個例子:
我將在屬於我的頁面/route.aspx?routeid=854
上編輯我的路線(用戶 ID:1)。
但是因為我是一個好奇的人,所以我嘗試訪問屬於另一個用戶(用戶 ID:2)的/route.aspx?routeid=855
。
我怎樣才能最好地避免人們訪問其他人的數據? 我應該在每個數據庫調用中發送每個用戶 ID(來自會話),我應該在每次頁面加載時驗證用戶/密碼,還是最好和最安全的方法是什么?
我希望我說得足夠清楚。
您最好的方法是將 userId 與 routeId 一起發送到數據庫,以查看用戶是否可以訪問它。
就像是:
select * from route where routeId=@routeId and userId=@userId
如果您使用的是 Linq 之類的東西,您可以通過應用用戶限制來制作更好的安全模型,例如使用這樣的可重用函數:
public Route Get(int routeId, int userId)
{
var query repository.Get<Route>().Where(r => r.Id == routeId);
query = applySecurityModel(query, userId);
return query.FirstOrDefault();
}
private IQueryable<T> applySecurityModel<T>(IQueryable<T> query, int userId) where T : ISecurable
{
return query.Where(t => t.UserId == userId);
}
public interface ISecurable
{
int UserId { get; set; }
}
public class Route
{
int Id { get; set; }
int UserId { get; set; }
}
不要重新發明輪子
編輯:存儲 UserId - 您不必這樣做。 只要用戶登錄,您就可以隨時從 MembershipProvider 獲取它:
MembershipUser user = Membership.GetUser();
Guid UserID = user.ProviderUserKey;
在我看來,您需要實現 ASP.NET Membership Provider。 閱讀此資源:http: //odetocode.com/articles/427.aspx
另外,來自 Scott Guthrie 的一個很好的系列: http://weblogs.asp.net/scottgu/archive/2006/02/24/ASP.NET-2.0-Membership_2C00_-Roles_2C00_-Forms-Authentication_2C00_-and-Security-Resources-。 aspx
一般來說,采用這種方法:使用表單身份驗證來驗證用戶是誰。 這是安全的身份驗證方面。 也就是說,通常使用用戶名和密碼來確定用戶是他們所說的人。
安全性的第二部分是授權,一旦您知道用戶是誰,就會發生授權。 這基本上包括確定經過身份驗證的用戶可以訪問哪些資源。 一個成熟的系統將包括以下實體:
User: may contain extended profile information captured on registration
Resource: a page or other resource that can be restricted.
Group: a group of users who can access resources due to their group membership (groups are granted resource access)
Role: a type of user such as Administrator/Developer/Salesperson.
因此,要授予用戶對 routeid 854(資源)的訪問權限,您可以將資源直接授予用戶,或者如果有多個用戶應該有權訪問該資源並且這些用戶形成一個自然組,然后創建該組,授予將資源添加到組並將用戶添加到組。
然后您可以通過資源 id 訪問 User.Resources 或者您可以使用保護整個頁面
if(!User.IsInRole("RoleName"))
{
//redirect to access denied page
}
使用提供者模型有很多好東西可用。
編輯:如果您決定存儲有關用戶的個人資料信息,請注意: ProfileProvider 的默認實現並不是特別好。 Scott Guthrie 寫了一篇關於更好的基於表格的提供程序的好文章: http ://weblogs.asp.net/scottgu/archive/2006/01/10/435038.aspx
這也是我的問題。 Keramati 先生在這里介紹的一些解決方案。
但是在 ASP.NET MVC 的防篡改隱藏字段中引入了解決方案 ID:
您可以加密模型中的關鍵屬性值。 您可以創建自己的屬性並將其用於操作,屬性接受屬性名稱作為字符串數組中的參數,然后將視圖發送到客戶端。
所有提到的屬性值都將被加密,當表單將數據發布到操作時,屬性解密值並比較原始值和解密值。 如果兩者相等,則數據正確,所有數據都可以發送到數據庫,否則驗證將失敗。 PrimaryKey 是必不可少的,客戶端可以使用檢查工具和其他工具輕松操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.