2014-12-02 43 views
2

我正在使用Microsoft的MVC和所有其他相關技術開發DoD項目。實體框架和STIG

爲了安全起見,我必須遵循安全技術實施指南(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

謝謝!

回答

0

那麼,這是防止SQL注入的一種方法,我猜想,但是,讓我們把它留給美國政府,把規則應用到簡單的事情上。

該限制條件基本上要求該網站是隻讀的。據推測,這隻適用於面向公衆的屬性,所以你仍然可以允許直接訪問內部應用程序的數據庫(否​​則,我不知道你將如何堅持任何事情)。無論如何,Entity Framework可以輕鬆應對。就使用視圖而言,你並不需要做太多特別的事情。如果你在現有的數據庫中使用Code First併爲你的視圖命名,以便它們遵循EF約定(實體名稱的複數形式),那麼你就不必真的做任何特殊的事情。

爲了使EF功能與現有的數據庫,你只需要修改DbContext子類的構造函數1)顯式引用連接字符串和2)禁用初始化:

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

    // DbSets here 
} 

如果你的視圖名唐「T線向上與EF約定,那麼你可以明確地說明你的實體應該參考什麼:

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

從技術上講,你仍然有實體框架API的方法可以讓寫的,但由於後盾是一個視圖,日如果運行,ese會引發異常。如果你可以做類似於運行存儲過程來進行更改,哪種間接允許寫入訪問,但從技術上講,應用程序本身並未觸及數據庫,那麼你也可以讓Entity Framework使用它們。有關更多信息,請參閱Code First Insert/Update/Delete Stored Procedures(不幸的是,只有EF6和更高版本)。

+0

謝謝克里斯的回覆。要讀取數據,這非常簡單。但是,當我需要保存一些數據時,它會很無聊,因爲看起來我必須爲每個表創建存儲過程......對我來說這沒有意義,哈哈。再次感謝。 – HorseKing 2014-12-02 19:58:42

0

這是STIG的直接link。這是一箇舊的修訂,但我正在看最新的,他們是完全一樣的。我認爲文本多年來一直沒有改變,這是不幸的,因爲它不是很清楚。規則標題表示使用參數化語句(我將其視爲任何CRUD操作),但也不提供對錶的直接訪問。

實體框架將參數化查詢發送到數據庫,這是一種直接訪問形式。我認爲這是不安全的?絕對不。但有人可能會認爲STIG說不這樣做。問題是STIG也說使用存儲過程來代替直接訪問,但如果寫入不正確,就可能容易出現SQL注入漏洞。

我的解釋是?最後,只要你使用參數化查詢(即EF,Dapper,ADO.NET等)或者編寫適當的存儲過程來緩解這個問題,整個問題就是解決SQL注入問題,你應該沒問題。

0

STIG實際上並不需要ReadOnly,只是使用視圖而不是直接與表交談。

因此,不是連接到tblEmployees,而是連接到vwEmployees(這是tblEmployees的視圖)。

這樣您就可以更好地控制權限,訪問控制和限制。

示例:用戶角色1可以看到列A和B,但不能看到C和D.如果直接連接到表,用戶角色1將具有對列A-D的權限。因此,可以創建僅包括列A和B的視圖。

示例2:其他國防部規則包括諸如捕獲最後一次更改數據的人。很多時候,這是由觸發器完成的,它將用戶名/日期時間保存到表中每列的列中。顯然這不是用戶或程序應該訪問的內容。通過直接訪問表格,您無法刪除此權限。因此,您創建除了這兩個列以外的所有列的視圖。

至於這個問題,數據庫連接並不在乎你是否正在與視圖或表進行交談,它們的行爲與程序相同。

謝謝。肖恩。