我使用Entity Framework 6,代码优先方法,与asp.net mvc 5一起使用。
剃刀视图都是强类型的,并且大多数都使用包含DAL模型的视图模型。有些视图直接使用DAL中的模型。我想知道这会带来什么样的安全风险。让我演示一下:
public class SomeViewModel {
public SomeModel SomeModel {get;set;}
public int OtherProperty {get;set;}
}
在剃须刀视图中:
@model SomeViewModel
我向剃刀视图公开的内容包括2个可能存在安全风险的事情:SomeModel实例的db id,以及实体的动态代理ID(或其他任何内容),我猜这与延迟加载实体。
System.Data.Entity.DynamicProxies.SomeModel_2ED515217...etc
所以我的计划是确保所有剃刀视图仅使用视图模型。此外,所有视图模型都应该排除上面提到的两个东西,db id和动态代理id。
所以SomeViewModel
会变成这样:
public class SomeViewModel {
public int SomeModelId {get;set;}
public string SomeModelPropA {get;set;}
public string SomeModelPropB {get;set;}
public int OtherProperty {get;set;}
}
总而言之,对剃刀视图用于模型的限制是否是一个好主意? 我知道razor视图是服务器端编译的,但如果一个剃刀开发人员偶然使用一些“禁止”的视图模型属性会怎样?
答案 0 :(得分:1)
好吧,只要你不在服务器之外暴露这些东西就可以了......但即使用户会看到你记录的数据库ID,安全风险只有在他能用它做什么的时候才会出现。在那之前 - 它只是一个数字。您最好考虑如何保护编辑/删除操作:)
因为我们在那里 - 考虑一件事 - 当您剥离所有标识符的视图模型时 - 在尝试更新用户的更改时,您将如何映射回来?当然,如果ViewModel是只读的,这不是问题。
但无论如何 - 我强烈建议从ViewModel对象中删除整个模型对象 - 只留下一些标识符。如果你有安全问题 - 也许只是尝试哈希它们之前?
并且只在ViewModel中保留所需的字段/属性。并严格定义。不仅出于安全考虑,还要降低内存/传输数据的使用率。