你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
安全框架:配置管理 | 缓解措施
产品/服务 | 项目 |
---|---|
Web 应用程序 | |
Database | |
Web API | |
IoT 设备 | |
IoT 现场网关 | |
IoT 云网关 | |
计算机信任边界 | |
Azure 存储 | |
WCF |
实施内容安全策略 (CSP) 并禁用内联 JavaScript
标题 | 详细信息 |
---|---|
组件 | Web 应用程序 |
SDL 阶段 | 构建 |
适用的技术 | 泛型 |
属性 | 空值 |
参考 | 内容安全策略简介、内容安全策略参考、内容安全策略简介、是否可以使用 CSP? |
步骤 | 内容安全策略 (CSP) 是一种深度防护安全机制,也是一项 W3C 标准,可让 Web 应用程序所有者控制其站点中嵌入的内容。 CSP 以 HTTP 响应标头的形式添加在 Web 服务器上,由浏览器在客户端实施。 它是基于允许列表的策略 - 网站可以声明一组受信任的域,通过这些域可以加载 JavaScript 之类的活动内容。 CSP 提供以下安全优势:
|
示例
示例策略:
Content-Security-Policy: default-src 'self'; script-src 'self' www.google-analytics.com
此策略只允许从 Web 应用程序的服务器和 google 分析服务器加载脚本。 从其他任何站点加载的脚本会被拒绝。 在网站上启用 CSP 后,以下功能会自动禁用以缓解 XSS 攻击。
示例
内联脚本不会执行。 下面是内联脚本的示例
<script> some JavaScript code </script>
Event handling attributes of HTML tags (for example, <button onclick="function(){}">
javascript:alert(1);
示例
不会将字符串作为代码评估。
Example: var str="alert(1)"; eval(str);
启用浏览器的 XSS 筛选器
标题 | 详细信息 |
---|---|
组件 | Web 应用程序 |
SDL 阶段 | 构建 |
适用的技术 | 泛型 |
属性 | 空值 |
参考 | XSS 保护筛选器 |
步骤 | X-XSS-Protection 响应标头配置控制浏览器的跨站点脚本筛选器。 此响应标头可使用以下值:
这是一个 Chromium 函数,它利用 CSP 违规报告将详细信息发送到所选的 URI。 最后两个选项被视为安全值。 |
ASP.NET 应用程序在部署之前必须禁用跟踪和调试
标题 | 详细信息 |
---|---|
组件 | Web 应用程序 |
SDL 阶段 | 构建 |
适用的技术 | 泛型 |
属性 | 空值 |
参考 | ASP.NET 调试概览、ASP.NET 跟踪概览、如何:启用 ASP.NET 应用程序跟踪、如何:启用 ASP.NET 应用程序调试 |
步骤 | 为页面启用跟踪后,请求该页面的每个浏览器也会获取包含有关内部服务器状态和工作流的数据的跟踪信息。 该信息可能是安全敏感信息。 为页面启用调试后,服务器上发生的错误会导致向浏览器提供完整的堆栈跟踪数据。 该数据可能会透露有关服务器工作流的安全敏感信息。 |
仅从受信任源访问第三方 JavaScript
标题 | 详细信息 |
---|---|
组件 | Web 应用程序 |
SDL 阶段 | 构建 |
适用的技术 | 泛型 |
属性 | 空值 |
参考 | 空值 |
步骤 | 只应从受信任源引用第三方 JavaScript。 引用终结点应始终在 TLS 连接中。 |
确保在经过身份验证的 ASP.NET 页面中整合 UI 伪装或点击劫持防御机制
标题 | 详细信息 |
---|---|
组件 | Web 应用程序 |
SDL 阶段 | 构建 |
适用的技术 | 泛型 |
属性 | 空值 |
参考 | OWASP 点击劫持防御速查表、Internet Explorer 内部 - 使用 X-Frame-Options 阻击点击劫持 |
步骤 | 点击劫持也称“UI 伪装攻击”,是指攻击者使用多个透明或不透明的层,在用户想要点击顶层页面时,诱使用户点击另一个页面上的按钮或链接。 这种分层是通过编写使用 iframe 的恶意页面,加载受害者的页面来实现的。 因此,攻击者正是“劫持”了用户原本要在其页面上的点击,将他们路由到很有可能是由其他应用程序和/或域拥有的另一个页面。 若要阻止点击劫持攻击,请设置适当的 X-Frame-Options HTTP 响应标头,指示浏览器不要允许来自其他域的框架设计 |
示例
可以通过 IIS web.config 设置 X-FRAME-OPTIONS 标头。永远不应设计框架的站点 Web.config 代码片段:
<system.webServer>
<httpProtocol>
<customHeader>
<add name="X-FRAME-OPTIONS" value="DENY"/>
</customHeaders>
</httpProtocol>
</system.webServer>
示例
只应由同一域中的页面设计框架的站点 Web.config 代码:
<system.webServer>
<httpProtocol>
<customHeader>
<add name="X-FRAME-OPTIONS" value="SAMEORIGIN"/>
</customHeaders>
</httpProtocol>
</system.webServer>
确保已在 ASP.NET Web 应用程序中启用 CORS 的情况下只允许受信任的来源
标题 | 详细信息 |
---|---|
组件 | Web 应用程序 |
SDL 阶段 | 构建 |
适用的技术 | Web 窗体、MVC5 |
属性 | 空值 |
参考 | 空值 |
步骤 | 浏览器安全性将阻止网页向另一个域发出 AJAX 请求。 这种限制称为同域策略,可阻止恶意站点读取另一个站点中的敏感数据。 但是,有时可能需要安全公开可由其他站点使用的 API。 跨域资源共享 (CORS) 是一项 W3C 标准,可让服务器放宽同域策略。 使用 CORS,服务器可以显式允许某些跨域请求,同时拒绝另一些跨域请求。 与 JSONP 等早期技术相比,CORS 更安全且更灵活。 从核心上讲,启用 CORS 就相当于在 Web 应用程序中添加了一些 HTTP 响应标头 (Access-Control-*),这可以通过多种方式来实现。 |
示例
如果可以访问 Web.config,则可通过以下代码添加 CORS:
<system.webServer>
<httpProtocol>
<customHeaders>
<clear />
<add name="Access-Control-Allow-Origin" value="https://example.com" />
</customHeaders>
</httpProtocol>
示例
如果无法访问 Web.config,则可通过添加以下 C# 代码来配置 CORS:
HttpContext.Response.AppendHeader("Access-Control-Allow-Origin", "https://example.com")
请注意,务必将“Access-Control-Allow-Origin”属性中的来源列表设置为一组有限的受信任来源。 不当地配置此列表(例如,将值设置为“*”)会使得恶意站点能够毫无限制地向 Web 应用程序触发跨域请求,从而使应用程序易于遭受 CSRF 攻击。
在 ASP.NET 页面中启用 ValidateRequest 属性
标题 | 详细信息 |
---|---|
组件 | Web 应用程序 |
SDL 阶段 | 构建 |
适用的技术 | Web 窗体、MVC5 |
属性 | 空值 |
参考 | 请求验证 - 阻止脚本攻击 |
步骤 | 请求验证是 ASP.NET 版本 1.1 中的一项功能,可阻止服务器接受包含未编码 HTML 的内容。 此功能的目的是帮助防止一些脚本注入攻击,在这种情况下,会将客户端脚本代码或 HTML 不知不觉地提交到服务器、存储,然后向其他用户提供。 尽管如此,我们仍旧强烈建议验证所有输入数据和 HTML,并在适当的情况下将其编码。 请求验证的执行方式是将所有输入数据与潜在危险值的列表进行比较。 如果出现匹配项,ASP.NET 将引发 |
示例
但是,可在页面级别禁用此功能:
<%@ Page validateRequest="false" %>
或者在应用程序级别
<configuration>
<system.web>
<pages validateRequest="false" />
</system.web>
</configuration>
请注意,MVC6 管道不支持且不包括请求验证功能。
使用本地托管的最新版本的 JavaScript 库
标题 | 详细信息 |
---|---|
组件 | Web 应用程序 |
SDL 阶段 | 构建 |
适用的技术 | 泛型 |
属性 | 空值 |
参考 | 空值 |
步骤 | 使用 JQuery 等标准 JavaScript 库的开发人员必须使用不包含已知安全漏洞的、批准的通用 JavaScript 库版本。 适当的做法是使用最新的库版本,因为它们包含其旧版本中已知漏洞的安全修补程序。 如果由于兼容性原因而无法使用最新版本,应使用以下最低版本。 可接受的最低版本:
切勿从外部站点(例如公共 CDN)加载任何 JavaScript 库 |
禁用自动 MIME 探查
标题 | 详细信息 |
---|---|
组件 | Web 应用程序 |
SDL 阶段 | 构建 |
适用的技术 | 泛型 |
属性 | 空值 |
参考 | IE8 安全性第五部分:全面保护、MIME 类型 |
步骤 | X-Content-Type-Options 标头是一个 HTTP 标头,可让开发人员指定不应该对其内容使用 MIME 探查。 此标头旨在缓解 MIME 探查攻击。 对于可能包含用户可控内容的每个页面,必须使用 HTTP 标头 X-Content-Type-Options:nosniff。 若要针对应用程序中的所有页面全局启用所需的标头,可执行以下操作之一 |
示例
如果应用程序由 Internet Information Services (IIS) 7 及更高版本托管,请在 web.config 文件中添加该标头。
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="X-Content-Type-Options" value="nosniff"/>
</customHeaders>
</httpProtocol>
</system.webServer>
示例
通过全局 Application_BeginRequest 添加该标头
void Application_BeginRequest(object sender, EventArgs e)
{
this.Response.Headers["X-Content-Type-Options"] = "nosniff";
}
示例
实现自定义的 HTTP 模块
public class XContentTypeOptionsModule : IHttpModule
{
#region IHttpModule Members
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.PreSendRequestHeaders += newEventHandler(context_PreSendRequestHeaders);
}
#endregion
void context_PreSendRequestHeaders(object sender, EventArgs e)
{
HttpApplication application = sender as HttpApplication;
if (application == null)
return;
if (application.Response.Headers["X-Content-Type-Options "] != null)
return;
application.Response.Headers.Add("X-Content-Type-Options ", "nosniff");
}
}
示例
对于特定的页面,只能通过将所需的标头添加到单个响应来启用该标头:
this.Response.Headers["X-Content-Type-Options"] = "nosniff";
在 Windows Azure 网站中删除标准服务器标头避免留下指纹
标题 | 详细信息 |
---|---|
组件 | Web 应用程序 |
SDL 阶段 | 构建 |
适用的技术 | 泛型 |
属性 | EnvironmentType - Azure |
参考 | 在 Windows Azure 网站中删除标准服务器标头 |
步骤 | Server、X-Powered-By、X-AspNet-Version 等标头会透露有关服务器和底层技术的信息。 建议取消这些标头,从而防止留下应用程序的指纹 |
为数据库引擎访问配置 Windows 防火墙
标题 | 详细信息 |
---|---|
组件 | 数据库 |
SDL 阶段 | 构建 |
适用的技术 | SQL Azure、OnPrem |
属性 | 不适用,SQL 版本 - V12 |
参考 | 如何配置 Azure SQL 数据库防火墙、为数据库引擎访问配置 Windows 防火墙 |
步骤 | 防火墙系统有助于阻止对计算机资源进行未经授权的访问。 要通过防火墙访问 SQL Server 数据库引擎的实例,必须将运行 SQL Server 的计算机上的防火墙配置为允许这种访问 |
确保已在 ASP.NET Web API 中启用 CORS 的情况下只允许受信任的来源
标题 | 详细信息 |
---|---|
组件 | Web API |
SDL 阶段 | 构建 |
适用的技术 | MVC 5 |
属性 | 空值 |
参考 | 在 ASP.NET Web API 2 中启用跨域请求、ASP.NET Web API - ASP.NET Web API 2 中的 CORS 支持 |
步骤 | 浏览器安全性将阻止网页向另一个域发出 AJAX 请求。 这种限制称为同域策略,可阻止恶意站点读取另一个站点中的敏感数据。 但是,有时可能需要安全公开可由其他站点使用的 API。 跨域资源共享 (CORS) 是一项 W3C 标准,可让服务器放宽同域策略。 使用 CORS,服务器可以显式允许某些跨域请求,同时拒绝另一些跨域请求。 与 JSONP 等早期技术相比,CORS 更安全且更灵活。 |
示例
在 App_Start/WebApiConfig.cs 中,将以下代码添加到 WebApiConfig.Register 方法
using System.Web.Http;
namespace WebService
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// New code
config.EnableCors();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
}
示例
可按如下所示,将 EnableCors 特性应用到控制器中的操作方法:
public class ResourcesController : ApiController
{
[EnableCors("http://localhost:55912", // Origin
null, // Request headers
"GET", // HTTP methods
"bar", // Response headers
SupportsCredentials=true // Allow credentials
)]
public HttpResponseMessage Get(int id)
{
var resp = Request.CreateResponse(HttpStatusCode.NoContent);
resp.Headers.Add("bar", "a bar value");
return resp;
}
[EnableCors("http://localhost:55912", // Origin
"Accept, Origin, Content-Type", // Request headers
"PUT", // HTTP methods
PreflightMaxAge=600 // Preflight cache duration
)]
public HttpResponseMessage Put(Resource data)
{
return Request.CreateResponse(HttpStatusCode.OK, data);
}
[EnableCors("http://localhost:55912", // Origin
"Accept, Origin, Content-Type", // Request headers
"POST", // HTTP methods
PreflightMaxAge=600 // Preflight cache duration
)]
public HttpResponseMessage Post(Resource data)
{
return Request.CreateResponse(HttpStatusCode.OK, data);
}
}
请注意,务必将 EnableCors 特性中的来源列表设置为一组有限的受信任来源。 不当地配置此列表(例如,将值设置为“*”)会使得恶意站点能够毫无限制地向 API 触发跨域请求,从而使 API 易于遭受 CSRF 攻击。 可在控制器级别修饰 EnableCors。
示例
若要对类中的特定方法禁用 CORS,可按如下所示使用 DisableCors 特性:
[EnableCors("https://example.com", "Accept, Origin, Content-Type", "POST")]
public class ResourcesController : ApiController
{
public HttpResponseMessage Put(Resource data)
{
return Request.CreateResponse(HttpStatusCode.OK, data);
}
public HttpResponseMessage Post(Resource data)
{
return Request.CreateResponse(HttpStatusCode.OK, data);
}
// CORS not allowed because of the [DisableCors] attribute
[DisableCors]
public HttpResponseMessage Delete(int id)
{
return Request.CreateResponse(HttpStatusCode.NoContent);
}
}
标题 | 详细信息 |
---|---|
组件 | Web API |
SDL 阶段 | 构建 |
适用的技术 | MVC 6 |
属性 | 空值 |
参考 | 在 ASP.NET Core 1.0 中启用跨域请求 (CORS) |
步骤 | 在 ASP.NET Core 1.0 中,可以使用中间件或 MVC 启用 CORS。 使用 MVC 启用 CORS 时,将使用相同的 CORS 服务,但使用 CORS 中间件启用 CORS 时则不是这样。 |
方式 1 使用中间件启用 CORS:要为整个应用程序启用 CORS,请使用 UseCors 扩展方法将 CORS 中间件添加到请求管道。 使用 CorsPolicyBuilder 类添加 CORS 中间件时,可以指定跨域策略。 可通过两种方式实现此目的:
示例
第一种方式是使用 lambda 调用 UseCors。 lambda 使用一个 CorsPolicyBuilder 对象:
public void Configure(IApplicationBuilder app)
{
app.UseCors(builder =>
builder.WithOrigins("https://example.com")
.WithMethods("GET", "POST", "HEAD")
.WithHeaders("accept", "content-type", "origin", "x-custom-header"));
}
示例
第二种方式是定义一个或多个命名的 CORS 策略,并在运行时按名称选择策略。
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy("AllowSpecificOrigin",
builder => builder.WithOrigins("https://example.com"));
});
}
public void Configure(IApplicationBuilder app)
{
app.UseCors("AllowSpecificOrigin");
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
});
}
方式 2 在 MVC 中启用 CORS:开发人员也可以使用 MVC 按操作、按控制器或者针对所有控制器全局应用特定的 CORS。
示例
按操作:要为特定的操作指定 CORS 策略,请将 [EnableCors] 特性添加到该操作。 指定策略名称。
public class HomeController : Controller
{
[EnableCors("AllowSpecificOrigin")]
public IActionResult Index()
{
return View();
}
示例
按控制器:
[EnableCors("AllowSpecificOrigin")]
public class HomeController : Controller
{
示例
全局:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.Configure<MvcOptions>(options =>
{
options.Filters.Add(new CorsAuthorizationFilterFactory("AllowSpecificOrigin"));
});
}
请注意,务必将 EnableCors 特性中的来源列表设置为一组有限的受信任来源。 不当地配置此列表(例如,将值设置为“*”)会使得恶意站点能够毫无限制地向 API 触发跨域请求,从而使 API 易于遭受 CSRF 攻击。
示例
若要为控制器或操作禁用 CORS,请使用 [DisableCors] 特性。
[DisableCors]
public IActionResult About()
{
return View();
}
加密 Web API 配置文件中包含敏感数据的部分
标题 | 详细信息 |
---|---|
组件 | Web API |
SDL 阶段 | 部署 |
适用的技术 | 泛型 |
属性 | 空值 |
参考 | 如何:使用 DPAPI 加密 ASP.NET 2.0 中的配置部分、指定受保护的配置提供程序、使用 Azure Key Vault 保护应用程序机密 |
步骤 | Web.config、appsettings.json 等配置文件通常用于保存敏感信息,包括用户名、密码、数据库连接字符串和加密密钥。 如果不保护此类信息,攻击者或恶意用户可能会利用应用程序的漏洞来获取敏感信息,例如帐户用户名和密码、数据库名称和服务器名称。 请根据部署类型 (azure/on-prem),使用 DPAPI 或 Azure Key Vault 等服务来加密配置文件的敏感部分。 |
确保使用强凭据保护所有管理界面
标题 | 详细信息 |
---|---|
组件 | IoT 设备 |
SDL 阶段 | 部署 |
适用的技术 | 泛型 |
属性 | 空值 |
参考 | 空值 |
步骤 | 应使用强凭据保护设备或现场网关公开的任何管理接口。 此外,应使用强凭据保护 WiFi、SSH、文件共享、FTP 等其他任何公开的接口。 不应使用默认的弱密码。 |
确保未知的代码无法在设备上执行
标题 | 详细信息 |
---|---|
组件 | IoT 设备 |
SDL 阶段 | 构建 |
适用的技术 | 泛型 |
属性 | 空值 |
参考 | 在 Windows 10 IoT Core 上启用安全启动和 BitLocker 设备加密 |
步骤 | UEFI 安全启动会将系统限制为只允许执行指定的颁发机构签名的二进制文件。 此功能可防止在平台上执行未知的代码,潜在地削弱这种代码的安全风险。 启用 UEFI 安全启动,并限制受信任的、可为代码签名的证书颁发机构列表。 使用受信任的颁发机构之一为设备上部署的所有代码签名。 |
使用 Bitlocker 加密 IoT 设备的 OS 和其他分区
标题 | 详细信息 |
---|---|
组件 | IoT 设备 |
SDL 阶段 | 构建 |
适用的技术 | 泛型 |
属性 | 空值 |
参考 | 空值 |
步骤 | Windows 10 IoT Core 实现轻量版本的 BitLocker 设备加密,该版本在很大程度上依赖于平台上的 TPM,包括需要在 UEFI 中安装必要的 preOS 协议用于执行必要的度量。 这些 preOS 度量可确保 OS 今后拥有一份有关 OS 启动方式的明确记录。使用 BitLocker 加密 OS 分区,如果其他任何分区中存储了任何敏感数据,也应该加密这些分区。 |
确保只在设备上启用少量的服务/功能
标题 | 详细信息 |
---|---|
组件 | IoT 设备 |
SDL 阶段 | 部署 |
适用的技术 | 泛型 |
属性 | 空值 |
参考 | 空值 |
步骤 | 不要在 OS 中启用或者请关闭运行解决方案所不需要的任何功能或服务。 例如,如果设备不需要部署 UI,请在无外设模式下安装 Windows IoT Core。 |
使用 Bitlocker 加密 IoT 现场网关的 OS 和其他分区
标题 | 详细信息 |
---|---|
组件 | IoT 现场网关 |
SDL 阶段 | 部署 |
适用的技术 | 泛型 |
属性 | 空值 |
参考 | 空值 |
步骤 | Windows 10 IoT Core 实现轻量版本的 BitLocker 设备加密,该版本在很大程度上依赖于平台上的 TPM,包括需要在 UEFI 中安装必要的 preOS 协议用于执行必要的度量。 这些 preOS 度量可确保 OS 今后拥有一份有关 OS 启动方式的明确记录。使用 BitLocker 加密 OS 分区,如果其他任何分区中存储了任何敏感数据,也应该加密这些分区。 |
确保在安装期间更改现场网关的默认登录凭据
标题 | 详细信息 |
---|---|
组件 | IoT 现场网关 |
SDL 阶段 | 部署 |
适用的技术 | 泛型 |
属性 | 空值 |
参考 | 空值 |
步骤 | 确保在安装期间更改现场网关的默认登录凭据 |
确保云网关实施相应的过程来保持已连接设备固件的最新状态
标题 | 详细信息 |
---|---|
组件 | IoT 云网关 |
SDL 阶段 | 构建 |
适用的技术 | 泛型 |
属性 | 网关选项 - Azure IoT 中心 |
参考 | IoT 中心设备管理概述、使用 Raspberry Pi 3 B + Reference Image 的 Device Update for Azure IoT Hub 教程。 |
步骤 | LWM2M 是开放移动联盟为 IoT 设备管理提供的协议。 借助 Azure IoT 设备管理可以使用设备作业来与物理设备交互。 请确保云网关实施相应的过程,定期使用 Azure IoT 中心设备管理将设备和其他配置数据保持最新状态。 |
确保根据组织的策略在设备上配置终结点安全控制
标题 | 详细信息 |
---|---|
组件 | 计算机信任边界 |
SDL 阶段 | 部署 |
适用的技术 | 泛型 |
属性 | 空值 |
参考 | 空值 |
步骤 | 确保根据组织的安全策略,在设备中配置终结点安全控制机制,例如,用于磁盘级加密的 BitLocker、包含更新病毒特征的防病毒软件、基于主机的防火墙,OS 升级、组策略等。 |
确保对 Azure 存储访问密钥进行安全管理
标题 | 详细信息 |
---|---|
组件 | Azure 存储 |
SDL 阶段 | 部署 |
适用的技术 | 泛型 |
属性 | 空值 |
参考 | Azure 存储安全指南 - 管理存储帐户密钥 |
步骤 | 密钥存储:建议将 Azure 存储访问密钥以机密的形式存储在 Azure Key Vault 中,并让应用程序从 Key Vault 中检索密钥。 提出这种建议的原因如下:
|
确保已在 Azure 存储中启用 CORS 的情况下只允许受信任的来源
标题 | 详细信息 |
---|---|
组件 | Azure 存储 |
SDL 阶段 | 构建 |
适用的技术 | 泛型 |
属性 | 空值 |
参考 | Azure 存储服务的 CORS 支持 |
步骤 | Azure 存储允许启用 CORS – 跨域资源共享。 对于每个存储帐户,可以指定可访问该存储帐户中的资源的域。 默认情况下,对所有服务禁用了 CORS。 可以使用 REST API 或存储客户端库调用某个方法来设置服务策略,以启用 CORS。 |
启用 WCF 的服务限制功能
标题 | 详细信息 |
---|---|
组件 | WCF |
SDL 阶段 | 构建 |
适用的技术 | .NET Framework 3 |
属性 | 空值 |
参考 | MSDN、巩固王国 |
步骤 | 不对系统资源的使用施加限制可能会导致资源耗尽,最终出现拒绝服务。
|
示例
下面是启用了限制的示例配置:
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="Throttled">
<serviceThrottling maxConcurrentCalls="[YOUR SERVICE VALUE]" maxConcurrentSessions="[YOUR SERVICE VALUE]" maxConcurrentInstances="[YOUR SERVICE VALUE]" />
...
</system.serviceModel>
WCF - 通过元数据透露信息
标题 | 详细信息 |
---|---|
组件 | WCF |
SDL 阶段 | 构建 |
适用的技术 | .NET Framework 3 |
属性 | 空值 |
参考 | MSDN、巩固王国 |
步骤 | 元数据可帮助攻击者了解系统并规划攻击形式。 WCF 服务可能会配置为公开元数据。 元数据提供详细的服务说明信息,不应在生产环境中广播。 ServiceMetaData 类的 HttpGetEnabled / HttpsGetEnabled 属性定义服务是否要公开元数据 |
示例
以下代码指示 WCF 广播服务的元数据
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
smb.HttpGetUrl = new Uri(EndPointAddress);
Host.Description.Behaviors.Add(smb);
不要在生产环境中广播服务元数据。 将 ServiceMetaData 类的 HttpGetEnabled/HttpsGetEnabled 属性设置为 false。
示例
以下代码指示 WCF 不要广播服务的元数据。
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = false;
smb.HttpGetUrl = new Uri(EndPointAddress);
Host.Description.Behaviors.Add(smb);