手机版

ASP.NET 2.0中的操作数据71:保护连接字符串和其他设置信息

时间:2021-10-30 来源:互联网 编辑:宝哥软件园 浏览:

导言:

ASP.NET应用程序的设置信息通常存储在名为Web.config的XML文件中.在教程的前一部分,我们已经修改了Web.config文件几次。例如,在第一章中,当我们创建一个名为Northwind的数据集时,数据库连接字符串信息被自动添加到Web.config文件的connectionStrings节点。稍后,在第三章中,我们手动更新了Web.config文件,添加了pages元素,并将DataWebControls主题应用于所有ASP.NET页面。

由于Web.config文件中包含连接字符串等敏感信息,因此保证Web.config文件内容的安全性非常重要,这些敏感信息应该对未经授权的访问者进行隐藏。默认情况下,对带有后缀的文件的任何HTTP请求。配置将由ASP.NET引擎处理。它将返回消息“这种类型的页面不被服务”,如图1所示。这意味着访问者不能通过键入“http://www。YourServer.com/Web.config'"在他们浏览器的地址栏里。

//files.jb51.net/file_images/article/201605/2016051911235961.png

图1:通过浏览器访问Web.config将返回消息“这种类型的页面不被服务”。

但是如果攻击者找到了另一种方法来访问您的Web.config文件的内容呢?他会做出什么样的改变?我们采取什么步骤来保护Web.config文件中的这些信息?幸运的是,Web.config文件中的大多数节点都不包含敏感信息。如果攻击者知道您的ASP.NET页面中使用的默认主题的名称,会造成什么样的损害?

Web.config文件中的某些节点包含敏感信息,如连接字符串、用户名、密码、服务器名、加密密钥等。我们可以在以下节点中找到这些信息:在本文中,我们将研究保护这些敏感信息的技术。我们将会看到。NET Framework版包含一个保护配置系统,可以方便地对选中的配置节点进行加密和解密。

注意:在本文的最后,我们将看到微软关于从ASP.NET应用程序连接到数据库的建议。除了加密连接字符串,我们还可以以“安全模式”连接到数据库,使您的系统更加强大。

步骤1:检查ASP.NET 2.0的保护配置选项。

ASP。NET 2.0包括一个受保护的配置系统,用于加密和解密配置信息。这些方法包含在。NET框架,并可用于程序配置信息的加密和解密。受保护的配置系统使用提供者模型模式。它允许开发人员选择执行哪种加密。

那个。NET Framework包括两个受保护的配置提供程序:rsapertedconfigurationprovider:非对称RSA算法用于加密和解密。

Windows数据保护应用编程接口(DPAPI)用于加密和解密。dpapiprotected配置提供程序3360。

