2022年8月18日 星期四

[研究]Fortify SCA 報告 command.Parameters.Add 有 Access Control: Database 問題之解決

[研究]Fortify SCA 報告 command.Parameters.Add 有 Access Control: Database 問題之解決

2022-08-18、2024-03-01更新

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

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

問題:


(下圖) 上下幾行都正常,只有其中一行被 Forify SCA 認為有問題

********************************************************************************
Recommendations:

與其依賴顯示層來限制使用者傳送的值,還不如使用應用程式和資料庫層來進行存取控制。在任何情況下都不允許使用者在未取得適當權限前,去擷取或修改資料庫中的任何資料。每個存取資料庫的查詢都必須遵守此原則,只要將目前被驗證的使用者名稱做為查詢的一部分便可達成。
範例 2:以下程式碼實作與 Example 1 相同的功能,但是附加了額外的限制,以確認清單屬於目前驗證的使用者。

...
string user = ctx.getAuthenticatedUserName();
int16 id = System.Convert.ToInt16(invoiceID.Text);
SqlCommand query = new SqlCommand(
            "SELECT * FROM invoices WHERE id = @id AND user = @user", conn);
query.Parameters.AddWithValue("@id", id);
query.Parameters.AddWithValue("@user", user);
SqlDataReader objReader = query.ExecuteReader();
...

References:

[1] S. J. Friedl, SQL Injection Attacks by Example, http://www.unixwiz.net/techtips/sql-injection.html

[2] Standards Mapping - Common Weakness Enumeration, CWE ID 566

[3] Standards Mapping - Common Weakness Enumeration Top 25 2023, [24] CWE ID 863


********************************************************************************
解決:

把 command.Parameters.Add 改寫成 command.Parameters.AddWithValue,實際測試,再掃描一次就正常沒被報告。(這招不一定有效)

另一個方法,想辦法讓來源資料作些處理,讓 Fortify SCA認為它安全。例如:

query.Parameters.AddWithValue("@id", id);

改成

string id2 = Common.MyAntiXssFilter(id);

query.Parameters.AddWithValue("@id", id2);

using Ganss.Xss;

public class Common
{
    public static string MyAntiXssFilter(object inputObject)
    {
        // NuGet 要安裝 HtmlSanitizer
        // 要 using Ganss.Xss;
        string inputStr = "";
        if (inputObject != null)
        {
            inputStr = inputObject.ToString();
        }
        var sanitizer = new HtmlSanitizer();
        sanitizer.AllowedAttributes.Add("class");
        sanitizer.AllowedAttributes.Add("id");
        sanitizer.AllowedSchemes.Add("mailto"); // 允許 <a href="mailto:",因為公告使用
        //sanitizer.AllowedAttributes.Add("&"); // 沒用; 若處理網址, & 會變成 &amp;
        var sanitized = sanitizer.Sanitize(inputStr);
        sanitized = sanitized.Replace("&amp;", "&");
        return sanitized;
    }

}


(完)

相關

Access Control: Database
https://vulncat.fortify.com/zh-tw/detail?id=desc.dataflow.abap.access_control_database

沒有留言:

張貼留言