程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> 設置NULL DACL權限描述符解決ASP.NET通過File Mapping與其他進程間通信

設置NULL DACL權限描述符解決ASP.NET通過File Mapping與其他進程間通信

編輯:關於ASP.NET

最近做了一個采用FileMapping進行進程間通信的程序,目的是希望通過這個程序實WebService和我寫的其他服務之間通信,實現安全隔離以及一些狀態的跟蹤、保持和管理。

做好後,先用兩個普通的Windows 進程測試了一下,在1.8G雙核筆記本電腦上,每秒鐘可以發送3萬個1000字節大小的消息,效率基本達到我的要求(我沒有把效率優化到極致,效率瓶頸和優化方法我基本知道,就是人懶,現在的方案已經可以達到系統要求,就暫時不想弄了,等以後有時間再優化吧)立即將客戶端移植到ASP.NET中,結果打開FileMapping失敗,立即意識到是權限問題。到網上搜了一遍,有網友說強制讓ASP.NET扮演系統管理員權限來解決,覺得不妥,一聽就覺得不是一個安全的解決方案。第二種是采用NULL DACL 權限描述符,賦予系統內核對象對任何用戶都開放的完全的訪問權限,這種方法比第一種好一些,不過攻擊者依然可以用很低的權限錄系統後對系統內核對象進行操作,破壞系統。第三種方法是只把服務自生和ASP.NET的權限描述符賦予系統內核對象,這種方法安全性最高。

網上代碼大多是C++寫的,我用C#先寫了一個NULL DACL 的代碼,用了一下,果然和預期的結果一樣,WebService可以和服務進程通訊了。把這個代碼給大家共享一下。第三種方法的代碼以後再補充。

NULL DACL 的C#寫法:

[StructLayoutAttribute(LayoutKind.Sequential)]
public struct SECURITY_DESCRIPTOR
{
public byte revision;
public byte size;
public short control;
public IntPtr owner;
public IntPtr group;
public IntPtr sacl;
public IntPtr dacl;
}
[StructLayout(LayoutKind.Sequential)]
public class SecurityAttributes : IDisposable
{
[DllImport("advapi32.dll", SetLastError = true)]
static extern bool SetSecurityDescriptorDacl(IntPtr sd, bool daclPresent,
IntPtr dacl, bool daclDefaulted);
[DllImport("advapi32.dll", SetLastError = true)]
static extern bool InitializeSecurityDescriptor(IntPtr pSecurityDescriptor,
uint dwRevision);
private int nLength;
private IntPtr lpSecurityDescriptor;
private int bInheritHandle;
public SecurityAttributes()
{
//Get SecurityAttributes size
nLength = Marshal.SizeOf(typeof(SecurityAttributes));
//Inherit handle
bInheritHandle = 1;
//Create a NULL DACL
SECURITY_DESCRIPTOR sd = new SECURITY_DESCRIPTOR();
//Alloc memory for security descriptor
lpSecurityDescriptor = Marshal.AllocCoTaskMem(Marshal.SizeOf(sd));
//Struct to Ptr
Marshal.StructureToPtr(sd, lpSecurityDescriptor, false);
InitializeSecurityDescriptor(lpSecurityDescriptor, 1);
SetSecurityDescriptorDacl(lpSecurityDescriptor, true, IntPtr.Zero, false);
}
public void Dispose()
{
lock (this)
{
if (lpSecurityDescriptor != IntPtr.Zero)
{
Marshal.FreeHGlobal(lpSecurityDescriptor);
lpSecurityDescriptor = IntPtr.Zero;
}
}
}
~SecurityAttributes()
{
Dispose();
}
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved