[研究]Fortify SCA 報告 command.Parameters.Add 有 Access Control: Database 問題之解決
2022-08-18、2024-03-01更新
環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C#
********************************************************************************
問題:
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
********************************************************************************
另一個方法,想辦法讓來源資料作些處理,讓 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("&"); // 沒用; 若處理網址, & 會變成 & var sanitized = sanitizer.Sanitize(inputStr); sanitized = sanitized.Replace("&", "&"); return sanitized; } } |
(完)
相關
Access Control: Database
https://vulncat.fortify.com/zh-tw/detail?id=desc.dataflow.abap.access_control_database
沒有留言:
張貼留言