首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

檔案與目錄存取控制 (二):新增存取規則、建立時預設安全與競態條件防護

     編輯:關於.NET

檔案與目錄操作 API 大同小異,本節示範 既有檔案新增規則 與 建立檔案時預設安全 兩種模式,並解釋為何後者能避免競態條件 (TOCTOU)。

既有檔案新增存取規則

using (FileStream file = new FileStream(
    @"E:\AclTest\acltest.txt", FileMode.Open, FileAccess.ReadWrite)) {
    
    FileSecurity security = file.GetAccessControl();
    
    var rule = new FileSystemAccessRule(
        new NTAccount(@"XuanHunComputer\xuanhun"),
        FileSystemRights.Read,
        AccessControlType.Allow);
    
    security.AddAccessRule(rule);
    file.SetAccessControl(security); // 持久化
}

建立檔案時直接指定安全描述符 (避免 TOCTOU)

FileSecurity security = new FileSecurity();
var rule = new FileSystemAccessRule(
    new NTAccount(@"XuanHunComputer\xuanhun"),
    FileSystemRights.Read,
    AccessControlType.Allow);
security.AddAccessRule(rule);

FileStream file = new FileStream(
    @"M:\temp\sample.txt",
    FileMode.CreateNew,
    FileSystemRights.Read,   // 存取權限
    FileShare.None,          // 共享模式
    4096,                    // 緩衝區大小
    FileOptions.None,
    security);               // 傳入安全描述符

關鍵差異對照

時機既有檔案建立新檔案
步驟順序開啟 → 取得安全 → 修改 → 持久化建構安全 → 建立檔案 (傳入安全)
競態視窗有 (建立與套用安全之間)無 (原子性建立)
需呼叫 SetAccessControl是否 (建構函數內完成)

為什麼預設繼承可能不安全?

  • 預設繼承自父目錄 DACL,權限可能過寬 (如 Everyone FullControl)
  • 建立後再修改留下 **機會視窗**:惡意程式可在視窗內劫持檔案、變更 DACL 導致建立者失去控制
  • 建立時傳入 FileSecurity 實現 **原子性安全建立**,消除視窗

最佳實務:敏感資料檔案**務必在 CreateNew 時指定 FileSecurity**;僅在無法預知權限 (如使用者上傳) 時採用事後修改,並儘量縮短視窗。


本文部分內容改編自《.NET 安全揭秘》
作者:玄魂
出處:https://www.cnblogs.com/xuanhun/

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved