代码改变世界

数据访问技术系列课程 笔记(3) 处理连接字符串的安全性

2011-07-06 01:48  lujiao_cs  阅读(386)  评论(0编辑  收藏  举报

一)数据库安全性

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

 

SQL Server 身份验证

1)强制实施密码策略

2)强制密码过期

3)用户在下次登录时必须更改密码

 

二:定义连接字符串

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 加密算法对数据进行加密和解密

 

加密与解密Web 配置节

1)加密Web 配置节 

     – asppnet_reggiis -ppe "connectionStrings" -app

        "/SampleApplication" -prov 

        "RsaProtectedConfiggurationProvider"

2)解密Web 配置节 

     – aspnett_regiiiis -pdd ""connectitionStriings"" -app 

        "/SampleApplication"