保护连接字符串

保护连接字符串

摘自MSDN

保护对数据源的访问是安全应用程序最重要的目标之一。为了帮助限制对数据源的访问,必须保护连接信息(例如用户标识、密码和数据源名称)的连接信息。以纯文本形式存储用户标识和密码(例如在源代码中)会造成严重的安全问题。即使为外部源提供包含用户标识和密码信息的编译版代码,编译的代码也可能会被反汇编,用户标识和密码可能会被使用 MSIL 反汇编程序 (Ildasm.exe) 工具公开。因此,关键信息(如用户标识和密码)一定不要存在于代码中。

指定 Windows 身份验证(集成安全性)

建议您尽可能使用 Windows 身份验证(也称为集成安全性)。连接字符串中使用的语法依提供程序而异。下表显示 .NET Framework 数据提供程序所使用的语法。

提供程序

语法

SqlClient

复制代码 Integrated Security=true;

SqlClient, OleDb

复制代码 Integrated Security=SSPI;

Odbc

复制代码 Trusted_Connection=yes;

OracleClient

复制代码 Integrated Security=yes;

注意,在对 OleDb 提供程序使用 Integrated Security=true 时会引发异常。

安全注意

如果在连接字符串中将 Persist Security Info 关键字设置为 true 或 yes,将允许在打开连接后,从连接中获得涉及安全性的信息(包括用户标识和密码)。如果在建立连接时必须提供用户标识和密码,最安全的方法是在使用信息打开连接后丢弃这些信息,在 Persist Security Info 设置为 false 或 no 时会发生这种情况。当您向不可信的源提供打开的连接,或将连接信息永久保存到磁盘时,这点尤其重要。如果将 Persist Security Info 保持为 false,可帮助确保不可信的源无法访问连接中涉及安全性的信息,并帮助确保任何涉及安全性的信息都不会随连接字符串信息永久保存到磁盘中。默认情况下,Persist Security Info 设置为 false。

不要使用通用数据链接文件

可以在通用数据链接 (UDL) 文件中提供 OleDbConnection 的连接信息;但是,应避免这样做。UDL 文件未加密,会以明文的形式公开连接字符串信息。因为 UDL 文件对应用程序来说是基于外部文件的资源,所以,无法使用 .NET Framework 保护其安全。

将连接字符串存储在配置文件中

为了避免将连接字符串存储在代码中,可以将代码存储在 ASP.NET 应用程序的 web.config 文件中以及 Windows 应用程序的 app.config 文件中。

连接字符串可以存储在配置文件的 <connectionStrings> 元素中。连接字符串存储为键/值对的形式,可以在运行时使用名称查找存储在 connectionString 属性中的值。以下配置文件示例显示名为 DatabaseConnection 的连接字符串,该连接字符串引用连接到 SQL Server 本地实例的连接字符串。

<connectionStrings>
<add name="DatabaseConnection"
connectionString="Persist Security Info=False;Integrated Security=SSPI;database=Northwind;server=(local);"
providerName="System.Data.SqlClient" />
</connectionStrings>

从配置文件中检索连接字符串

System.Configuration 命名空间提供使用配置文件中存储的配置信息的类。ConnectionStringSettings 类具有两个属性,映射到上面所示的 <connectionStrings> 示例部分中显示的名称。 ConnectionString

连接字符串。 Name

<connectionStrings> 部分的连接字符串的名称。

以下示例通过将连接字符串的名称传递给 ConfigurationManager,再由其返回 ConnectionStringSettings 对象,以便从配置文件中检索字符串。ConnectionString 属性用于显示此值。

Visual Basic

Option Explicit On
Option Strict On
Imports System.Configuration
Module Module1
Sub Main()
Dim settings As ConnectionStringSettings
settings = _
ConfigurationManager.ConnectionStrings("DatabaseConnection")
If Not settings Is Nothing Then
Console.WriteLine(settings.ConnectionString)
End If
End Sub
End Module

C#

