2011-05-04 248 views
0

以下代碼始終顯示路徑操作問題。如何解決它?Fortify顯示嚴重漏洞File.Delete()操作C#

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 
using System.Text.RegularExpressions; 

namespace PathManipulation 
{ 
    class Program 
    { 
     public string dir = null; 
     public void someFunction(string fileName) 
     { 

      // File.Delete(Regex.Replace(dir + fileName, @"\..\", String.Empty)); 
      if (!(dir.IndexOf("//") >= 0) || !Regex.IsMatch(dir, "System32")) 
      { 
       String p = Regex.Replace(dir, @"..\", string.Empty); 
       DirectoryInfo di = new DirectoryInfo(p); 
       FileInfo[] fi = di.GetFiles(); 
       if (fi.Length > 0) 
       { 
        for (int i = 0; i < fi.Length; i++) 
        { 
         if (fi[i].ToString().Equals(fileName)) 
         { 

          Console.WriteLine(fi[i].ToString()); 
          fi[i].Delete(); 
         } 
        } 
        File.Delete(dir + fileName); 
       } 
      } 
      else 
      { 
       return; 
      } 


     } 

     static void Main(string[] args) 
     { 
      Program p = new Program(); 
      p.dir = args[0]; 
      p.someFunction(args[1]); 
     } 
    } 
} 
+1

請解釋一下自己。 – 2011-05-04 04:47:51

+0

你能給出一個輸入和產生的問題的例子嗎? – 2011-05-04 04:50:09

+0

String p = Regex.Replace(dir,@「.. \」,string.Empty);你想用這條線來實現什麼? – 2011-05-04 05:09:43

回答

1

是的,你打破了數據流,使最終用戶無法指定要刪除的文件。

例如:

public void someFunction(int fileIndex){ 
... 
    if (fileIndex == 0){ 
     File.Delete("puppies.txt"); 
    } 
    else if (fileIndex == 1){ 
     File.Delete("kittens.txt"); 
    } 
    else { 
     throw new IllegalArgumentException("Invalid delete index"); 
    } 
} 

這是一個極端的方式來解決問題,但它不會允許最終用戶刪除任何開發商沒有打算。

你的數據驗證檢查:

if (!(dir.IndexOf("//") >= 0) || !Regex.IsMatch(dir, "System32")) 

較弱。這被稱爲「黑名單」,攻擊者只需要找出你的支票遺漏的模式。因此,例如@「C:\ My Documents」。

相反,您應該考慮採用「白名單」方法。看一看https://www.owasp.org/index.php/Data_Validation#Accept_known_good是一個非常全面的例子。它沒有直接解決路徑注入問題。你只需要認真思考你期望得到的文件/目錄。如果輸入偏離那個,則拋出一個錯誤。通過一些測試,你將創建一個很好的白名單。