终极指南:OWASP Cheat Sheet Series教你掌握错误处理与日志记录的安全实践
终极指南:OWASP Cheat Sheet Series教你掌握错误处理与日志记录的安全实践
【免费下载链接】CheatSheetSeriesThe OWASP Cheat Sheet Series was created to provide a concise collection of high value information on specific application security topics.项目地址: https://gitcode.com/gh_mirrors/ch/CheatSheetSeries
OWASP Cheat Sheet Series是一个专注于提供特定应用安全主题高价值信息的简明集合,本文将深入解析其中错误处理和日志记录的最佳实践,帮助开发者构建更安全的应用程序。
为什么错误处理与日志记录对应用安全至关重要?
在电影之外,每一次攻击都始于攻击者的信息收集阶段。未处理的错误会在这个初始阶段为攻击者提供大量技术信息,如应用服务器、框架和库的名称及版本等,这对后续攻击至关重要。
错误处理问题不仅会泄露目标的大量信息,还可能被用于识别目标功能中的注入点。例如,一个500错误页面可能会泄露Struts2和Tomcat的版本信息,而SQL查询错误则可能暴露网站的安装路径,为攻击者提供可乘之机。
日志记录则是安全事件响应的关键。它不仅能用于一般调试、建立基线、业务流程监控,还在安全方面发挥着重要作用,如识别安全事件、监控策略违规、协助防抵赖控制、提供审计跟踪等。
错误处理的核心原则与最佳实践
错误处理的核心目标是:当发生意外错误时,应用程序返回通用响应给用户,而错误详情则在服务器端记录以便调查,而不是返回给用户。
标准Java Web应用程序
对于标准Java Web应用,可以在web.xml部署描述符级别配置全局错误处理程序。以下是Servlet规范2.5及以上版本的配置示例:
在web.xml文件中配置重定向:
<error-page> <exception-type>java.lang.Exception</exception-type> <location>/error.jsp</location> </error-page>error.jsp文件内容:
<%@ page language="java" isErrorPage="true" contentType="application/json; charset=UTF-8" pageEncoding="UTF-8"%> <% String errorMessage = exception.getMessage(); //记录异常 response.setHeader("X-ERROR", "true"); response.setStatus(500); %> {"message":"发生错误,请重试"}Java SpringMVC/SpringBoot Web应用程序
使用SpringMVC或SpringBoot时,可以通过实现以下类来定义全局错误处理程序。Spring Framework 6引入了基于RFC 7807的问题详情:
import org.springframework.http.HttpStatus; import org.springframework.http.ProblemDetail; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.context.request.WebRequest; import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; @RestControllerAdvice public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler { @ExceptionHandler(value = {Exception.class}) public ProblemDetail handleGlobalError(RuntimeException exception, WebRequest request) { //记录异常 return ProblemDetail.forStatusAndDetail(HttpStatus.INTERNAL_SERVER_ERROR, "发生错误,请重试"); } }ASP NET Core Web应用程序
在ASP.NET Core中,可以将异常处理程序指定为专用的API控制器:
错误处理API控制器内容:
[Route("api/[controller]")] [ApiController] [AllowAnonymous] public class ErrorController : ControllerBase { [HttpGet] [HttpPost] [HttpHead] [HttpDelete] [HttpPut] [HttpOptions] [HttpPatch] public JsonResult Handle() { Exception exception = HttpContext.Features.Get<IExceptionHandlerFeature>()?.Error; //记录异常 var responseBody = new Dictionary<String, String>{ { "message", "发生错误,请重试" } }; JsonResult response = new JsonResult(responseBody); response.StatusCode = (int)HttpStatusCode.InternalServerError; Request.HttpContext.Response.Headers.Remove("X-ERROR"); Request.HttpContext.Response.Headers.Add("X-ERROR", "true"); return response; } }在Startup.cs文件中定义异常处理程序到专用错误处理API控制器的映射:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/api/error"); app.UseStatusCodePages("text/plain", "状态码页面,状态码: {0}"); } app.UseMvc(); }日志记录的关键要素与实施策略
日志记录是应用程序安全的重要组成部分。它应该在应用程序内部保持一致,在组织的应用程序组合中保持一致,并在相关时使用行业标准。
应该记录哪些事件?
安全监控、警报和报告的级别和内容需要在项目的需求和设计阶段确定,并且应该与信息安全风险成比例。在可能的情况下,始终记录以下内容:
- 输入验证失败,如协议违规、不可接受的编码、无效的参数名称和值
- 输出验证失败,如数据库记录集不匹配、无效的数据编码
- 身份验证成功和失败
- 授权(访问控制)失败
- 会话管理失败,如Cookie会话标识值修改或可疑的JWT验证失败
- 应用程序错误和系统事件,如语法和运行时错误、连接问题等
- 应用程序及相关系统的启动和关闭,以及日志初始化
- 高风险功能的使用,包括用户管理操作、系统管理权限的使用等
事件属性
每个日志条目需要包含足够的信息用于后续的监控和分析。应用程序日志必须记录每个事件的"何时、何地、谁和什么"。
这些属性将根据架构、应用程序类别和主机系统/设备而有所不同,但通常包括:
- 何时:日志日期和时间、事件日期和时间、交互标识符
- 何地:应用程序标识符、应用程序地址、服务、地理位置、窗口/表单/页面、代码位置
- 谁:源地址、用户身份
- 什么:事件类型、事件严重性、安全相关事件标志、描述
网络架构示例
以下是一个为客户提供业务功能的服务的网络架构示例。我们建议创建一个集中式系统来收集日志。可能有许多这样的服务,但所有服务都必须将日志安全地收集到集中式系统中。
如图所示,在网络级别,保存和下载日志的过程需要打开不同的网络访问(端口),用不同颜色突出显示箭头。此外,保存和下载由不同的应用程序执行。
日志的保护
日志机制和收集的事件数据必须受到保护,防止在传输过程中被篡改,以及在存储后被未授权访问、修改和删除。日志可能包含个人和其他敏感信息,或者数据可能包含有关应用程序代码和逻辑的信息。
- 静态保护:建立篡改检测机制,尽快将日志数据存储或复制到只读介质,所有对日志的访问都必须被记录和监控,读取日志数据的权限应受到限制并定期审查。
- 传输保护:如果日志数据通过不受信任的网络发送,使用安全的传输协议,考虑是否需要验证事件数据的来源,在将事件数据发送给第三方之前进行尽职调查。
如何避免常见的错误处理和日志记录陷阱?
- 不要在错误消息中泄露敏感信息,如技术栈版本、数据库结构等。
- 避免将详细的异常堆栈跟踪返回给用户,应使用通用错误消息。
- 不要完全禁用应用程序日志记录或必要的合规性事件日志记录。
- 避免在日志中记录敏感数据,如密码、访问令牌、个人身份信息等。
- 不要忽视日志的保护,确保日志数据的机密性、完整性和可用性。
- 不要忘记同步所有服务器和设备的时间,这对于事件关联至关重要。
- 不要在生产环境中使用开发人员异常页面,这可能泄露敏感信息。
总结
错误处理和日志记录是应用程序安全的关键组成部分。通过实施OWASP Cheat Sheet Series中概述的最佳实践,开发者可以显著提高应用程序的安全性,减少信息泄露的风险,并为安全事件响应提供有力支持。
OWASP Cheat Sheet Series提供了更多关于错误处理和日志记录的详细信息,可以在项目的cheatsheets目录中找到:
- 错误处理:cheatsheets/Error_Handling_Cheat_Sheet.md
- 日志记录:cheatsheets/Logging_Cheat_Sheet.md
通过遵循这些指南,开发者可以构建更安全、更可靠的应用程序,更好地保护用户数据和系统资源。
【免费下载链接】CheatSheetSeriesThe OWASP Cheat Sheet Series was created to provide a concise collection of high value information on specific application security topics.项目地址: https://gitcode.com/gh_mirrors/ch/CheatSheetSeries
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
