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 服务器上的应用程序禁用匿名标识,则说明启用了客户端模拟。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值