当前位置: 首页 > news >正文

应用安全系列之四十五:日志伪造(Log_Forging)之二

        日志伪造(Log Forging)是一种常见的安全威胁,攻击者通过注入恶意内容破坏日志完整性。不同编程语言的防御方式有所不同,本文主要介绍Java、C#、Node.js、Rails(Ruby)和Go语言中的防护方法。

1、Java

在另外一篇博客里已经描述的比较详细,可以参考:应用安全系列之四十五:日志伪造(Log_Forging)之一-CSDN博客。

2、C# (.NET Core / Serilog / NLog)

2.1、攻击示例

string userInput = "admin\n[ERROR] 数据库连接失败";

_logger.LogInformation("登录用户: " + userInput); // 危险!

2.2、防御方法

2.2.1、使用结构化日志(自动转义)

_logger.LogInformation("登录用户: {User}", userInput); // Serilog/NLog 安全写法

2.2.2、NLog 配置过滤

<!-- NLog 配置:替换换行符 -->

<target name="logfile" xsi:type="File">

    <layout xsi:type="Layout" replaceNewlines="true">${message}</layout>

</target>

2.2.3、手动编码(System.Text.Encodings.Web)

using System.Text.Encodings.Web;

var safeInput = JavaScriptEncoder.Default.Encode(userInput);

_logger.LogInformation($"登录用户: {safeInput}");

3、Node.js (Winston/Bunyan/Pino)

3.1、攻击示例

const userInput = "admin\n[ERROR] 服务异常!";

console.log(`用户登录: ${userInput}`); // 危险!

3.2、防御方法

3.2.1、使用JSON结构化日志(自动转义)

// Winston/Bunyan/Pino 推荐方式

logger.info({ user: userInput }, "用户登录");



// 或者替换换行符

const safeInput = userInput.replace(/[\r\n]/g, "_");

logger.info(`用户登录: ${safeInput}`);

3.2.2、Pino 默认安全

const pino = require('pino')();

pino.info({ user: userInput }, "用户登录");

// 输出:{"level":30,"msg":"用户登录","user":"admin\\n[ERROR] 服务异常!"}

4、Ruby on Rails (Logger)

4.1、攻击示例

user_input = "admin\n[ERROR] 支付失败!"

Rails.logger.info "用户操作: #{user_input}" # 危险!

4.2、防御方法

 4.2.1、使用JSON.generate转义

safe_input = user_input.gsub(/[\r\n]/, '_')

Rails.logger.info "用户操作: #{safe_input}"

 4.2.2、使用ActiveSupport::SafeBuffer

safe_input = ActiveSupport::SafeBuffer.new(user_input)

Rails.logger.info "用户操作: #{safe_input}" # 自动HTML转义

 4.2.3、Lograge (结构化日志)

# config/environments/production.rb

config.lograge.enabled = true

config.lograge.formatter = Lograge::Formatters::Json.new

# 输出示例: {"user":"admin\\n[ERROR] 支付失败!"}

5、Go(log/slog/zap)

5.1、攻击示例

userInput := "admin\n[ERROR] 内存泄漏!"
log.Printf("用户操作: %s", userInput) // 危险!

5.2、防御方法

 5.2.1、使用log/slog结构化日志(Go 1.21+)

logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))

logger.Info("用户操作", "user", userInput) // 自动转义

 5.2.2、zap(Uber日志库)

import "go.uber.org/zap"

logger, _ := zap.NewProduction()

logger.Info("用户操作", zap.String("user", userInput)) // 安全

 5.2.3、手动替换换行符

safeInput := strings.ReplaceAll(userInput, "\n", "_")

log.Printf("用户操作: %s", safeInput)

6、日志伪造通用防御策略(使用所有语言)

方法

说明

参数化/结构化日志

使用{}占位符或键值对日志,避免直接拼接字符串

过滤换行符

替换\r、\n为空格或下划线

限制日志长度

截断超长日志,防止DoS攻击

避免记录原始输入

对敏感数据(如HTTP Headers)进行脱敏

日志审计

控异常日志模式(如大量换行符、异常错误日志)

 

7、总结

 

语言

预防方法

Java/C#

使用参数化日志 + 日志框架配置过滤

Node.js

优先选择Pino/Winston结构化日志

Ruby

用gsub替换换行符或使用Lograge

Go

推荐slog或zap,避免直接拼接

核心原则:永远不要信任用户输入,始终对日志内容进行转义或过滤!

如果你的应用涉及多语言微服务,建议统一采用JSON结构化日志,并搭配ELK/Splunk等日志系统进行监控和分析,可大幅降低日志伪造风险。

http://www.dtcms.com/a/108786.html

相关文章:

  • 基于BusyBox构建ISO镜像
  • 多模态模型:专栏概要与内容目录
  • 网络爬虫的基础知识
  • 《inZOI(云族裔)》50+MOD整合包
  • 【目标检测】【深度学习】【Pytorch版本】YOLOV2模型算法详解
  • 【现代深度学习技术】现代卷积神经网络07:稠密连接网络(DenseNet)
  • CFResNet鸟类识别:原网络基础上改进算法
  • Springboot logback日志实例
  • RK3568下的QT工程配置
  • Joomla教程—Joomla 模块管理与Joomla 模块类型介绍
  • AI SEO内容优化指南:如何打造AI平台青睐的高质量内容
  • 在 Elasticsearch 中使用 Amazon Nova 模型
  • Vue父组件调用子组件设置table表格合并
  • chromium魔改——修改 navigator.webdriver 检测
  • 【大模型系列篇】大模型基建工程:基于 FastAPI 自动构建 SSE MCP 服务器 —— 进阶篇
  • Leetcode hot 100(day 4)
  • 03.01、三合一
  • 使用Amazon Bedrock Guardrails保护你的DeepSeek模型部署
  • 一问讲透redis持久化机制-rdb aof
  • 深度优化:解决SpringBoot应用启动速度慢的8个关键策略
  • 部署大模型实战:如何巧妙权衡效果、成本与延迟?
  • 智慧园区大屏如何实现全局监测:监测意义、内容、方式
  • .NET WebApi的详细发布流程——及其部署到Linux与Windows平台
  • AG32:MCU和CPLD如何交互?
  • 6.3 八皇后问题搜索
  • 几个在面试中遇到的计算机基础问题
  • C与指针的神秘面纱
  • 【Docker-7】Docker是什么+Docker版本+Docker架构+Docker生态
  • sshd启动报错“Failed to start OpenSSH Server daemon”
  • Python不可变数据类型全解析:原理、优势与实战指南