SQL Server數據庫對連接字符串的安全性處理
本文我們主要介紹了關于SQL Server數據庫連接字符串的定義以及它的安全性問題的一些知識,接下來就讓我們一起來了解一下這一過程吧。
一、數據庫安全性
1)盡量使用Windows身份驗證而不是SQL Server 驗證。
安全容易管理:使用Windows身份驗證:連接時需要寫一個Windows集成的安全性,連接時使用的是本機正在使用的用戶,或者是IIS正在連接到SQL Server的用戶。使用集成的用戶連接到SQL Server。在Web應用程序,我們需要了解是哪個用戶連接到了SQL Server,默認下,放在IIS的虛擬目錄應用程序,用集成的身份驗證訪問SQL Server,會通過IIS里的aspnet虛擬用戶訪問后臺的SQL數據庫。就需要指定它的權限來訪問數據庫。 如果通過希望客戶端,集成Windows身份驗證,需要在IIS里面對這個用戶指定權限。Asp.net仍然后使用aspnet用戶,需要通過web.config模擬<identity>結點來配置,就可以將IE傳過來的用戶傳到后臺,但是注意連接過多的話,因為每個人連接集成不一樣,不會使用連接池。
使用SQL Server 驗證:連接到后臺的SQL Server要知道哪個用戶,連接時需要輸入用戶名和密碼。
不需要在連接字符串中設置用戶名和密碼:在登錄時輸入用戶名和密碼,更加安全,由Windows控制。用戶名和密碼放在本機的數據庫里面,放在與環境里面。
可以通過密碼策略保證安全:比如:在域環境里面,指定密碼策略,保證密碼的復雜度,密碼不重復。
密碼不會通過明文在網絡中傳遞,集成Windows 身份驗證:
- SqlClient : Integrated Security = true or Integrated Security = SSPI
- OleDb :Integrated Security = true
- Odbc :Trusted_Connection = yes ;
- OracleClient :Integrated Security = true
二、定義連接字符串
1)Persist Security Info的默認設置為 false。
2)如果將其設置為TRUE 或FALSE,則允許再打開連接后通過獲取安全敏感信息(包括用戶ID和密碼)確保的連接之后不會返回到應用程序。
3)保持將Persist Security Info顯示的設置為false ,以確保不受信任的來源不能訪問連接字符串。
DEMO1: 修改Persist Security Info
- using System;
- using System.Data.SqlClient;
- namespace 修改Persist_Security_Info
- {
- class Program
- {
- static void Main(string[] args)
- {
- //persist Security Info = false
- SqlConnection conn2 = new SqlConnection("server=.;database=Test;uid =sa;pwd=sa; Persist Security Info = false");
- conn2.Open();
- if (!string.IsNullOrEmpty(conn2.ConnectionString))
- {
- Console.WriteLine(conn2.ConnectionString);
- }
- conn2.Close();
- //persist Security Info = true
- SqlConnection conn1 = new SqlConnection("server=.;database=Test;uid=sa;pwd=sa;Persist Security Info = true;");
- conn1.Open();
- if (!string.IsNullOrEmpty(conn1.ConnectionString))
- {
- Console.WriteLine(conn1.ConnectionString);
- }
- conn1.Close();
- }
- }
- }
三、連接字符串的注入式攻擊
有些連接是通過SQL Server身份驗證連接的,比如:企業里面的Windows應用程序,輸入用戶名密碼就是登錄(SQL Server的用戶名和密碼),權限(能看哪些數據,不能看哪些數據)是通過SQL Server來控制的。
1)類似于SQl 注入式攻擊。
2)在連接字符串中通過封號來加入其他的參數。
3)例如: str = constr ="server= .; database=Test;uid =sa ;pwd="+password ;輸入的是: password= "sa; Pooling = true ;Min Pool Size = 999999 ; Max Pool Szzie = 999999;"
解決方法——>使用連接字符串生成器
1)ADO.NET2.0 為不同數據庫提供程序引入了新的連接字符串生成器
2)從DbConnectionStringBuilder繼承:
提供程序 |
ConnectionStringBuilder類 |
System.Data.SqlClient |
SqlConnectionStringBuilder |
System.Data.OleDb |
OleDbConnectionStringBuilder |
System.Data.Odbc |
OdbcConnectionStringBuilder |
System.Data.OracleClient |
OracleConnectionStringBuilder |
便于不同數據庫提供程序連接字符串的編寫。
可以避免連接字符串注入式攻擊(還可以用 '.' 運算符賦值)
DEMO2:連接字符串生成器。
- private void button1_Click(object sender, EventArgs e)
- {
- SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
- builder.DataSource = txtServer.Text.Trim();
- builder.InitialCatalog = txtDb.Text.Trim();
- builder.UserID = txtDb.Text.Trim();
- builder.Password = txtPwd.Text.Trim();
- this.txtConStr.Text = builder.ConnectionString;
- }
四、存儲連接字符串
將整個連接字符串存儲,不希望被查看連接字符串。
方法一:放在一個不知道的地方
方法二:加密
連接字符串存儲在:
1)配置文件(不隱蔽)。
2)COM+Catalog。
3)Windows注冊表里面。
4)自定義文件結構。
DEOM3:在配置文件中存儲連接字符串。
Load事件:
- private void Form1_Load(object sender, EventArgs e)
- {
- //連接字符串直接保存在 App.config里面
- ConnectionStringSettings settings = ConfigurationManager.ConnectionStrings["strCon"];
- this.textBox1.Text = settings.ConnectionString;
- //連接通過configSource保存在 connectionString.config
- this.txtCon.Text = ConfigurationManager.AppSettings["conn"].ToString();
- }
- App.config:
- <?xml version="1.0" encoding="utf-8" ?>
- <configuration>
- <connectionStrings >
- <add name="strCon" connectionString="server=.;database=Test;uid=sa;pwd=sa"/>
- </connectionStrings>
- <!--在connectionString.config文件里面指定 appSettings 節點的配置
- 便于單獨對這個節點進行加密 [需要將connectionString.confi復制到輸出目錄下,否則
- App.config找不到]-->
- <appSettings configSource="connectionString.config"/>
- </configuration>
- connectionString.config:
- <appSettings>
- <add key="conn" value="server=.;database=Test;uid=sa;pwd=sa"/>
- </appSettings>
五、加密連接字符串
.NET當中的加密算法:
1)對稱算法(3DES) :保存密鑰。
2)非對稱算法(RSA) :通過公鑰(保存在XML里面)控制加密解密。
3)數據保護(DPAPI) :不是加密算法,而是使用DPAPI(一個WindowsAPI,數據保護的API,使用Windows本機用戶的安全性)。
六、受保護的配置
1)使用受保護配置對連接字符串值進行加密的配置文件不以明文形式顯示連接字符串, 而是以加密形式存儲它們。
2)在對頁進行請求時在對頁進行請求時,.NET Framework 對連接字符串信息進行解密,并使其可供應用程序使用。
創建配置
1)ASP.NET IIS 注冊工具(Aspnet_regiis.exe)
– 對Web.config文件(其他的文件也是一樣的)的節進行加密和解密、創建或刪除密鑰容器、導出和導入密鑰容器信息以及管理對密鑰容器的訪問。
2)System.Configuratiion 命名空間中的受保護配置命名空間中的類。
– DPAPIProtectedConfigurationProvider。使用Windows 數據保護API (DPAPI) 對數據進行加密和解密。
– RsaProtectedConfigurationProvider 。使用RSA 加密算法對數據進行加密和解密。
關于SQL Server數據庫連接字符串的安全性問題就介紹到這里了,希望本次的介紹能夠對您有所幫助。
【編輯推薦】