保护您的 ASP.NET 应用程序免受敏感数据泄露和信息泄露






4.81/5 (19投票s)
本文描述了开发人员如何无意中暴露敏感数据/信息泄露,以及如何防止这种情况发生。
引言
这是我的系列文章“保护您的 asp.net 应用程序”的第 4 部分。在本文中,我将描述我们有时会无意中向黑客暴露一些敏感信息或泄露一些信息,黑客利用这些信息来攻击我们。“敏感数据泄露”可以直接损害个人或组织,“信息泄露”则有助于攻击者执行恶意活动。这两个术语是相关的,我们可以说信息泄露可能包含敏感数据泄露,反之亦然。
背景
您可以从以下链接阅读本系列的上一篇文章:
敏感数据泄露
首先,您需要找出对您的业务而言什么是“敏感数据”。您的业务“条款和条件”是什么,或者您的“政策”是什么,或者您向您的消费者或客户提供什么产品。敏感数据可以直接损害个人或组织。
敏感数据包括密码、信用卡、个人信息,并且可能根据不同网站的业务政策包含电子邮件。
敏感数据泄露的影响
敏感数据可能因意外(应用程序错误或应用程序 bug)或黑客恶意行为而暴露。
- 对消费者和企业信誉造成负面影响,
- 财务损失(来自业务损失/信用卡详细信息被盗用),
- 可能会暴露信用卡详细信息、密码等。
ASP.NET 应用程序可能暴露敏感数据的多个点
正如我们在上图中所见,没有安全的地方,攻击者可以尝试从受害者(客户端)机器、受害者浏览器(缓存)、服务器配置、日志和临时文件、数据库(通过 SQL 注入或配置文件)中获取敏感数据。
如何防止敏感数据泄露
敏感数据可能被内部或外部泄露。
- 为了防止内部攻击,您需要控制谁能访问您的应用程序和数据备份,
- 为了防止外部攻击,您需要加密网络上的所有“敏感数据”,
- 在 .NET 应用程序中安全存储密码((ASP.NET 中更强的密码哈希),
- 禁用包含敏感数据的页面的缓存,
在 HTML 页面中
在页面标题中添加以下 META 标签-
<META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE"> <META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
在 ASP.NET 应用程序中
Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);
Response.Cache.SetNoStore();
或在 .aspx 页面中设置输出指令,将缓存设置为 0 秒过期。
<%@ OutputCache Duration="0" VaryByParam="None" %>
在 ASP.NET MVC 应用程序中
禁用控制器中的所有操作-
OutputCacheAttribute(VaryByParam = "*", Duration = 0, NoStore = true)] // will be applied to all actions in MyController, unless those actions override with t heir own decoration
public class MyController : Controller
{
// ...
}
禁用特定操作-
public class MyController : Controller { [OutputCacheAttribute(VaryByParam = "*", Duration = 0, NoStore = true)] // w ill disable caching for Index action only public ActionResult Index() { return View(); } }
5. 在收集敏感数据的页面上关闭自动完成功能。
<form id="Form1" method="post" runat="server" autocomplete="off"> //for whole page Or for a specific TextBox : <input type= "text" autocomplete="off"/> // in simple html <asp:TextBox ID="Textbox1" Runat="server" autocomplete="off"></asp:TextBox> //in asp.net aspx page
6. 不要不必要地存储敏感数据(例如,许多在线支付网关不存储信用卡详细信息,它们只是传递并忘记它),如果您想存储这些详细信息,则必须符合 PCI/DSS 标准。包括一些
- 保护存储的持卡人数据
- 在开放的公共网络上传输持卡人数据时进行加密。
加密配置文件真的有必要在 asp.net 中吗?现在我认为不是,因为 IIS7 不允许直接通过 URL 访问配置文件。IIS7 默认限制了它,它们通过请求筛选过滤每个请求,了解更多关于它的信息。但是,如果 Web 服务器已被攻破并允许远程访问服务器本身,那么加密的 Web.config 文件将是您最不担心的问题:P :D。
信息泄露
泄露系统数据或调试信息有助于攻击者了解系统并据此制定攻击计划。信息泄露不是直接攻击,它只是帮助攻击者收集系统信息,以便他可以进行任何其他攻击。
攻击者可以收集什么?
- 软件版本(这样攻击者就可以尝试找到该特定版本的漏洞)
- 系统类型(SQL Server、IIS、MySQL 等)
- 登录 ID 和电子邮件地址(现在攻击者只需要找到您的密码)
- 跟踪和调试信息
攻击者如何收集信息?
攻击者就像侦探一样收集有关受害者的所有信息。他们可以通过以下几种方式做到这一点:
1. 搜索引擎:搜索引擎会索引有关每个网站的信息,攻击者会从中受益。
- 索引调试/跟踪信息
- 查找任何组织文件
- 索引私人内容
- 索引错误
2. 玩弄应用程序(强制出错、分析 HTTP 标头等)
3. 自动化扫描工具。

- 连接字符串(凭据)
- 您的应用程序框架版本(帮助攻击者根据框架漏洞制定攻击计划)
- 虚拟目录路径
2. 查找组织文件
site:www.[domain_name].com .xls .doc .ppt //Precede your query with site: if you know you want your answer from a specific site or type of site
攻击者尝试导致任何应用程序(Asp.net)出错,并收集有关其版本的信息。在最坏的情况下,他们可以收集连接字符串、凭据等。

- 通过导致任何 asp.net 应用程序出错来暴露连接字符串(这是最糟糕的情况,我只是展示攻击者如何破解任何 asp.net 应用程序,我知道现在没有人使用这种编码标准,但仍然如此。)
- 编码实现风格
- 应用程序的物理位置
- Asp.net 版本已暴露

- MVC 应用程序
- 框架版本为 4.0
- 服务器为 Microsoft-IIS
5. 登录页面/注册页面有助于攻击者判断电子邮件地址是否有效(例如:黑客尝试登录许多 Web 应用程序,使用 administrator@domain.com,当注册页面告知该 ID 已存在时,他们可以确认此电子邮件)。
以上提到的都只是攻击者如何收集应用程序信息的几个例子。可能还有其他方法。
如何防止 Asp.net 应用程序的信息泄露
1. 发生任何错误时,始终重定向到错误页面(不要透露任何错误信息)
在 Asp.Net 应用程序中
步骤 1:根据错误创建相应的错误页面/页面
步骤 2:在应用程序的 web.config 中设置发生任何错误时的默认重定向
<system.web> <customErrors mode="RemoteOnly" defaultRedirect="~/Error.aspx"></customErrors> <!-- your rest configuration of system.web--> </system.web>
自定义错误节点将导致应用程序重定向到defaultRedirect
节点值页面。customErrors
有三种模式:On/Off/RemoteOnly。我个人使用 RemoteOnly,因为它仅在应用程序部署后自动工作,而不是在开发时工作,因此我可以在开发时看到错误并修复它们。
使用customErrors
节点,您可以根据响应标头的状态码进行重定向。
<customErrors mode="RemoteOnly" defaultRedirect="~/ErrorPages/Oops.aspx"> <error statusCode="404" redirect="~/ErrorPages/404.aspx" /> </customErrors>
在 Asp.Net MVC 应用程序中
步骤 1:创建一个错误控制器
步骤 2:再次像 asp.net 应用程序一样,在 web.config 中进行设置
<customErrors mode="On" defaultRedirect="~/Error"> <error redirect="~/Error/NotFound" statusCode="404" /> </customErrors>
对于不同的状态码,您可以从控制器重定向到不同的视图
public class ErrorController : Controller { public ViewResult Index() { return View("Error"); } public ViewResult NotFound() { Response.StatusCode = 404; return View("NotFound"); } }
默认错误视图:(您也可以根据状态码创建)
@model System.Web.Mvc.HandleErrorInfo @{
ViewBag.Title = "Error";
} <hgroup class="title">
<h1 class="error">Error.</h1>
<h2 class="error">An error occurred while processing your request.</h2>
</hgroup>
2. 禁用跟踪
在 Asp.Net 和 Asp.Net MVC 应用程序的<system.web>
节点中,将 web.config 中的 trace enabled 设置为 false。
<trace enabled="false"/>
3. 始终以发布模式部署
提示:上述第 1、2、3 点可以通过 Asp.net 的RetailMode
功能来实现。
RetailMode
是 Asp.Net 一个鲜为人知的功能,它会启用自定义错误、禁用跟踪、为系统上运行的所有应用程序以发布模式编译。
- 启用自定义错误
- 禁用跟踪
- 以发布模式编译
如何启用零售模式?
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config C:\Windows\Microsoft.NET\Framework\"Your Version of framework"\Config
步骤 2:打开 machine.config 文件 > 查找<system.web>
节点
步骤 3:在此下方启用零售模式
<deployment retail="true" />
4. 删除不必要的 HTTP 标头
X-AspNet-Version
、X-AspNetMvc-Version
、X-Powered-By
和Server
HTTP 标头没有直接的好处,并且不必要地占用了少量带宽。
- 删除
X-AspNet-Version
:在<System.web>
下添加<httpRuntime enableVersionHeader="false"/>
- 删除
X-AspNetMvc-Version
:在Global.asax.cx
文件中添加MvcHandler.DisableMvcResponseHeader = true;
- 删除服务器标头:请参考此链接
- 删除或编辑
X-Powered-By
:IIS7 管理器 > HTTP 响应标头 > 删除
