2017-10-20 74 views
1

我已經實現了代碼來管理我的應用程序中的內容安全策略層。 我的實現基於一個ActionFilterAttribute,該代碼受此處可用代碼的啓發(爲了簡單起見,我在該問題中包含了該代碼)。Asp net核心內容安全策略實施

public override void OnResultExecuting(ResultExecutingContext context) { 
    var result = context.Result; 
    if (result is ViewResult) { 
     if (!context.HttpContext.Response.Headers.ContainsKey("X-Content-Type-Options")) { 
      context.HttpContext.Response.Headers.Add("X-Content-Type-Options", "nosniff"); 
     } 
     if (!context.HttpContext.Response.Headers.ContainsKey("X-Frame-Options")) { 
      context.HttpContext.Response.Headers.Add("X-Frame-Options", "SAMEORIGIN"); 
     } 

     var csp = "default-src *;"; 

     // once for standards compliant browsers 
     if (!context.HttpContext.Response.Headers.ContainsKey("Content-Security-Policy")) { 
      context.HttpContext.Response.Headers.Add("Content-Security-Policy", csp); 
     } 
     // and once again for IE 
     if (!context.HttpContext.Response.Headers.ContainsKey("X-Content-Security-Policy")) { 
      context.HttpContext.Response.Headers.Add("X-Content-Security-Policy", csp); 
     } 
    } 
} 

然而,正如你可以從下面的圖片看,我仍然可以在瀏覽器(Firefox樣品中的)錯誤。這是顯示這是目前的標頭中的開發者控制檯:

Request headers

而這些控制檯錯誤

Console

什麼我做錯了,expecially在過去的三個誤區安慰?

+0

問題中的代碼片段似乎表明您正在設置一個Content-Security-Policy:default-src *標題,但開發者控制檯屏幕截圖顯示了Content-Security-Policy:script- src'self; style-src'self',img-src'self''。爲什麼? – sideshowbarker

+0

看起來,將內容安全策略添加到頭部的代碼塊(具有符合標準的瀏覽器一次註釋的那個代碼塊)不會運行,因爲密鑰已經存在於頭部中。雖然解決方案可能很簡單,但我想知道是誰添加了它...... – Lorenzo

+0

那麼我現在還注意到,顯示的控制檯錯誤是針對也具有'​​script-src:https:// localhost:5000'的CSP頭以及'style-src:https:// localhost:5000' ... – sideshowbarker

回答

1

爲了消除在控制檯屏幕捕獲的CSP的錯誤,你必須讓這個頭髮生:

Content-Security-Policy: 
    script-src 'self' https://cdnjs.cloudflare.com; 
    style-src 'self' https://fonts.googleapis.com; 
    img-src 'self' data: 

(在上面顯示被分解爲多行只是爲了可讀性值)。

其要點是:

  • 你需要有'self'在那裏
  • 你需要ŧ Ø給出了第三方https://cdnjs.cloudflare.com,你必須有data:允許data:image/gif網址在您的標記

而且,如果原點值https://fonts.googleapis.com起源,你裝字體和腳本從

  • 文件也真的從https://localhost:5000加載資源,那麼你也需要在那裏。

    如果您的後端已經有一些其他部分添加了CSP頭部,那麼瞭解您使用額外的CSP頭部添加的任何策略只能使策略更嚴格,而不是更自由。

    因此,如果其他地方添加的CSP標頭比您需要的標籤更嚴格,那麼您必須找到正在添加該標籤的系統部分,並使其停止。然後你可以添加你需要的更寬鬆的CSP頭。