總結ADO.NET安全數(shù)據(jù)訪問技巧
我們在一個項目中首要考慮的就安全的問題,這里就我在項目中總結的一點ADO.NET安全數(shù)據(jù)訪問方面的知識做一個詳細的介紹。編寫安全的 ADO.NET 代碼,必須了解基礎數(shù)據(jù)存儲(即數(shù)據(jù)庫)中提供的安全機制。您還需要考慮應用程序可能包含的其他功能或組件對安全性的影響。
1.身份驗證、授權和權限
連接到 Microsoft SQL Server 后,您便可以使用 Windows 身份驗證(也稱為集成安全),它使用當前活動 Windows 用戶的標識,而不是傳遞用戶 ID 和密碼。由于不會在連接字符串中公開用戶憑據(jù),因此強烈建議使用 Windows 身份驗證。如果無法使用 Windows 身份驗證連接到 SQL Server,請考慮使用 SqlConnectionStringBuilder 在運行時創(chuàng)建連接字符串。
#T#用于身份驗證的憑據(jù)需要根據(jù)應用程序的類型進行不同地處理。例如,在 Windows 窗體應用程序中,可以提示用戶提供身份驗證信息,也可以使用用戶的 Windows 憑據(jù)。但是,Web 應用程序通常使用應用程序自身提供的憑據(jù)來訪問數(shù)據(jù),而不是使用用戶提供的憑據(jù)。用戶經(jīng)過身份驗證后,其操作范圍取決于向他們授予的權限。始終遵循最小特權原則,并且僅授予絕對必需的權限。
2.參數(shù)化命令和 SQL 注入
使用參數(shù)化命令可幫助抵御 SQL 注入攻擊,這種攻擊的攻擊者會將命令“注入”SQL 語句,從而危及服務器的安全。通過確保將從外部源接收的值僅作為值(而不是作為 Transact-SQL 語句的一部分)進行傳遞,參數(shù)化命令可抵御 SQL 注入攻擊。這樣,便不會在數(shù)據(jù)源中執(zhí)行插入到值中的 Transact-SQL 命令。相反,只會將這些命令作為參數(shù)值來計算。除具備安全優(yōu)勢外,參數(shù)化命令還提供一種便捷方法,使用該方法可組織隨 Transact-SQL 語句傳遞或傳遞到存儲過程的值。
3.ADO.NET安全數(shù)據(jù)訪問對腳本攻擊
腳本攻擊是另一種形式的注入,它使用插入到網(wǎng)頁中的惡意字符。瀏覽器無法驗證這些插入字符,并且會將它們作為頁面的一部分進行處理。
4.保護 Microsoft Access 和 Excel 數(shù)據(jù)源
當具有最少的安全要求或沒有安全要求時,Microsoft Access 和 Microsoft Excel 可充當 ADO.NET 應用程序的數(shù)據(jù)存儲區(qū)。其安全功能作為一種阻止手段固然有效,但其作用僅限于阻止不了解情況的用戶亂摸亂動而已。Access 和 Excel 的物理數(shù)據(jù)文件位于文件系統(tǒng)上,并且注定可供所有用戶訪問。這使得這些文件易受到攻擊,從而導致文件失竊或數(shù)據(jù)丟失,因為他人可輕松復制或更改這些文件。如果需要強有力的安全措施,請使用 SQL Server 或其他基于服務器的數(shù)據(jù)庫,這樣便無法從文件系統(tǒng)讀取物理數(shù)據(jù)文件。
5.ADO.NET安全數(shù)據(jù)訪問企業(yè)服務
COM+ 包含其自己的安全模型,該模型依賴于 Windows NT 帳戶和進程/線程模擬。System.EnterpriseServices 命名空間提供的包裝允許 .NET 應用程序通過 ServicedComponent 類來集成托管代碼與 COM+ 安全服務。
6.與非托管代碼交互
.NET Framework 提供與非托管代碼(包括 COM 組件、COM+ 服務、外部類型庫及許多操作系統(tǒng)服務)的交互。使用非托管代碼時會超出托管代碼的安全邊界。您的代碼和調用它的任何代碼都必須具有非托管代碼權限(指定了 UnmanagedCode 標志的 SecurityPermission)。非托管代碼會無意中將安全漏洞引入您的應用程序中。因此,除非絕對必要,否則應避免與非托管代碼進行交互。