2024年3月6日 星期三

[研究]ASP.NET, Fortify SCA 報告 Missing Check against Null ( Low )

[研究]ASP.NET, Fortify SCA 報告 Missing Check against Null ( Low )

2024-03-06

環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C# + SQL Server 2019 + SQL Server Management Studio (SSMS) 19

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

Fortify SCA 報告 Missing Check against Null 問題 ( 等級 Low ),把

string sessionID = Session["id"].ToString();

改成

string sessionID = Session["id"] != null ? Session["id"].ToString() : "";

問題依舊。

Filter Set 選 Quick View 時是沒有的,但選 Security Auditor View 會有。




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

【Fortify SCA】Recommendations:

如果一個函數可以回傳錯誤程式碼或其他任何能夠指明函數執行成功或失敗的證據,那麼請務必檢查錯誤情況,即便沒有明顯的跡象顯示會發生這個錯誤。除了避免安全性錯誤以外,許多乍看之下難以理解的錯誤,到最後都會歸究到使用包含 Unchecked Return Value 的錯誤方法進行呼叫。

建立一個容易使用的標準方法來處理應用程式的失敗。如果錯誤處理程序是簡單直接的,則程式設計師較不會忽略它。一個標準化的錯誤處理方法是,把檢查和處理錯誤狀況的常用函數寫入封裝程式,而不需程式設計師額外費力。執行並應用封裝程式後,便可使用自訂的規則禁止和限制使用非封裝函數的使用。 

範例 2:以下程式碼對 Item 屬性執行封裝,以檢查回傳值是否為 null,並在未定義要求的參數時使用預設值。

string safeGetParameter (HttpRequest request, string name)
{
string value = request.Item(name);
if (value == Null) {
return getDefaultValue(name);
}
return value;
}

敝人實際測試有問題



********************************************************************************
ChatGPT

Fortify SCA 報告中指出的 "Missing Check against Null" 問題是指在這行程式碼中沒有對 Session["oid"] 是否為 null 做適當的檢查。這可能會導致在 Session["oid"] 為 null 的情況下引發 NullReferenceException。為了解決這個問題,你可以進行如下修改:

string sessionID = "";
object idObject = Session["id"];
if (idObject != null)
{
    sessionID = idObject.ToString();
}

為了方便大量字串一行取代替換成另一行,可全部寫成一行

string sessionID = ""; object idObject = Session["id"]; if (idObject != null) { sessionID = idObject.ToString(); }

這樣做的話,首先將 Session["oid"] 存儲在一個臨時變數 oidObject 中,然後檢查 oidObject 是否為 null。如果不為 null,則將其轉換為字串賦值給 sessionOID,否則將 sessionOID 設置為空字串。這樣就可以避免在 Session["oid"] 為 null 時引發異常。





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

User

為何 string sessionID = Session["id"] != null ? Session["id"].ToString() : ""; 這種寫法不行 ? 當 Session["id"] 為 null 時會回傳 "" 啊 ?

ChatGPT

對於一般情況來說,你提供的寫法是可以正確處理當 Session["userID"] 為 null 時的情況的,它會將 sessionID 設置為空字串。但是 Fortify SCA 可能仍然會識別這種寫法為有問題,原因可能是 Fortify SCA 的靜態程式碼分析檢查方式的限制或者可能存在一些特殊情況。

如果 Fortify SCA 報告中顯示這種寫法有問題,你可以嘗試使用更保守的寫法來解決這個問題,比如使用臨時變數進行明確的 null 檢查,這樣可以確保 Fortify SCA 不再報告這個問題。

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

改寫成副程式


public class Example
{
    public static void Main()
    {
        // 調用副程式,並將 Session["id"] 的值傳遞給它
        string sessionID = GetSessionID(Session["id"]);
        Console.WriteLine("Session ID: " + sessionID);
    }

    // 定義副程式,將 Session["id"] 的值轉換為字符串
    public static string GetSessionID(object idObject)
    {
            // Fortify SCA 報告 Missing Check against Null ( Low )
            // string sessionID = Session["id"].ToString();

            // Fortify SCA 仍會報告 Missing Check against Null ( Low ),不認得這種精簡寫法
            // string sessionID = Session["id"] != null ? Session["id"].ToString() : "";

        string sessionID = "";
        if (idObject != null)
        {
            sessionID = idObject.ToString();
        }
        return sessionID;
    }
}


(下圖)實際測試,副程式寫法也可解決


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

改用 ChatGPT 建議後,Fortify SCA 報告相同問題,有可能無法判斷那種精簡的寫法。

其實 低等級問題,一般不會強制要求解決,只是因為報告上數量很大,想試試看會否增加掃描速度、減少報告檔案體積。

(完)

相關

沒有留言:

張貼留言