`
isiqi
  • 浏览: 15948904 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

ASP.NET - 保证数据访问的安全

阅读更多

大多数 ASP.NET Web 应用程序都涉及数据访问。许多应用程序都会收集数据并将其存储在数据库或文件中,要存储的数据通常基于来自用户的信息。由于原始数据可能来自不受信任的来源,信息是以持久格式存储的,并且您希望确保未经授权的用户不能直接访问您的数据源,因而您需要特别注意与数据访问有关的安全问题。

尽管遵循编码和配置最佳做法可以提高应用程序的安全性。但还有一点也很重要,那就是应经常执行 Microsoft Windows Internet 信息服务 (IIS) 的最新安全更新以及 Microsoft SQL Server 或其他数据源软件的所有安全更新,以使您的 Web 服务器始终保持在最新状态。

有关编写安全代码和保护应用程序的最佳做法的更详细信息,请参见 Michael Howard David LeBlanc 合著的“Writing Secure Code”(《编写安全代码》)一书,也可以参见“Microsoft Patterns and Practices”(Microsoft 模式与实践)网站中提供的指南。

一、保护数据源访问的安全

以下各节提供了有关帮助保护数据访问的不同方面的信息。

1.1、连接字符串

连接到数据库需要连接字符串。由于连接字符串可能包含敏感数据,因此您应当遵循以下准则:

·不要将连接字符串存储在页面中。例如,应避免通过声明 SqlDataSource 控件或其他数据源控件的属性的方式来设置连接字符串,而应当将连接字符串存储在站点的 Web.config 文件中。

·不要以纯文本形式存储连接字符串。为了确保与数据库服务器之间的连接的安全性,建议您使用受保护的配置来对配置文件中的连接字符串信息进行加密。

1.2、使用集成安全性连接到 SQL Server

如果可能,请使用集成安全性,而不要使用显式的用户名和密码连接到 SQL Server 实例。这有助于避免危及连接字符串的安全以及泄漏用户 ID 和密码。

建议您确保运行 ASP.NET 的进程(例如应用程序池)的标识是默认进程帐户或受限用户帐户。

如果不同的网站连接到不同的 SQL Server 数据库,那么使用集成安全性可能并不实际。例如,在 Web 宿主网站中,通常会为每个客户分配一个不同的 SQL Server 数据库,但所有用户均以匿名用户的身份使用 Web 服务器。在这种情况下,您需要使用显式凭据来连接到 SQL Server 实例。请确保以安全的方式存储凭据,如本主题的连接字符串中所述。

1.3SQL Server 数据库权限

建议您为用来连接到应用程序所使用的 SQL Server 数据库的用户 ID 分配最低特权。

1.4、限制 SQL 操作

数据绑定控件可以支持各种数据操作,包括在数据表中选择、插入、删除和更新记录等。建议您将数据控件配置为仅执行页上或应用程序中所需的最低功能。例如,如果控件不应该允许用户删除数据,则不要在数据源控件中包括删除查询,也不要在控件中启用删除功能。

1.5SQL Server Express Edition

在将某个进程附加到 SQL Server Express Edition 数据库(.mdf 文件)时,该进程必须具备管理权限。通常情况下,这种做法使得 SQL Server Express Edition 数据库不适合用在成品网站上,因为 ASP.NET 进程不会(也不应当)使用管理特权运行。因此,SQL Server Express Edition 数据库只能用于下面的情况中:

·在开发 Web 应用程序时用作测试数据库。在准备好部署应用程序时,可以将数据库从 SQL Server Express Edition 转移到 SQL Server 的成品实例中。

·如果您正在运行可以使用模拟功能的网站并且可以控制所模拟的用户的特权,那么可以使用该版本。实际上,此策略仅当应用程序运行于局域网(而非公共网站)上时才可行。

·将 .mdf 文件存储在站点的 App_Data 文件夹中,因为该文件夹的内容不会返回给直接的 HTTP 请求。还应在 IIS 中将 .mdf 扩展名映射到 ASP.NET,并在站点的 Web.config 文件中使用以下元素将该扩展名映射到 ASP.NET 中的 HttpForbiddenHandler 处理程序:

<httpHandlers>

<add verb="*" path="*.mdf" type="System.Web.HttpForbiddenHandler" />

</httpHandlers>

1.6Microsoft Access 数据库

Microsoft Access 数据库(.mdb 文件)所包括的安全功能比 SQL Server 数据库少。对于成品网站,建议您不要使用 Access 数据库。但是,如果您确实需要在 Web 应用程序中使用 .mdb 文件,请遵循以下准则:

·将 .mdb 文件存储在站点的 App_Data 文件夹中,因为该文件夹的内容不会返回给直接的 HTTP 请求。还应在 IIS 中将 .mdb 扩展名映射到 ASP.NET,并在站点的 Web.config 文件中使用以下元素将该扩展名映射到 ASP.NET 中的 HttpForbiddenHandler 处理程序:

<httpHandlers>

<add verb="*" path="*.mdb" type="System.Web.HttpForbiddenHandler" />

</httpHandlers>

·为读写 .mdb 文件的用户帐户添加适当的权限。如果网站支持匿名访问,这通常是本地 ASPNET 用户帐户或 NETWORK SERVICE 帐户。由于 Access 必须创建一个 .ldb 文件以支持锁定,因此用户帐户必须对包含 .mdb 文件的文件夹具备写权限。

·如果数据库采用密码保护,那么不要使用 AccessDataSource 控件来建立与数据库的连接,因为 AccessDataSource 控件不支持凭据的传递。在这种情况下,应使用 ODBC 提供程序和 SqlDataSource 控件,并在连接字符串中传递凭据。请务必按照本主题的连接字符串中的说明来保护连接字符串的安全。

1.7XML 文件

如果将数据存储在 XML 文件中,则应将 XML 文件放在网站的 App_Data 文件夹中,因为该文件夹的内容不会返回给直接的 HTTP 请求。

二、防止恶意用户输入

如果应用程序要接受用户输入,则需要确保输入中不包含可能危及应用程序的恶意内容。恶意用户输入可用于发动下面的攻击:

·脚本注入 脚本注入攻击试图向应用程序发送可执行的脚本,意欲使其他用户运行该脚本。典型的脚本插入攻击是向数据库中存储脚本的页发送脚本,以使查看数据的其他用户在不经意间运行该代码。

·SQL 注入 SQL 注入攻击试图创建 SQL 命令以取代或扩充应用程序内置的命令,从而危及数据库(可能还有运行数据库的计算机)的安全。

2.1、通用准则

对于所有用户输入,请遵循以下准则:

·尽可能使用验证控件,以限定用户输入可接受的值。

·在运行服务器代码之前,请始终确保 IsValid 属性的值为 true。如果值为 false,则意味着一个或多个验证控件未通过验证检查。

·应始终执行服务器端验证(即使浏览器也执行客户端验证)以防止用户跳过客户端验证环节。对于 CustomValidator 控件尤其应如此;不要使用“仅客户端验证”逻辑。

·始终在应用程序的业务层再次验证用户输入。不要依赖于调用进程来提供安全的数据。例如,如果正在使用 ObjectDataSource 控件,则可向执行数据更新的对象添加冗余验证和编码。

2.2、脚本注入

若要避免脚本注入攻击,请遵循以下准则:

·采用 HtmlEncode 方法对用户输入进行编码,该方法可将 HTML 转换为文本表示形式(例如,将 <b> 转换为 &ltb&gt;),这有助于防止在浏览器中执行标记。

·在使用参数对象将用户输入传递给查询时,可以为数据源控件的预查询事件添加处理程序并在这些事件中进行编码。例如,如果处理 SqlDataSource 控件的 Inserting 事件,可以在该事件中,在执行查询之前对参数值进行编码。

·如果正在使用带绑定字段的 GridView 控件,则可将 BoundField 对象的 HtmlEncode 属性设置为 true。这会使 GridView 控件在行处于编辑模式下时对用户输入进行编码。

·对于可以进入编辑模式的控件,建议您使用模板。例如,GridViewDetailsViewFormViewDataList Login 控件可以显示可编辑的文本框。但是,除 GridView 控件之外(请参见上一条),这些控件不会自动验证用户输入或对用户输入进行 HTML 编码。因此,建议您为这些控件创建模板,在模板中包括输入控件(例如 TextBox 控件)并添加验证控件。此外,在提取控件的值时,应对其进行编码。

2.3SQL 注入

若要避免 SQL 注入攻击,请遵循以下准则:

·不要通过将字符串(尤其是那些包括了用户输入的字符串)串联在一起来创建 SQL 命令,而应当使用参数化查询或存储过程。

·如果要创建参数化查询,则可使用参数对象来建立参数的值。

2.4、加密视图状态数据

数据绑定控件(例如 GridView 控件)有时需要保存被视为敏感内容的信息。例如,GridView 控件可能要在 DataKeys 属性中维护一个键的列表,即使该信息并不显示。在往返行程之间,控件会将该信息存储在视图状态中。

视图状态信息进行了编码,并与页的内容一起存储,未经授权的源无法解码和查看视图状态信息。如果必须在视图状态中存储敏感信息,可以要求页对视图状态数据进行加密。若要加密数据,请将页的 ViewStateEncryptionMode 属性设置为 true

2.5、缓存

建议在启用了客户端模拟并根据客户端标识检索数据源中的结果时,应避免在 Cache 对象中存储敏感信息。如果启用了缓存,则单个用户的缓存数据会被所有用户看到,并且敏感信息可能公开给有害源。如果 identity 配置元素的 impersonate 属性设置为 true 且对 Web 服务器上的应用程序禁用匿名标识,则说明启用了客户端模拟。

分享到:
评论

相关推荐

    十天学会ASP.net--我认为ASP.NET比ASP难很多,希望大家做好准备

    在ASP里面我们读取数据就直接用RECORDSET,然后在HTML代码里面穿插就可以显示了,但是ASP.NET讲究的是代码分离,如果还是这样显示数据就不能代码分离了。所以我们有两种方法:如果是读取一条记录的数据或者不多的...

    asp.net 通用数据访问类

    asp.net 通用数据访问类 ....asp.net 通用数据访问类

    考勤管理系统-asp.net-课设

    开发语言:ASP.NET , VB.NET 开发软件用的是Visual Studio .Net 2003 数据库开发用的是Microsoft SQL Server 2000 开发运行环境是IIS5.0和Windows.Net Framework 功能:对学生考勤情况进行查询、编辑、删除,统计...

    ActiveReports for .NET--灵活强大的.Net 报表制作控件

    数据访问-容易连接 具有OLEDB和SqlClient报表数据源 具有灵活的xml数据源 绑定到Dataset,DataView,DataTable和任何IListSource 控件 数据源属性能在运行时修改,生成ad hoc(动态)报表 灵活的非绑定...

    ASP.NET MVC 5入门指南(中文PDF+源码)

    ASP.NET MVC 5 - 从控制器访问数据模型 8. ASP.NET MVC 5 - 验证编辑方法和编辑视图 9. ASP.NET MVC 5 - 给电影表和模型添加新字段 10. ASP.NET MVC 5 - 给数据模型添加校验器 11. ASP.NET MVC 5 - 查询Details和...

    asp.net-sql2008公司人事管理系统.zip

    安全性保护:我们将使用ASP.NET提供的身份验证和授权功能,确保只有经过授权的用户可以访问敏感数据和功能。我们还将使用加密技术来保护用户的敏感信息,如密码和支付信息。 缓存管理:为了提高应用程序的性能,我们...

    asp.net通用数据访问类库的示例

    asp.net通用数据访问类库的示例: (1)反射实现根据模型生成增删改查sql语句 (2)泛型实现数据的通用访问 //--------------------------------小示例: public static DataSet GetDataSet() where T : class,new...

    ASP.NET Web 数据访问 [中文]

    ASP.NET Web 数据访问 [中文] ASP.NET Web 数据访问 [中文]

    ASP.NET-XML 深入编程技术(PDF)

    关于Asp.Net/XML深入编程的技术书,作者精心设计了66...全书由12章构成,内容包括.Net平台的建立、Asp.Net的Web Forms、控件、数据访问、Web Service、Asp.Net的设置和跟踪、Asp.Net的安全、Asp.Net的缓冲机制等技术。

    ASP.NET-某企业信息管理系统的设计与实现(源代码+thesis).zip

    安全性保护:我们将使用ASP.NET提供的身份验证和授权功能,确保只有经过授权的用户可以访问敏感数据和功能。我们还将使用加密技术来保护用户的敏感信息,如密码和支付信息。 缓存管理:为了提高应用程序的性能,我们...

    ASP.NET数据访问技术

    了解ASP.NET,掌握访问技术,更好的实现数据访问

    多语种技术应用研究-asp.net-课设

    中间业务层:负责处理用户输入的信息,或者是将这些信息发送给数据访问层进行保存,或者是调用数据访问层中的函数再次读出这些数据。中间业务层也可以包括一些对“商业逻辑”描述代码在里面。 数据访问层:仅实现对...

    ASP.NET ADO.NET 数据访问 Demo

    环境:Visual Studio 2008 + Sql Server 2005;这个Demo作为ASP.NET初学者学习ADO.NET数据访问内容有参考价值,数据库sql脚本也在里面了。

    ASP.NET数据访问层

    ASP.NET数据访问层,简单实用。下载吧。函数易读

    c# asp.net DAL数据访问层通用库源码

    c# asp.net DAL数据访问层通用库源码c# asp.net DAL数据访问层通用库源码c# asp.net DAL数据访问层通用库源码

    ASP.NET MVC5.pdf

    7. ASP.NET MVC 5 - 从控制器访问数据模型 8. ASP.NET MVC 5 - 验证编辑方法(Edit method)和编辑视图(Edit view) 9. ASP.NET MVC 5 - 给电影表和模型添加新字段 10. ASP.NET MVC 5 - 给数据模型添加校验器 11. ASP...

    深入ADO.NET开发-高级数据访问技术视频教程(C# ASP.NET SQL SERVER)

    微软特邀开发专家 付仲恺 讲师的ADO.NET视频讲座。深入浅出的讲解了ADO.NET高级数据库访问技术。 有理论,有实例,很好的ADO.NET教程。

    ASP.NET数据库访问技术

    详细讲述了ASP.NET数据访问技术!详细讲述了ASP.NET数据访问技术!详细讲述了ASP.NET数据访问技术!

    ASP.NET数据库访问基础

    ASP.NET数据库访问基础(Access数据库,SQL Server数据库)

Global site tag (gtag.js) - Google Analytics