using System;
using System.Configuration;
class Program
{
static void Main()
{
ConnectionStringSettings settings;
settings =
ConfigurationManager.ConnectionStrings["DatabaseConnection"];
if (settings != null)
{
Console.WriteLine(settings.ConnectionString);
}
}
}

使用受保护的配置加密连接字符串

“受保护的配置”功能可以用于加密配置文件(例如 ASP.NET 应用程序的 Web.config 文件或 Windows 应用程序的 App.config 文件)中的敏感信息,包括用户名和密码、数据库连接字符串和加密密钥。请参见使用受保护的配置加密配置信息对配置节进行加密和解密演练:使用受保护的配置加密配置信息

通过用户输入构造连接字符串

如果从外部源(例如提供用户标识和密码的用户)获取连接字符串信息,必须验证来自该源的所有输入,确保其格式正确并且不包含影响连接的其他参数。有关详细信息,请参见验证用户输入

使用连接字符串生成器

DbConnectionStringBuilder 类提供用于派生强类型化的连接字符串生成器的基类。这些生成器使您可以通过编程创建语法上正确的连接字符串以及分析和重建现有的连接字符串。可以使用 DbConnectionStringBuilder 类分配任意键/值对,并将生成的连接字符串传递给强类型化的提供程序。以下作为 .NET Framework 的一部分提供的数据提供程序提供从 DbConnectionStringBuilder 继承的强类型化的类:

请参见

任务 如何:确保使用数据源控件时连接字符串的安全

概念 使用连接字符串 加密和数据访问 Securing the User's Password

其他资源 保证 ADO.NET 应用程序的安全 使用受保护的配置加密配置信息

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员八阿哥

王老板Python面试(9):整理的最全 python常见面试题(基本必考)

1)迭代器是一个更抽象的概念,任何对象,如果它的类有next方法和iter方法返回自己本身。对于string、list、dict、tuple等这类容器对象,使用...

1591
来自专栏草根专栏

用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 + 项目准备

REST 是 Representational State Transfer 的缩写. 它是一种架构的风格, 这种风格基于一套预定义的规则, 这些规则描述了网络...

1.1K6
来自专栏SDNLAB

OpenDaylight Lithium-SR2 Cluster集群搭建

目的 希望大家能够通过本教程对OpenDaylight集群的基本概念如shard/基本配置有所了解,感受OpenDaylight的High Availabili...

3485
来自专栏LEo的网络日志

shell技巧分享(三)

3358
来自专栏Android 研究

Android插件化基础3----Android的编译打包流程详解

.apk文件其实就是一个压缩包,把文件的后缀改成.zip,用压缩软件解压搜就可的下图(我是mac)

1911
来自专栏程序员互动联盟

【答疑释惑第三十六讲】Windows下如何调试?

疑惑一 Windows窗口程序到底能不能用printf? 很多小伙伴在控制台下写程序时,要打印或者调试很方便,用printf就可以直接打印输出,方便看结果,但是...

2694
来自专栏智能算法

Python学习(九)---- python中的线程

原文地址: https://blog.csdn.net/fgf00/article/details/52773459 编辑:智能算法,欢迎关注! 上期我们一起学...

1512
来自专栏Java帮帮-微信公众号-技术文章全总结

Python常见面试题【悟空教程】

1.MySQL 数据库总结 MySQL 可以建多少个数据库,理论上是没有限制的,每一个数据库可以有上亿的对象,但是一般基于硬件要求、效率问题一般不超过64个, ...

1612
来自专栏求索之路

Android数据层架构的实现 上篇

最近我们app的服务器吃不消了,所以我在为服务器增加缓存层之后,又想到在app端进行二级缓存以减少app对服务器的访问。我想很多app应该在项目的初期架构的时...

3078
来自专栏Java帮帮-微信公众号-技术文章全总结

RabbitMQ详解解答【面试+工作】

如果安装rabbitMQ首先安装基于erlang语言支持的OTP软件,然后在下载rabbitMQ软件进行安装(安装过程都是下一步,在此不在说了)

3131

扫码关注云+社区

领取腾讯云代金券