2023年11月20日 星期一

[研究][ASP.NET]弱點掃描出現「Cookies without Secure flag set」之解決

[研究][ASP.NET]弱點掃描出現「Cookies without Secure flag set」之解決

2023-11-09

環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C#

弱點名稱:Cookies without Secure flag set(Cookies without Secure flag set)

風險等級:Low

弱點描述:One or more cookies does not have the Secure flag set. When a cookie is set with the Secure flag, it instructs the browser that the cookie can only be accessed over secure SSL/TLS channels. This is an important security protection for session cookies.

弱點中文描述:此 session cookie 未設定 Secure flag,如果 cookie 有設定 Secure flag,即可限制客戶端只能使用 SSL 的存取cookie,以保護該 cookie 不被竊聽。

建議修補方式:If possible, you should set the Secure flag for these cookies.

建議修補方式中文:如果可能,應設設定該 cookie 的 Secure flag 為True。

********************************************************************************

ASP.NET WebForm  如何解決 Cookies without Secure flag set ?

ChatGPT

在ASP.NET WebForms中,確保Cookies的Secure標誌被設置通常涉及到在應用程式的Web.config文件中進行一些設置。Secure標誌指定是否僅在使用SSL(安全套接層)連接時發送Cookie。這有助於保護數據在傳輸過程中的安全性。

以下是在ASP.NET WebForms應用程式中確保Cookies的Secure標誌被設置的步驟:

啟用SSL: 確保你的網站使用SSL,即https。這可以通過在IIS(Internet Information Services)中配置或使用SSL證書實現。

在Web.config中配置Cookie: 在Web.config文件中,可以使用<httpCookies>元素配置Cookie。確保requireSSL屬性設置為true。

<configuration>
  <system.web>
     <httpCookies httpOnlyCookies="true"  />
  </system.web>
</configuration>

這將確保Cookie僅在使用SSL連接時發送。

進一步設置: 如果你使用Forms身份驗證(Forms Authentication),還可以檢查相關的<forms>元素的requireSSL屬性,確保它也被設置為true。

<configuration>
  <system.web>
    <authentication mode="Forms">  
      <forms requireSSL="true" />
    </authentication>
  </system.web>
</configuration>

確保這些設置符合你的應用程式需求,並確保在生產環境中使用SSL以保護數據的傳輸。

********************************************************************************

User

ASP.NET 網站,弱點掃描出現 Cookies without Secure flag set,但 Web.Config 有設定
<system.web>

     <httpCookies httpOnlyCookies="true"  />

</system.web>

請問為什麼掃描工具掃不到

ChatGPT

"Secure"標誌未設定的Cookie是一個安全問題,但重要的是要了解,掃描工具可能無法即時偵測到您網站的實際配置。 掃描工具可能無法存取您的Web伺服器配置或執行時間設置,它依賴於對您網站結構和行為的分析。

Web.config檔中的<httpCookies httpOnlyCookies="true" />設定可確保將Cookie標記為HTTP-only,這表示它們不能透過JavaScript訪問,但它並不會自動強制執行"Secure"標誌。

要在Cookie上強制執行"Secure"標誌,您需要在程式碼中進行設置,當建立Cookie時設定"Secure"屬性。 例如,在C# ASP.NET中,您可以這樣做:

Response.Cookies["MyCookie"].Secure = true; 

此代碼將確保為"MyCookie" Cookie設定"Secure"標誌,它將僅在HTTPS連線上傳輸。

在程式碼中進行這些變更後,您應該會看到Cookie的"Secure"標誌已設置,您的掃描工具不應報告此問題。

請記住,掃描工具可能不知道您應用程式的所有運行時配置,因此重要的是手動驗證和測試應用程式的安全設置,以確保它們正確應用。

********************************************************************************

User

Response.Cookies.Set(MyCookie); 和 Response.Cookies["MyCookie"].Secure = true;  是否相同?

ChatGPT

是的,Response.Cookies.Set(MyCookie) 和 Response.Cookies["MyCookie"].Secure = true 是不同的操作,它們執行不同的任務。

Response.Cookies.Set(MyCookie) 用於將特定的 HttpCookie 物件添加到回應的 Cookie 集合中。這是將 Cookie 添加到回應的方法,而不涉及 Cookie 的屬性設置。通常,您會首先創建一個 HttpCookie 物件,設置其屬性,然後使用 Response.Cookies.Set 方法將其添加到回應中。例如:


HttpCookie myCookie = new HttpCookie("MyCookie");   
myCookie.Value = "SomeValue"; Response.Cookies.Set(myCookie);

Response.Cookies["MyCookie"].Secure = true 用於設置特定 Cookie 的 "Secure" 屬性,以確保它僅在安全的 HTTPS 連接中傳輸。這不是將 Cookie 添加到回應的方法,而是用於更改現有 Cookie 的屬性。如果 Cookie 不存在,您需要首先創建它,然後設置 "Secure" 屬性。

所以,這兩個操作是不同的,一個是添加 Cookie,另一個是更改特定 Cookie 的屬性。通常情況下,您需要結合使用這兩種方法,首先創建 Cookie,然後設置 "Secure" 屬性,以確保它在安全的連接中傳輸。

********************************************************************************

User

Response.Cookies["MyCookie"].Secure = true; 

和 


