实体框架和STIG

时间:2014-12-02 18:52:38

标签: c# asp.net-mvc entity-framework

我正在通过使用Microsoft的MVC和所有其他相关技术为DoD开发一个项目。

出于安全考虑,我必须遵守安全技术实施指南(STIG)。

在版本3,版本9,第3.10.1节中,它表示“允许通过视图访问数据库不直接访问数据库中的基础表”。

它还表示“(APP3540.4:CAT II)Designer将确保应用程序不直接访问数据库中的表。”

我的问题是,我可以将实体框架与LINQ一起使用吗?

以下是参考链接:http://iase.disa.mil/stigs/app-security/app-security/Pages/app-security.aspx

谢谢!

3 个答案:

答案 0 :(得分:0)

嗯,这是防止SQL注入的一种方法,我想,但男人,请让美国政府将asinine规则应用于简单的事情。

限制基本上要求网站只读。据推测,这仅适用于面向公众的属性,因此您仍然可以允许在内部应用程序上直接访问数据库(否​​则,我不知道您将如何实际持有任何内容)。无论如何,Entity Framework可以轻松处理这个问题。就使用观点而言,你并不需要做很多特别的事情。如果您将Code First与现有数据库一起使用并命名您的视图,使其符合EF约定(实体名称的复数版本),那么您就不必真正做任何特别的事情。

要使用现有数据库进行EF功能,只需将DbContext子类的构造函数修改为1)明确引用连接字符串,然后2)禁用初始化程序:

public class ApplicationContext : DbContext
{
    public ApplicationContext()
        : base("ConnectionStringName")
    {
        Database.SetInitializer<ApplicationContext>(null);
    }

    // DbSets here
} 

如果您的视图名称不符合EF约定,那么您可以明确说明您的实体应该引用的内容:

[Table("awesomefooview")]
public class Foo
{
    ...
}

从技术上讲,您仍然拥有允许写入的实体框架API方法,但由于支持是视图,因此如果运行,这些方法将引发异常。如果你可以做一些事情,比如运行存储过程来进行更改,哪种间接允许写访问,但从技术上讲,应用程序本身并没有触及数据库,那么你也可以让Entity Framework使用这些。有关详细信息,请参阅Code First Insert/Update/Delete Stored Procedures(不幸的是,只有EF6及更高版本。)

答案 1 :(得分:0)

这是对STIG的直接link。这是一个旧版本,但我正在查看最新版本,它们完全一样。我认为该文本多年来没有改变,这是不幸的,因为它不是很清楚。规则标题说使用参数化语句(我看作任何CRUD操作),但也不提供对表的直接访问。

实体框架将参数化查询发送到数据库,这是一种直接访问的形式。我觉得它不安全吗?绝对不。但人们可以说STIG说不要这样做。问题是STIG还说使用存储过程代替直接访问,但如果编写错误,你可以很容易地遇到SQL注入漏洞。

我的解释?最后,整个要点是解决SQL注入问题,因此只要您使用参数化查询(即EF,Dapper,ADO.NET等)或编写适当的存储过程来缓解这种情况,您应该没问题。

答案 2 :(得分:0)

STIG实际上并不需要ReadOnly,只是使用视图而不是直接与表交谈。

因此,您不必连接到tblEmployees,而是连接到vwEmployees(这是tblEmployees的视图)。

这样您就可以更好地控制权限,访问控制和限制。

示例:用户角色1可以看到列A和B,但不能看到C和D.如果直接连接到表,则用户角色1将具有列A-D的权限。因此,可以创建仅包含A列和B列的视图。

示例2:其他DoD规则包括捕获上次更改数据的人员。很多时候,这是由Triggers完成的,它将用户名/日期时间保存到表中每列的列。显然,这不是用户或程序应该访问的内容。通过直接访问表,您无法删除此权限。因此,您创建除了这两列之外的所有列的视图。

至于问题,数据库连接不关心你是在谈论视图还是表,它们的行为与程序有关。

感谢。肖恩。