由于保护配置系统实现了提供者设计模式,我们可以创建自己的保护配置提供者,并将其应用到自己的程序中。具体流程请参考文章《Implementing a Protected Configuration Provider》(http://msdn2.microsoft.com/en-us/library/wfc2t3az(vs . 80)。aspx)。

RSA提供者和DPAPI提供者在加密和解密时使用“密钥”,这些“密钥”可以存储在“机器级”和“用户级”。在这种情况下,机器级别的密钥是理想的:每个web应用程序都运行在自己的专有服务器上。或者服务器上的多个应用程序共享相同的加密信息。用户级密钥是共享服务器环境中理想的安全选择。此时,同一服务器上的其他程序无法解密您的加密配置信息。

本教程的示例将使用DPAPI提供程序和机器级密钥。具体来说,我们将加密Web.config文件中的connectionStrings节点。有关RSA提供程序和用户级密钥的更多信息,请参考本文末尾的扩展阅读材料。

注意:在machine.config文件中,RSA protected configuration provider和dpapi protected configuration provider分别被分组到RSA protected configuration provider和data protectionconfiguration provider中。当我们对配置信息进行加密或解密时,我们需要提供相应的提供者名称(即RSA protected configurationprovider或data protectionconfigurationprovider);而不是实际的类型名称(即RSAProtectedconfiguration提供程序和DPAPIProtectedconfiguration提供程序)。您可以在文件夹$ Windows $/Microsoft中找到machine.config文件。NET/框架/版本/配置。

第二步:通过编程加密和解密来配置节点。

使用提供者,我们只需要几行代码来加密或解密配置节点。这些代码只需要引用相应的配置节点,调用其ProtectSection或UnprotectSection方法,然后调用Save方法执行即可。此外。NET Framework包含一个非常有用的用于加密和解密的命令行函数,我们将在步骤3中研究它。

为了便于演示,我们需要创建一个带有按钮的ASP.NET页面,以便对Web.config文件的connectionStrings节点进行加密和解密。

在AdvancedDAL文件夹中打开EncryptingConfigSections.aspx页面,将一个TextBox控件拖动到该页面,并将其ID设置为WebConfigContents;TextMode属性为MultiLine;“宽度”和“行”属性分别为95%和15%。TextBox控件用于显示Web.config文件的内容,以查看内容是否加密。当然,在真实的程序中,我们无法显示Web.config文件的内容。

在TextBox控件下添加两个Button控件,其id分别为EncryptConnStrings和DecryptConnStrings;将文本属性设置为“加密连接字符串”和“解密连接字符串”。

此时,您的界面看起来如下所示:

//files.jb51.net/file_images/article/201605/2016051911235962.png

图2:在页面上添加一个文本框控件和两个按钮控件。

然后,当页面第一次登录时,我们需要在带有WebConfigContents标识的TextBox控件中显示Web.config文件的内容。在页面的背景类中添加以下代码,该代码添加一个名为DisplayWebConfig的方法。在页面加载事件处理程序中,当页面。如果IsPostBack为false,则调用方法:

受保护的void Page_Load(对象发送方,EventArgs e){ //在第一次页面访问时,调用DisplayWebConfig方法if(!页面。IsPostBack)DisplayWebConfig();} private void DisplayWebConfig(){//读入Web.config的内容,并在TextBox stream reader webconfig stream=File中显示。打开文本(路径。合并(请求。PhysicalApplicationPath,' web . config ');字符串configContents=webConfigStream。ReadToEnd();webConfigStream。close();WebConfigContents。文本=配置内容;DisplayWebConfig方法调用File类来打开应用程序的Web.config文件;调用StreamReader类类将内容读入字符串;然后调用Path类来获取Web.config文件的物理地址。这三个类都位于系统中。IO命名空间。因此,我们应该增加使用系统。后台类顶部的IO声明,或者在这些类前面加上“System.IO .”前缀。

接下来,我们需要为这两个按钮的Click事件添加事件处理程序,并使用机器级密钥来加密和解密DPAPI提供程序中的connectionStrings节点。在设计器中,双击这两个按钮以添加Click事件处理程序并添加以下代码:

受保护的void EncryptConnStrings _ Click(对象发送方,EventArgs e){ //获取有关Web.config的配置信息配置=网络配置管理器.OpenWebConfiguration(请求.应用程序路径);//让我们使用连接字符串部分配置部分连接字符串=配置GetSection(' connectionStrings ');if (connectionStrings!=null) //只有在节尚未受到保护的情况下才加密节,如果(!连接字符串.部分信息。受到保护){//使用//数据保护配置提供程序提供程序应用程序设置加密连接字符串部分部分信息。ProtectSection(' data protection configuration provider ');配置save();//刷新Web.config显示DisplayWebConfig();} }受保护的void DecryptConnStrings _ Click(对象发送方,EventArgs e){ //获取有关Web.config的配置信息配置=网络配置管理器.OpenWebConfiguration(请求.应用程序路径);//让我们使用连接字符串部分配置部分连接字符串=配置GetSection(' connectionStrings ');if (connectionStrings!=null) //只有在(连接字符串)受保护的情况下,才解密该节部分信息。受到保护){//解密连接字符串部分连接字符串部分信息。UnprotectSection();配置save();//刷新Web.config显示DisplayWebConfig();}}这2个按钮的事件处理器的代码几乎是一样的。它们一开始都通过网络配置管理器类类的OpenWebConfiguration方法获取当前应用程序的Web.config文件的信息。该方法根据指定的有效路径返回网配置文件。接下来,再通过配置类类的获取部分(部分名称)方法访问Web.config文件的应用程序设置节点。该方法返回一个配置部分对象。

该配置部分对象包含了一个部分信息属性,用来阐述加密节点的其它相关信息。就像上面的代码显示的那样,我们通过查看部分信息的受到保护属性来判断是否对配置节点进行了加密。此外,还可以通过部分信息的保护部分(提供商)和取消保护措施方法对节点进行加密或解密。

保护部分(提供商)方法有一个字符串类型的输入参数,该参数指定了用来加密的受保护的配置提供程序的名称。在加密字符串按钮的事件处理器里,我们将"数据保护配置提供程序"传递给保护部分(提供商)方法,因此指明了用到的是数据保护提供程序。而取消保护措施方法可以确定加密时用到的提供商,因此不需要任何的输入参数。

调用保护部分(提供商)或取消保护措施方法后,我还必须调用配置对象的保存方法方法来进行具体的操作。一旦完成加密或解密并保存后,我们调用显示网络配置方法将更新后的Web.config文件的内容上传到文本框控件。

键入上述代码后,在浏览器里测试EncryptingConfigSections.aspx页面,最开始你将看到页面将Web.config文件的应用程序设置节点的内容以纯文本的形式展示出来。

//files.jb51.net/file_images/article/201605/2016051911235963.png

图3:显示应用程序设置节点的内容

现在,点击"加密连接字符串"按钮,如果"请求确认"(请求验证)处于激活状态的话,回传页面时将抛出一个http requestsvalidationexception异常,显示一个消息:"潜在危险的请求。从客户端检测到表单值。这个请求验证,在ASP .NET 2.0里默认为处于激活状态,禁止服务器接受含有未编码的超文本标记语言的内容,它被设计来保护服务器免受注入式脚本的攻击。可以从页面或应用程序来禁止该功能。我们在该页禁用它,在页面声明代码的顶部的的@Page标记里ValidateRequest设置为假的,如下:

“% @”页面验证请求=“false”.%禁用此功能后,再次点击“加密连接字符串”按钮,页面返回后即可访问配置文件。使用DPAPI提供程序加密连接字符串节点。然后,文本框控件显示网页配置文件的更新内容。如图4所示,connectionStrings节点的信息现在被加密了。

//files.jb51.net/file_images/article/201605/2016051911235964.png

图4:单击“加密连接字符串”按钮来加密连接字符串节点。

在加密之前,我临时传输了密码数据元素的内容:

connectionStrings configProtectionProvider=' data protectionconfigurationprovider ' EncryptedData CipherData ciphevalueaqaancmnd 8 bfderjhoawe/.zChw==/Ciphevalue/cipher data/encrypted data/connectionStrings注意:connectionStrings元素指定用于加密的提供程序(即data protectionconfigurationprovider)。取消保护方法将在单击“解密连接字符串”按钮时使用此信息。对于加密的连接字符串,系统可以自动解密它们。简而言之,我们不需要向加密的connectionString节点添加任何其他代码。让我们做一个验证,打开前面的教程,比如(~/basic reporting/simple display . aspx page)。如图5所示,页面工作正常,这表明加密的连接字符串被ASP.NET页面自动解密。

//files.jb51.net/file_images/article/201605/2016051911235965.png

图5:数据访问层自动解密连接字符串信息。

要将加密的连接字符串节点恢复为纯文本样式,请单击“解密连接字符串”按钮。页面发布回来后,您会看到Web.config文件中的连接字符串恢复为纯文本样式。此时,屏幕看起来像初始登录(见图3)。

步骤3:用aspnet _ regiis.exe加密配置节点

那个。NET Framework包含许多命令行工具,可以在文件夹$ windows $/Microsoft中找到。net/框架/版本/文件夹。以第59章《使用SQL缓存依赖项SqlCacheDependency》为例。我们使用aspnet_regsql.exe命令行工具为sql缓存依赖关系添加必要的架构。这个文件夹中的另一个有用的工具是ASP.NET IIS注册工具。顾名思义,这个ASP.NET IIS注册工具主要用于在微软专业版Web服务器和IIS上注册ASP.NET 2.0应用程序。

除了与IIS相关的属性之外,ASP.NET IIS注册工具还可以加密和解密Web.config文件的配置节点。以下是使用aspnet _ regiis.exe命令行工具加密配置节点的一般代码:

aspnet _ regis . exe-PEF部分物理_目录-prov provider

Section是要加密的配置节点(如“连接字符串”);Physical_directory是web应用程序根节点的完整物理路径;该提供程序是所使用的受保护配置提供程序的名称(如“data protectionconfigurationprovider”)。此外,如果在IIS中注册web应用程序,可以用等效路径替换绝对路径:

aspnet _ regis . exe-PE部分-app虚拟目录-prov provider

以下是使用aspnet _ regiis.exe的示例,该示例使用DPAPI提供程序和机器级密钥加密connectionStrings节点:

ASPNET _ regis . exe-PEF ' connectionstrings ' ' c :/网站/ASPNET _ Data _ Tutorial _ 73 _ CS '-prov ' Data protectionconfigurationprovider '

同样,aspnet _ regiis.exe命令行工具也可以用来解密配置节点,但是我们需要用-pdf或-pd替换-pef。当然,解密时不需要指定提供者名称。

aspnet _ regis . exe-pdf section physical _ directory-or-aspnet _ regis . exe-pdsection-app virtual _ directory注意:因为我们使用的是DPAPI提供程序,所以它使用的密钥是由计算机指定的。因此,您必须在存储网页的同一台计算机上运行aspnet _ regiis.exe工具。例如,如果在本地计算机上运行此命令行,然后将加密的连接字符串上载到另一台服务器,则服务器无法解密它,因为加密密钥是在本地计算机上指定的。如果使用RSA提供程序,则不存在此限制,因为RSA提供程序可以将密钥(RSA密钥)传递给另一台计算机。

了解数据库身份验证选项。

在任何应用程序向Microsoft SQL Server数据库发送选择、插入、更新或删除请求之前,数据库必须首先确定请求者的身份。这个过程可以分为两种身份验证模式:身份验证和SQL Server provides:Windows身份验证:当ASP.NET应用程序在Visual Studio 2005的ASP.NET开发服务器上运行时,ASP。net应用程序假设身份是当前登录用户。另一方面,如果它运行在Microsoft internet information server(IIS)上,则假定ASP.NET应用程序的身份是域名/机器名或域名/网络服务,尽管这些可以由用户自定义。SQL身份验证:应该提供用户标识和密码进行身份验证。如果使用SQL身份验证,可以通过连接字符串提供标识和密码。

通常使用Windows身份验证模式,因为它更安全。在Windows身份验证模式下,连接字符串不需要用户名和密码,如果web服务器和数据库服务器属于不同的计算机,(凭据)身份验证在网络之间传输时不会以纯文本格式传输。在SQL身份验证模式下,连接字符串将被硬编码,身份验证将以纯文本格式在web服务器和数据库服务器之间传输。

本教程使用Windows身份验证。我们可以使用连接字符串来查看使用了哪种身份验证。本教程的Web.config文件具有以下连接字符串:

数据源=。/SQLEXPRESS;AttachDbFilename=| DataDirectory |/NORTHWND。中密度纤维板;集成安全性=真;用户实例=真

术语“集成安全性=真”和缺少用户名和密码表明我们使用的是Windows身份验证模式。但是,在某些连接字符串中,使用了术语“可信连接=是”或“集成安全性=SSPI”,而不是“集成安全性=真”,但它们都表明使用了Windows身份验证。

下面的代码显示使用了SQL身份验证:

服务器=服务器名;数据库=北风;uid=userIDpwd=密码

假设攻击者可以查看应用程序的Web.config文件。如果您使用SQL身份验证模式通过互联网连接到数据库,攻击者可以使用连接字符串通过SQL Management Studio或他自己网站上的ASP.NET页面连接到您的数据库。为了降低风险,我们需要加密Web.config文件的连接字符串。

注意:有关SQL Server中不同身份验证模式的更多信息,请参考文章《Building Secure ASP.NET Applications: Authentication, Authorization, and Secure Communication》(http://MDS N2 . Microsoft.com/en-us/library/aa 302392 . aspx);有关Windows和SQL身份验证之间差异的更多示例,请参考ConnectionStrings.com网站。

结论:

默认情况下,所有带有。浏览器无法访问ASP.NET应用程序中的配置后缀。这是因为这些文件可能包含一些敏感信息,如数据库连接字符串、用户名和密码等。中包含的保护配置系统。NET 2.0可以通过加密指定的配置节点来保护。有两个内置的受保护配置提供程序:一个使用RSA算法,另一个使用Windows数据保护API (DPAPI)。

本文研究了使用DPAPI提供程序对配置信息进行加密和解密。我们可以使用编程,就像步骤2中讨论的那样。您也可以使用aspnet _ regiis.exe命令行工具,如步骤3中所述。有关使用RSA提供程序和用户级密钥的更多信息,请参考本文的扩展阅读。

编程快乐!

作者简介

Scott Mitchell,本系列教程的作者,也是关于ASP/ASP的六本书的作者。NET,是4GuysFromRolla.com的创始人,自1998年以来一直使用微软的网络技术。你可以点击查看所有教程《[翻译]Scott Mitchell 的ASP.NET 2.0数据教程》,希望能帮助你学习ASP.NET。

版权声明:ASP.NET 2.0中的操作数据71:保护连接字符串和其他设置信息是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。