1. 数据库安全性
1.1. 尽量使用 Windows 身份验证而不是 SQL Server 验证
– 安全容易管理
–不需要在连接字符串中设置用户名和密码
– 可以通过密码策略保证安全
– 密码不会通过明文在网络中传递
1.2. 集成 Windows 身份验证
提供程序 语法
SqlClient Integrated Security=true;
-- or --
Integrated Security=SSPI;
OleDb Integrated Security=SSPI;
Odbc Trusted_Connection=yes;
OracleClient Integrated Security=yes;
1.3. SQL Server 身份验证
? SQL Server 身份验证
–强制实施密码策略
– 强制密码过期
–用户在下次登录时必须更改密码
2. 定义连接字符串
? Persist Security Info 关键字的默认设置为false。
? 如果将其设置为true 或yes,则允许在打开连接后通过连接获取安全敏感信息(包括用户ID 和密码)。
? 保持将PersistSecurity Info 设置为false,以确保不受信任的来源不能访问敏感的连接字符串信息。
3. 防止注入式攻击
3.1. 连接字符串注入式攻击
? 类似于 SQL 注入式攻击
? 在连接字符串中通过分号(;)来加入其它参数
? 例如:连接字符串通过下面方式拼接:
string constr = “server=(local);database=Northwind;
uid=sa;pwd=“ + password;
而输入
password=“password01!;Pooling=true;Min Pool Size=999999;Max Pool Size=999999;”
3.2. 连接字符串生成器
? ADO.NET 2.0 为每个 .NET Framework 数据提供程序引入了新的连接字符串生成器
? 从DbConnectionStringBuilder 继承
提供程序 ConnectionStringBuilder 类
System.Data.SqlClient SqlConnectionStringBuilder
System.Data.OleDb OleDbConnectionStringBuilder
System.Data.Odbc OdbcConnectionStringBuilder
System.Data.OracleClient OracleConnectionStringBuilder
3.3. 避免连接字符串注入式攻击
System.Data.SqlClient.SqlConnectionStringBuilder builder = new System.Data.SqlClient.SqlConnectionStringBuilder(); builder["Data Source"] = "(local)"; builder["integrated Security"] = true; builder["Initial Catalog"] = "AdventureWorks;NewValue=Bad"; Console.WriteLine(builder.ConnectionString);
输出结果:
data source=(local);Integrated Security=True; initial
catalog="AdventureWorks;NewValue=Bad"
4. 存储连接字符串
? 连接字符串可以存储在
–配置文件
– COM+ Catalog
– Windows 注册表
– 自定义文件结构
5. 加密连接字符串
? .NET 当中的加密算法
–对称算法(RSA)
– 非对称算法(3DES)
–数据保护(DPAPI)
6. 受保护的配置
? 使用受保护配置对连接字符串值进行加密的配置文件不以明文形式显示连接字符串,而是以加密形式存储它们
? 在对页进行请求时,.NET Framework 对连接字符串信息进行解密,并使其可供应用程序使用
6.1. 创建配置
? ASP.NET IIS 注册工具 (Aspnet_regiis.exe)
– 对Web.config 文件的节进行加密和解密、创建或删除密钥容器、导出和导入密钥容器信息以及管理对密钥容器的访问
? System.Configuration 命名空间中的受保护配置类
– DPAPIProtectedConfigurationProvider。使用Windows 数据保护API (DPAPI) 对数据进行加密和解密
– RsaProtectedConfigurationProvider。使用RSA 加密算法对数据进行加密和解密
6.2. 加密与解密 Web 配置节
? 加密Web 配置节
– aspnet_regiis -pe "connectionStrings" -app
"/SampleApplication" -prov
"RsaProtectedConfigurationProvider“
? 解密Web 配置节
– aspnet_regiis -pd "connectionStrings" -app
"/SampleApplication"