2024年3月11日 星期一

[研究]ASP.NET, Fortify SCA 報告CreateDirectory()有 Portability Flaw: File Separator (可移植性 缺陷檔案分隔符) 問題

[研究]ASP.NET, Fortify SCA 報告CreateDirectory()有 Portability Flaw: File Separator (可移植性 缺陷檔案分隔符) 問題

2024-03-11

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

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

【Fortify SCA】Details

Abstract:

由於使用了 Hardcoded 檔案分隔符號,因此在第 15 行呼叫 CreateDirectory() 會造成可移植性問題。

Explanation:

不同的作業系統會使用不同的字元來做為檔案分隔符號。例如,Microsoft Windows 系統使用的是「\」,而 UNIX 系統則使用「/」。若要在不同的平台上執行應用程式,則 Hardcoded 檔案分隔符號會導致應用程式邏輯的執行不正確,與可能的 Denial of Service。

在此案例中,Default.aspx.cs 的第 15 行呼叫 CreateDirectory() 時使用了硬式編碼的檔案分隔符號。

範例 1:以下程式碼使用 Hardcoded 檔案分隔符號來開啟檔案:

FileStream f = File.Create(directoryName + "\\" + fileName);

敝人註: "\\" 可寫成 @"\"

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

【Fortify SCA】Recommendations:

為了寫入行動程式碼,就要避免使用 Hardcoded 檔案分隔符號。請使用語言程式庫所提供的平台獨立 API。

範例 2:以下程式碼實作與 Example 1 相同的功能,但使用平台獨立 API 來指定檔案分隔符號:

FileStream f = File.Create(directoryName + Path.DirectorySeparatorChar.ToString() + fileName);


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

【ChatGPT】

User

ASP.NET, WebForm, 如何避免 Fortify SCA 報告下面程式有 Path Manipulation 問題

string fd = (string)ConfigurationManager.AppSettings["InformationSystemFiles"] + "\\";
if (!System.IO.Directory.Exists(fd))
{
  System.IO.Directory.CreateDirectory(fd);
} 

Fortify SCA 指出的 Path Manipulation 問題可能是由於在構建檔案路徑時未使用安全的方式。為了避免這個問題,你可以改用 Path.Combine 方法來建構檔案路徑,這樣可以確保路徑被正確地合併。

這裡是如何修改你的程式碼:


string folderPath = ConfigurationManager.AppSettings["InformationSystemFiles"];
string fullPath = Path.Combine(Server.MapPath(folderPath), ""); // 使用 MapPath 將相對路徑轉換為絕對路徑
if (!Directory.Exists(fullPath))
{
    Directory.CreateDirectory(fullPath);
}

這樣做的好處是,Path.Combine 會處理路徑分隔符號和驅動器名稱的差異,確保生成的路徑是正確格式的。同時,使用 Server.MapPath 將相對路徑轉換為絕對路徑,這樣可以確保你的應用程序可以正確地找到指定的資源路徑。

這樣做可以幫助你避免 Fortify SCA 報告中指出的 Path Manipulation 問題。

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

【實際測試】

Web.Config

<?xml version="1.0" encoding="utf-8"?>
<!--
  如需如何設定 ASP.NET 應用程式的詳細資訊,請前往
  https://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.8" />
    <httpRuntime targetFramework="4.8" />
  </system.web>
  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701" />
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
    </compilers>
  </system.codedom>
  <appSettings>
    <add key="TempFolder" value="D:\Production2\TempImageFiles\" /><!--有產生,Fortify SCA沒通過-->
    <add key="TempFolder2" value="\TempImageFiles2\" /><!--有產生,Fortify SCA通過-->
    <add key="TempFolder3" value="\TempImageFiles3\" /><!--沒產生-->
    <add key="TempFolder4" value="D:\Production4\TempImageFiles\" /><!--沒產生-->
    <add key="TempFolder5" value="D:\Production5\TempImageFiles\" /><!--有產生,Fortify SCA通過-->
    <add key="TempFolder6" value="\TempImageFiles6\" /><!--沒產生-->
  </appSettings>
</configuration>

Default.aspx

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

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
        </div>
    </form>
</body>
</html>


Default.aspx.cs

using System;
using System.Configuration;
using System.IO;

namespace WebApplication1
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //有產生,Fortify SCA 沒通過
            string fd = (string)ConfigurationManager.AppSettings["TempFolder"] + "\\";
            if (!System.IO.Directory.Exists(fd))
            {
                System.IO.Directory.CreateDirectory(fd);
            }

            //有產生,Fortify SCA 通過
            string fd5 = (string)ConfigurationManager.AppSettings["TempFolder5"] + Path.DirectorySeparatorChar.ToString();
            if (!System.IO.Directory.Exists(fd5))
            {
                System.IO.Directory.CreateDirectory(fd5);
            }

            //沒有產生,Fortify SCA 通過
            string fd6 = (string)ConfigurationManager.AppSettings["TempFolder6"] + Path.DirectorySeparatorChar.ToString();
            if (!System.IO.Directory.Exists(fd6))
            {
                System.IO.Directory.CreateDirectory(fd6);
            }

            //有產生,Fortify SCA 通過
            string folderPath = ConfigurationManager.AppSettings["TempFolder2"];
            string fullPath = Path.Combine(Server.MapPath(folderPath), ""); // 使用 MapPath 將相對路徑轉換為絕對路徑
            if (!Directory.Exists(fullPath))
            {
                Directory.CreateDirectory(fullPath);
            }

            //沒有產生,Fortify SCA 沒通過
            string fd3 = (string)ConfigurationManager.AppSettings["TempFolder3"] + "\\";
            if (!System.IO.Directory.Exists(fd3))
            {
                System.IO.Directory.CreateDirectory(fd3);
            }

            //System.Web.HttpException: ''D:/Production4/TempImageFiles/' 是實體路徑,但必須使用虛擬路徑。'
            //string folderPath4 = ConfigurationManager.AppSettings["TempFolder4"];
            //string fullPath4 = Path.Combine(Server.MapPath(folderPath4), ""); // 使用 MapPath 將相對路徑轉換為絕對路徑
            //if (!Directory.Exists(fullPath4))
            //{
            //    Directory.CreateDirectory(fullPath4);
            //}
        }
    }
}


(完)

相關

沒有留言:

張貼留言