HttpCookie myCookie = new HttpCookie("MyCookie");   
myCookie.Value = "SomeValue"; Response.Cookies.Set(myCookie);

是否相同?

ChatGPT

在安全性方面,Response.Cookies["MyCookie"].Secure = true; 和以下的代碼片段是大致相同的,但它們可能用於不同的情境:

Response.Cookies["MyCookie"].Secure = true; 這行代碼是直接將指定 Cookie(在這種情況下是名為"MyCookie"的 Cookie)的 "Secure" 屬性設置為 true。這表示該 Cookie 將僅在安全的 HTTPS 連接中傳輸。這行代碼的作用是為特定 Cookie 設置 "Secure" 屬性。

代碼片段 if (FormsAuthentication.RequireSSL && Request.IsSecureConnection) 檢查是否應該使用安全連接,然後將一個名為 responseCookie 的 Cookie 的 "Secure" 屬性設置為 true,然後使用 Response.Cookies.Set(responseCookie); 將其添加到回應中。這個片段的作用是在某些特定條件下,為 responseCookie 設置 "Secure" 屬性,並將其添加到回應中。

這兩個操作都用於確保 Cookie 只在安全的 HTTPS 連接中傳輸,但它們可能在使用上有所不同。第二個片段使用條件來確定是否需要設置 "Secure" 屬性,而第一個片段僅直接設置特定 Cookie 的 "Secure" 屬性。因此,具體取決於您的應用程序的要求,您可以選擇使用其中一個或兩個操作中的一個。

********************************************************************************

如何測試 ASP.NET WebForm 網站已經對 Cookies without Secure flag set 做了防護

ChatGPT

要測試 ASP.NET WebForm 網站是否已經對未設置 Secure 標誌的 Cookies 進行了防護,你可以按照以下步驟進行:

建立一個未設置 Secure 標誌的 Cookie:

  1. 在網站上執行操作,生成一個 Cookie。
  2. 確保 Cookie 沒有設置 Secure 標誌。你可以在開發者工具的 Cookies 部分檢查這個屬性。
  3. 使用 HTTPS 連線:
  4. 確保你的網站是通過 HTTPS 連線訪問的,因為只有在安全連線下,瀏覽器才會傳送帶有 Secure 標誌的 Cookie。

監視瀏覽器控制台:

  1. 打開瀏覽器的開發者工具,切換到控制台選項。
  2. 在執行操作的過程中,觀察是否有類似以下的警告訊息:

Cookie “your_cookie_name” has been rejected because it is already marked as Secure.

如果你看到這樣的訊息,這表示網站已經防護了未設置 Secure 標誌的 Cookie。

檢查程式碼:

檢查 ASP.NET WebForm 網站的後端程式碼,確保在設置 Cookie 時使用了相應的屬性。

確認程式碼類似以下的形式:

HttpCookie cookie = new HttpCookie("your_cookie_name", "cookie_value");

cookie.Secure = true;

Response.Cookies.Add(cookie);

這些建議應該可以幫助你確保 ASP.NET WebForm 網站已經對 Cookies without Secure flag set 做了防護。如果有其他問題,請隨時問我!

********************************************************************************

ASP.NET WebForm, 請給 Default.aspx 和 Default.aspx.cs 程式,測試是否已經對 Cookies without Secure flag set 做了防護 ?

ChatGPT

對於 ASP.NET WebForms,確保 Cookies 的 Secure 屬性設置,可以在程式碼中進行檢查和設置。以下是一個示例,展示如何在 Default.aspx 和 Default.aspx.cs 中進行這個檢查。

在 Default.aspx 中,你可以確保頁面上的敏感信息(例如使用者驗證的 Cookie)已經設置了 Secure 屬性。這可以通過在頁面上使用 RequireSecureConnection 屬性或在 web.config 文件中設置 requireSSL 來實現。

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <%-- Your page content here --%>
    </form>
</body>
</html>


在 Default.aspx.cs 中,你可以使用 Response.Cookies 來設置 Cookies 的 Secure 屬性。下面是一個簡單的範例:

Default.aspx.cs

using System;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // 檢查是否已經設置了 Secure 屬性
        if (!Request.IsSecureConnection)
        {
            // 如果不是安全連接,則不設置敏感 Cookie
            return;
        }

        // 設置一個名為 "MySecureCookie" 的 Cookie,並將 Secure 屬性設置為 true
        HttpCookie myCookie = new HttpCookie("MySecureCookie", "CookieValue");
        myCookie.Secure = true;
        Response.Cookies.Add(myCookie);

        // 其他頁面邏輯
    }
}

上面的程式碼中,Request.IsSecureConnection 用於檢查是否為安全連接,如果不是,就不設置敏感 Cookie。如果是安全連接,則會使用 HttpCookie.Secure 屬性將 Secure 設置為 true,確保該 Cookie 只能在安全(HTTPS)連接中發送。你可以根據你的實際需求進行修改和擴展。

********************************************************************************

參考這篇,比對沒設定「Cookies without Secure flag set」(左圖)和 「Cookies with Secure flag set」(右圖),瀏覽器 Edge

[研究]HTTPS 瀏覽網頁時,如何檢視 伺服器回應標頭 ? (以 HSTS 為例)
https://shaurong.blogspot.com/2023/11/https-hsts.html

(完)

相關

沒有留言:

張貼留言