[Checkmarx掃描漏洞處理] - Path traversal
當要下載/瀏覽的檔案路徑是經由組合出來的時候,就可能會有Path traversal的問題。
因為只要變更路徑為[../]就可以瀏覽上一層的資料夾,使用者就可以任意讀取網站內的檔案。
解決方法就是在讀取前先驗證檔案路徑是否符合瀏覽條件,因專案需求,驗證規則為檔案存在於根目錄下的任一資料夾即可
以遞迴的方式一層一層往下找檔案:
private string GetValidPathPart(string rootPath, string filePath)
{
string result = "";
string sFilePath = Path.GetFullPath(filePath);
string sFileName = Path.GetFileName(sFilePath).Replace("/", "").Replace("\\", "");
string sDirPath = Path.GetDirectoryName(sFilePath);
string rDirPath = Path.GetDirectoryName(rootPath);
if (rDirPath.ToLower() == sDirPath.ToLower() && File.Exists(Path.Combine(rDirPath, sFileName)))
{
result = sFilePath;
}
else
{
string[] dirs = Directory.GetDirectories(rootPath);
foreach (string dir in dirs)
{
if (dir.ToLower() == sDirPath.ToLower() && File.Exists(Path.Combine(dir, sFileName)))
{
result = sFilePath;
break;
}
else
{
result = GetValidPathPart(dir, filePath);
}
}
}
return result;
}
傳入的rootPath為要驗證的根目錄路徑,filePath則是組好的檔案路徑,
只要組好的檔案有存在於根目錄下任一資料夾(不限階層)即回傳該檔案路徑,否則回傳空字串。
如此就可以通過Checkmarx檢測囉~
P.S. 因本專案因framework版本問題,故用傳統的迴圈處理,也可以用Linq找檔案,做法可參考以下連結。
參考資料