在剃须刀视图中暴露DAL

时间:2014-09-02 13:48:18

标签: asp.net-mvc security razor model viewmodel

我使用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视图是服务器端编译的,但如果一个剃刀开发人员偶然使用一些“禁止”的视图模型属性会怎样?

1 个答案:

答案 0 :(得分:1)

好吧,只要你不在服务器之外暴露这些东西就可以了......但即使用户会看到你记录的数据库ID,安全风险只有在他能用它做什么的时候才会出现。在那之前 - 它只是一个数字。您最好考虑如何保护编辑/删除操作:)

因为我们在那里 - 考虑一件事 - 当您剥离所有标识符的视图模型时 - 在尝试更新用户的更改时,您将如何映射回来?当然,如果ViewModel是只读的,这不是问题。

但无论如何 - 我强烈建议从ViewModel对象中删除整个模型对象 - 只留下一些标识符。如果你有安全问题 - 也许只是尝试哈希它们之前?

并且只在ViewModel中保留所需的字段/属性。并严格定义。不仅出于安全考虑,还要降低内存/传输数据的使用率。