【Web安全】CRLF注入攻击深度解析:原理、场景与安全测试防御指南

文章目录

    • 前言:为什么CRLF注入是安全测试不可忽视的威胁?
    • 1. CRLF注入核心原理:从字符定义到协议依赖
      • 1.1 什么是CRLF?
      • 1.2 CRLF在HTTP协议中的关键作用
      • 1.3 CRLF注入的本质:格式混淆攻击
    • 2. CRLF注入典型利用场景与安全测试方法
      • 2.1 反射型XSS:通过CRLF分隔HTTP头与体注入恶意代码
        • 2.1.1 漏洞原理
        • 2.1.2 测试案例与步骤
        • 2.1.3 测试注意事项
      • 2.2 绕过浏览器XSS Filter:注入HTTP头禁用防护机制
        • 2.2.1 漏洞原理
        • 2.2.2 测试案例与步骤
        • 2.2.3 测试扩展
      • 2.3 日志注入:伪造日志记录干扰安全审计
        • 2.3.1 漏洞原理
        • 2.3.2 不同环境下的日志注入特征
        • 2.3.3 测试案例与步骤
    • 3. Java生态下的日志注入:不仅是CRLF
      • 3.1 漏洞根源:字符串拼接与未过滤的用户输入
      • 3.2 主流日志框架的CRLF注入风险对比
      • 3.3 测试Java日志注入的实操步骤
        • 3.3.1 信息收集:确定日志框架与输入点
        • 3.3.2 漏洞验证:注入CRLF构造恶意日志
        • 3.3.3 漏洞利用:构造复杂攻击场景
    • 4. CRLF注入防御机制与安全测试验证
      • 4.1 通用防御原则:输入验证与输出编码
        • 4.1.1 输入验证
        • 4.1.2 输出编码
      • 4.2 Log4j2的防御配置与测试验证
        • 4.2.1 安全配置示例
        • 4.2.2 防御验证测试
      • 4.3 Logback的防御实现与测试验证
        • 4.3.1 自定义转换器代码
        • 4.3.2 配置与验证
      • 4.4 JUL的防御实现与测试验证
        • 4.4.1 自定义Formatter代码
        • 4.4.2 配置与验证
    • 5. CRLF注入安全测试 checklist
      • 5.1 信息收集阶段
      • 5.2 漏洞探测阶段
      • 5.3 漏洞验证阶段
      • 5.4 防御验证阶段
    • 结语:CRLF注入的防御核心与测试价值

前言:为什么CRLF注入是安全测试不可忽视的威胁?

在Web安全领域,XSS、SQL注入等漏洞往往是安全测试的重点,但CRLF注入作为一种利用特殊字符实现攻击的漏洞,常因隐蔽性强、利用场景多样而被忽视。事实上,CRLF注入可通过篡改HTTP响应、伪造日志记录、绕过安全防护等方式,对系统的机密性、完整性和可用性造成严重威胁。

1. CRLF注入核心原理:从字符定义到协议依赖

1.1 什么是CRLF?

CRLF是“回车(Carriage Return)+换行(Line Feed)”的缩写,对应ASCII字符集中的\r(十六进制0x0d)和\n(十六进制0x0a)。在计算机发展早期,这两个字符的组合被用于表示文本中的“换行”操作——其中\r让光标回到行首,\n让光标下移一行,两者配合实现了文本排版的换行效果。

不同操作系统对“换行”的表示存在差异:

  • Windows系统使用\r\n(即CRLF)作为换行符;
  • Linux、Unix系统使用\n(仅换行)作为换行符;
  • 早期Mac OS使用\r(仅回车)作为换行符,现代macOS已与Linux统一为\n

这种差异看似微小,却为CRLF注入提供了基础——当系统对用户输入的特殊字符处理不当,攻击者可通过注入CRLF(或单一\r/\n)篡改数据格式,实现恶意操作。

1.2 CRLF在HTTP协议中的关键作用

CRLF的危险性核心源于其在HTTP协议中的“格式定义”作用。HTTP协议明确规定:HTTP头部(Header)与消息体(Body)通过两个连续的CRLF(即\r\n\r\n)分隔,而头部内部的字段(如LocationSet-Cookie)则通过单个CRLF分隔。

例如,一个标准的HTTP响应格式如下:

HTTP/1.1 200 OK\r\n
Date: Fri, 27 Jun 2024 10:00:00 GMT\r\n
Content-Type: text/html\r\n
Content-Length: 100\r\n
\r\n  <!-- 两个CRLF分隔Header与Body -->
<html><body>Hello World</body></html>

在这个结构中,CRLF是协议解析的“锚点”:浏览器或服务器通过识别CRLF的位置,确定头部字段的边界和消息体的起始。一旦攻击者能够控制HTTP消息中的部分内容(如URL参数、表单输入),并将其注入到HTTP头部中,就可以通过插入CRLF改变协议结构——例如,在头部中注入新的字段,或提前分隔头部与体,从而执行恶意操作。

1.3 CRLF注入的本质:格式混淆攻击

CRLF注入的本质是“格式混淆攻击”:攻击者通过注入特殊控制字符(CRLF),破坏数据的预期格式,使解析器(如浏览器、日志系统)将恶意内容误认为合法结构的一部分。

这种攻击的成功依赖两个前提:

  1. 用户输入可控:攻击者能够向系统传入包含CRLF(或\r/\n)的恶意数据;
  2. 输入未被过滤:系统未对用户输入中的CRLF进行转义或删除,直接将其嵌入到协议头部、日志等结构化数据中。

理解这一本质,是安全测试人员挖掘CRLF注入漏洞的核心思路——即寻找“用户输入直接进入结构化数据(如HTTP头、日志行)且未过滤特殊字符”的场景。

2. CRLF注入典型利用场景与安全测试方法

CRLF注入的利用场景广泛,涵盖Web应用、日志系统、网络协议等多个层面。对于安全测试人员而言,需针对不同场景设计专属测试用例,精准验证漏洞是否存在。

2.1 反射型XSS:通过CRLF分隔HTTP头与体注入恶意代码

2.1.1 漏洞原理

当Web应用将用户输入(如URL参数)直接作为HTTP响应头的字段值(如LocationRefresh)时,攻击者可注入CRLF强制分隔头部与体,在消息体中插入HTML/JavaScript代码,触发反射型XSS。

典型场景:URL跳转功能。例如,应用通过http://example.com/redirect?url=xxx接收跳转地址,并在响应头的Location: xxx中返回。若xxx未被过滤,攻击者可构造包含CRLF的url参数,使Location字段被截断,后续内容被解析为消息体。

2.1.2 测试案例与步骤

测试目标:某网站的URL跳转功能(参数为url),响应头中包含Location: {url参数值}

测试步骤

  1. 构造恶意URL参数,注入两个CRLF(%0d%0a%0d%0a,URL编码后的\r\n\r\n)分隔头部与体,后续拼接XSS代码:

    http://example.com/redirect?url=%0d%0a%0d%0a<img src=x onerror=alert(document.domain)>
    
  2. 使用Burp Suite等工具发送请求,查看响应结构。若响应如下,则漏洞存在:

    HTTP/1.1 302 Found\r\n
    Date: Fri, 27 Jun 2024 10:30:00 GMT\r\n
    Location:\r\n  <!-- 注入的第一个CRLF截断Location字段 -->
    \r\n  <!-- 注入的第二个CRLF分隔Header与Body -->
    <img src=x onerror=alert(document.domain)>\r\n  <!-- 恶意代码被解析为Body -->
    
  3. 在浏览器中访问该URL,若弹出包含域名的对话框,证明XSS触发成功。

2.1.3 测试注意事项
  • 部分服务器会对Location字段进行合法性校验(如限制为http://开头),需先通过测试确认参数是否完全可控;
  • 若直接注入\r\n无效,可尝试单独注入\r%0d)或\n%0a),因部分系统可能仅过滤其中一种字符;
  • 需结合浏览器类型测试:不同浏览器对HTTP协议的解析严格度不同,部分浏览器可能忽略不规范的CRLF分隔。

2.2 绕过浏览器XSS Filter:注入HTTP头禁用防护机制

2.2.1 漏洞原理

现代浏览器(如Chrome、IE)内置XSS Filter防护机制,当检测到URL或响应中包含明显的XSS特征(如<script>标签)时,会拦截并阻止恶意代码执行。但该机制可被CRLF注入绕过——通过注入X-XSS-Protection: 0头部字段,强制浏览器关闭XSS Filter。

X-XSS-Protection是浏览器提供的防御头,其取值含义如下:

  • 0:禁用XSS Filter;
  • 1:启用XSS Filter(默认),检测到XSS时阻止页面加载;
  • 1; mode=block:启用XSS Filter,检测到XSS时不渲染恶意部分。

若应用允许用户输入注入到HTTP头部,攻击者可先注入X-XSS-Protection: 0,再注入XSS代码,绕过浏览器防护。

2.2.2 测试案例与步骤

测试目标:某应用的用户输入(如username参数)被嵌入到HTTP响应头的X-User字段中(X-User: {username})。

测试步骤

  1. 构造包含CRLF和X-XSS-Protection: 0的参数:

    http://example.com/profile?username=%0aX-XSS-Protection:%200%0d%0a%0d%0a<script>alert(1)</script>
    

    (注:%0a\n%0d\r%20为空格)

  2. 发送请求后,若响应头中新增X-XSS-Protection: 0,且消息体包含<script>alert(1)</script>,则防护被绕过:

    HTTP/1.1 200 OK\r\n
    X-User:\r\n  <!-- 注入的\n截断X-User字段 -->
    X-XSS-Protection: 0\r\n  <!-- 注入的新头部 -->
    \r\n  <!-- 分隔Header与Body -->
    <script>alert(1)</script>\r\n
    
  3. 在浏览器中访问该URL,若成功弹出对话框,证明绕过成功。

2.2.3 测试扩展
  • X-XSS-Protection外,还可尝试注入其他恶意头部,如Set-Cookie(篡改会话)、Content-Security-Policy(禁用CSP防护)等;
  • 部分服务器会限制自定义头部的注入(如禁止包含:的输入),需通过URL编码(如%3a替代:)绕过;
  • 测试不同浏览器的兼容性:Chrome对X-XSS-Protection的支持已逐步弱化,而IE仍依赖该机制,需针对性验证。

2.3 日志注入:伪造日志记录干扰安全审计

2.3.1 漏洞原理

日志系统(如Web服务器日志、应用程序日志)通常按固定格式记录信息(如时间、用户ID、操作内容),每行代表一条记录。若日志内容包含用户可控数据且未过滤换行符(CRLF或\n),攻击者可注入换行符伪造新的日志记录,干扰安全审计或掩盖攻击痕迹。

例如,某应用的日志格式为:

[2024-06-27 10:00:00] User [username] performed action [action]

username可控,攻击者输入admin\n[2024-06-27 10:00:01] User [attacker] performed action [delete],日志将被拆分为两条记录:

[2024-06-27 10:00:00] User [admin
[2024-06-27 10:00:01] User [attacker] performed action [delete]

从而伪造“攻击者执行删除操作”的虚假记录。

2.3.2 不同环境下的日志注入特征
  • Linux/Unix环境:日志换行符为\n%0a),部分系统支持\t(制表符,%09)对齐伪造内容,\x7F(删除符,%7F)可擦除前一个字符;
  • Windows环境:日志换行符为\r\n%0d%0a),需注入完整CRLF才能正确拆分记录;
  • Web服务器日志(如Nginx、Apache):通常包含客户端IP、请求方法、URL等,若URL参数可控,可注入换行符伪造“正常请求”记录。
2.3.3 测试案例与步骤

测试目标:某Java Web应用使用Log4j记录用户登录日志,格式为"User login: " + username + ", IP: " + ip

测试步骤

  1. 在登录页面的username字段输入恶意内容:

    normal_user\n[2024-06-27 11:00:00] INFO User login: admin, IP: 192.168.1.100\n[2024-06-27 11:00:01] ERROR Database deleted by user: admin
    
  2. 提交登录请求后,查看应用日志文件。若日志中出现三条记录(正常记录+两条伪造记录),则漏洞存在:

    [2024-06-27 10:59:59] INFO User login: normal_user
    [2024-06-27 11:00:00] INFO User login: admin, IP: 192.168.1.100
    [2024-06-27 11:00:01] ERROR Database deleted by user: admin
    
  3. 进一步验证:注入包含特殊格式的内容(如\t对齐字段),观察日志是否被完美伪造。

3. Java生态下的日志注入:不仅是CRLF

Java作为主流的Web开发语言,其日志框架(如Log4j2、Logback、JUL)的CRLF注入风险尤为突出。由于Java应用常将用户输入直接拼接至日志消息,若未过滤CRLF和其他特殊字符,极易引发日志伪造等问题。

3.1 漏洞根源:字符串拼接与未过滤的用户输入

Java日志注入的典型不安全代码如下:

// 危险示例:直接拼接用户输入到日志消息
String userInput = request.getParameter("username");
logger.info("User login attempt: " + userInput);

userInputadmin\n[INFO] User login successful: attacker时,日志将被拆分为两行,伪造“attacker登录成功”的记录。

漏洞根源在于:

  • 使用字符串拼接(+)将用户输入嵌入日志消息,而非参数化日志;
  • 日志框架默认不会过滤\r\n等控制字符,直接按原始内容输出。

3.2 主流日志框架的CRLF注入风险对比

日志框架默认是否过滤CRLF内置防护机制风险等级
Log4j2支持%encode转换器(可指定CRLF编码)中(可通过配置防御)
Logback无内置防护,需自定义转换器高(依赖手动开发)
JUL无内置防护,需自定义Formatter高(依赖手动开发)

安全测试人员需根据目标应用使用的日志框架,设计针对性的测试方案。

3.3 测试Java日志注入的实操步骤

3.3.1 信息收集:确定日志框架与输入点
  1. 识别日志框架

    • 查看应用部署包中的JAR包:Log4j2包含log4j-core-*.jar,Logback包含logback-classic-*.jar,JUL为Java原生(无额外JAR);
    • 通过错误页面或调试信息获取框架类型(如Log4j2的错误日志会包含org.apache.logging.log4j包名)。
  2. 定位用户输入日志点

    • 常见场景:登录日志(用户名、IP)、操作日志(用户ID、操作内容)、异常日志(错误信息包含用户输入);
    • 测试方法:在所有用户可控参数(URL、表单、Cookie)中传入特殊标记(如test_log_injection),搜索日志文件确认是否被记录。
3.3.2 漏洞验证:注入CRLF构造恶意日志
  1. 构造包含换行符的测试输入:

    • Linux环境:normal_input%0a[INFO] Fake log from attacker%0a\n);
    • Windows环境:normal_input%0d%0a[INFO] Fake log from attacker%0d%0a\r\n)。
  2. 将输入传入已识别的日志点(如登录用户名),查看日志文件:

    • 若日志中出现两行记录(原始记录+伪造记录),则漏洞存在;
    • 进阶测试:注入包含日志级别(如ERROR)、时间戳的内容,验证是否能伪造高优先级日志。
3.3.3 漏洞利用:构造复杂攻击场景
  • 权限混淆:伪造[ADMIN] User [attacker] granted root access日志,误导管理员;
  • 攻击溯源干扰:注入[INFO] Attack source IP: 192.168.1.100(伪造他人IP);
  • 日志溢出:注入大量换行符(如%0a重复1000次),使日志文件体积暴增,消耗磁盘空间。

4. CRLF注入防御机制与安全测试验证

防御CRLF注入的核心是“过滤或转义用户输入中的特殊控制字符”。安全测试人员不仅需要挖掘漏洞,还需验证防御措施的有效性,确保修复方案切实可行。

4.1 通用防御原则:输入验证与输出编码

4.1.1 输入验证
  • 白名单校验:仅允许符合预期格式的输入(如URL跳转参数限制为http://https://开头,用户名限制为字母数字组合);
  • 长度限制:限制用户输入长度,降低长字符串注入的危害。

测试验证方法:向参数传入包含CRLF的超长字符串(如1000个%0a),若被拦截或截断,则验证通过。

4.1.2 输出编码

根据输出场景对特殊字符进行编码:

  • 嵌入HTTP头部时:将\r编码为%0d\n编码为%0a(URL编码);
  • 嵌入日志时:将\r替换为\\r\n替换为\\n(转义为可见字符)。

测试验证方法:注入\r\n后,查看输出结果是否被转义(如日志中显示\\r\\n而非实际换行)。

4.2 Log4j2的防御配置与测试验证

JSON 格式当前最常用,官方强烈建议使用 JSON 模板布局接收 JSON 输出(参考:https://logging.apache.org/log4j/2.x/manual/pattern-layout.html)。

需要注意的是,%encode{%msg}{CRLF}%n 仅能针对 CRLF(\r\n)进行编码防御,无法处理其他特殊字符(如 JSON 中的引号、反斜杠等)的注入风险。因此在选择编码方式时,需结合实际打印内容的场景:

  • 若仅需防御 CRLF 注入,可使用 %encode{%msg}{CRLF}%n
  • 当打印内容为 JSON 字符串时,%encode{%msg}{JSON}%n 是更安全的选择,因为它能对 JSON 格式中所有特殊字符(包括引号、反斜杠、控制字符等)进行合规编码,避免破坏 JSON 结构或引入注入风险。

编码方式的通用格式如下:

# [HTML|XML|JSON|CRLF] 表示根据场景选择一种对应的编码类型
enc{pattern}{[HTML|XML|JSON|CRLF]}
encode{pattern}{[HTML|XML|JSON|CRLF]}
4.2.1 安全配置示例
<!-- log4j2.xml 配置 -->
<Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %encode{%msg}{JSON}%n" /></Console>
</Appenders>
4.2.2 防御验证测试
  1. 注入包含CRLF的日志内容:test%0a%0dmalicious_log
  2. 查看日志输出,若显示test\r\nmalicious_log(无换行),则编码生效;
  3. 测试边界情况:注入混合特殊字符(如\t\x7F),确认是否被一并处理。

4.3 Logback的防御实现与测试验证

Logback无内置CRLF编码机制,需通过自定义转换器实现过滤。

4.3.1 自定义转换器代码
// SafeLogConverter.java
package com.example.security;import ch.qos.logback.classic.pattern.ClassicConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;public class SafeLogConverter extends ClassicConverter {@Overridepublic String convert(ILoggingEvent event) {String message = event.getFormattedMessage();if (message == null) {return "";}// 转义CRLF及其他控制字符return message.replace("\r", "\\r").replace("\n", "\\n").replace("\t", "\\t").replace("\u007F", "\\x7F");}
}
4.3.2 配置与验证

logback.xml中注册转换器:

<configuration><conversionRule conversionWord="safeMsg" converterClass="com.example.security.SafeLogConverter" /><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %safeMsg%n</pattern></encoder></appender><root level="info"><appender-ref ref="CONSOLE" /></root>
</configuration>

测试验证

  1. 注入user\nadmin作为日志内容;
  2. 若日志显示user\\nadmin(无换行),则转换器生效;
  3. 检查代码覆盖率:验证转换器是否对所有日志字段(如线程名、MDC数据)生效(需根据业务需求扩展代码)。

4.4 JUL的防御实现与测试验证

Java原生日志框架JUL需通过自定义Formatter实现CRLF过滤。

4.4.1 自定义Formatter代码
// SafeFormatter.java
import java.util.logging.Formatter;
import java.util.logging.LogRecord;public class SafeFormatter extends Formatter {@Overridepublic String format(LogRecord record) {String message = record.getMessage();if (message == null) {message = "";}// 过滤CRLFString safeMessage = message.replace("\r", "\\r").replace("\n", "\\n");// 格式化日志(包含时间、级别等)return String.format("[%tF %tT] %s: %s%n",record.getMillis(), record.getMillis(),record.getLevel(), safeMessage);}
}
4.4.2 配置与验证

logging.properties中配置:

handlers=java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.formatter=com.example.security.SafeFormatter

测试验证

  1. 使用JUL记录包含\r\n的消息:logger.info("Input: " + "test\r\nattack")
  2. 若控制台输出[2024-06-27 15:00:00] INFO: Input: test\\r\\nattack,则防御生效。

5. CRLF注入安全测试 checklist

为帮助安全测试人员系统化开展测试,以下提供CRLF注入测试 checklist,涵盖从信息收集到防御验证的全流程:

5.1 信息收集阶段

  • 确定目标应用使用的HTTP服务器(Nginx/Apache/IIS)及操作系统(Windows/Linux);
  • 识别应用使用的日志框架(Log4j2/Logback/JUL)及版本;
  • 梳理用户可控输入点(URL参数、表单字段、Cookie、请求头);
  • 确认输入是否被传入HTTP响应头(如LocationSet-Cookie)或日志系统。

5.2 漏洞探测阶段

  • 对每个输入点注入%0d%0a(CRLF)、%0a(LF)、%0d(CR),观察响应头是否新增字段;
  • 注入%0d%0a%0d%0a测试是否能分隔HTTP头与体,插入HTML代码;
  • 注入%0aX-XSS-Protection: 0测试是否能添加HTTP头,绕过浏览器防护;
  • 向日志输入点注入\n[INFO] Fake log,检查日志是否被拆分。

5.3 漏洞验证阶段

  • 复现反射型XSS场景,确认恶意代码在浏览器中执行;
  • 验证日志注入能否伪造不同级别(INFO/ERROR)的日志记录;
  • 测试不同浏览器/操作系统下的漏洞触发情况(兼容性验证)。

5.4 防御验证阶段

  • 检查输入是否被过滤(CRLF是否被删除);
  • 检查输出是否被编码(CRLF是否被转义为\\r\\n);
  • 验证日志框架的安全配置(如Log4j2的%encode是否生效);
  • 测试边界输入(超长字符串、混合特殊字符)的处理效果。

结语:CRLF注入的防御核心与测试价值

防御CRLF注入的关键不在于“消灭CRLF字符”,而在于“明确输入边界”——通过严格的输入验证、场景化的输出编码,确保用户输入无法篡改数据的预期格式。

本文是「Web安全」系列内容,点击专栏导航查看全部内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/97568.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/97568.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【安全学习】DVWA 靶场 SQL 注入漏洞原理分析与防御策略(教育用途)

注意&#xff1a;本文内容仅用于合法授权的安全研究、教学演示及漏洞复现&#xff0c;严禁用于任何未授权的系统或网络环境。 所有操作需在本地沙箱或个人可控靶场中执行&#xff0c;切勿对生产环境、他人系统进行测试&#xff0c;非法使用后果自负。&#x1f4cc; 法律与道德双…

Langflow Memory 技术深度分析

Langflow Memory 技术深度分析 1. Memory 技术概述和设计理念 1.1 技术概述 Langflow 的 Memory 系统是一个多层次的记忆管理框架&#xff0c;专门设计用于处理对话历史、上下文状态和会话数据的存储与检索。该系统采用了分层架构设计&#xff0c;支持多种记忆类型和存储后端&a…

从0开始搭建一个前端项目(vue + vite + less + typescript)

版本 node&#xff1a;v22.17.1 pnpm&#xff1a;v10.13.1 vue&#xff1a;^3.5.18 vite&#xff1a;^7.0.6 typescipt&#xff1a;~5.8.0脚手架初始化vue pnpm create vuelatest只选择&#xff1a; TypeScript, JSX 3. 用vscode打开创建的项目&#xff0c;并删除多余的代码esl…

(十)ps识别:Swin Transformer-T 与 ResNet50 结合的 PS 痕迹识别模型训练过程解析

Swin Transformer-T 与 ResNet50 结合的 PS 痕迹识别模型 思路分析模型融合思路&#xff1a; 利用ResNet50提取图像的局部纹理和边缘特征&#xff0c;这对检测篡改区域的细微变化非常重要利用Swin Transformer-T捕捉全局上下文信息和长距离依赖关系&#xff0c;有助于理解图像整…

[ICCV25]TRACE:用3D高斯直接学习物理参数,让AI“推演”未来场景

导读在复杂的动态世界中&#xff0c;让机器人既能看懂场景&#xff0c;又能预测未来变化&#xff0c;是一项极具挑战性的任务。过去的方法往往依赖人工标注或简化的物理模型&#xff0c;却难以真正捕捉物体运动的规律。TRACE 提出了一个全新的思路&#xff1a;把三维场景中的每…

电商数据开发实践:深度剖析1688商品详情 API 的技术与应用

在电商行业数字化转型的进程中&#xff0c;数据获取与处理的效率和准确性&#xff0c;直接影响着企业的竞争力。作为开发者&#xff0c;相信大家都遇到过这类棘手问题&#xff1a;在构建时&#xff0c;因数据不一致导致采购决策失误&#xff1b;使用传统&#xff0c;又常遭遇电…

Docker 详解+示例(部署Kafka镜像容器)

介 绍Docker 是一个开源的容器化平台&#xff0c;它的核心目标是解决 “软件在不同环境下运行不一致” 的问题&#xff0c;实现 “一次构建&#xff0c;到处运行” 。它基于 Linux 内核的底层技术&#xff0c;将应用程序及其依赖&#xff08;如库文件、配置、运行环境等&#x…

SciPy科学计算与应用:SciPy应用实战-数据分析与工程计算

SciPy案例研究&#xff1a;从理论到实践 学习目标 通过本课程&#xff0c;学员将了解一系列实际案例&#xff0c;深入探讨SciPy库在数据分析、物理模拟和工程计算中的应用。同时学员将学习如何利用SciPy解决实际问题&#xff0c;加深对SciPy各个模块的理解和应用能力。 相关知识…

React学习教程,从入门到精通, ReactJS - 架构(6)

ReactJS - 架构 React应用的架构 React的架构就像一个井然有序的厨房&#xff0c;每个工具都有其特定的位置和用途。在其核心&#xff0c;React遵循一个基于组件的架构&#xff0c;这意味着我们使用可重用的组件构建应用程序。 组件&#xff1a;构建块 可以把组件想象成乐高积木…

Bias / variance and neural networks|偏差/方差和神经网络

----------------------------------------------------------------------------------------------- 这是我在我的网站中截取的文章&#xff0c;有更多的文章欢迎来访问我自己的博客网站rn.berlinlian.cn&#xff0c;这里还有很多有关计算机的知识&#xff0c;欢迎进行留言或…

Linux HMM(Heterogeneous Memory Management)的应用

原理篇见【https://blog.csdn.net/shenjunpeng/article/details/150931847?spm1011.2415.3001.5331】 1. HMM 的优势与挑战 1.1 优势 统一虚拟地址空间&#xff1a;简化异构计算平台的数据共享和访问。 高效页表同步&#xff1a;支持设备端的 page fault 和页表同步&#x…

鸿蒙创新赛活动——Mac提交压缩失败后续

Mac提交压缩失败后续来了… 传送带【上一篇】 背景 华为2025HarmonyOS创新赛 上传作品的时候&#xff0c;遇到了一个提示 ZIP包中的Office文件含有嵌入文件&#xff0c;就去这个Office文件找&#xff0c;怎么也找不到嵌入的文件。 解决方法1 上次推荐的解决方式是&#xff0…

Ubuntu操作系统下使用mysql、mongodb、redis

目录 一、核心步骤概览 二. MySQL &#xff08;下面以其他用户为例&#xff09; 1,、安装 2、管理服务 3、连接与使用 4、配置文件位置 5、下面来演示一下安装好之后如何在Linux操作系统中远程登录和window互连Linux 远程登录 window连Linux&#xff08;连不上的&…

springboot java开发的rocketmq 顺序消息保证

首先要明确一个关键点&#xff1a;RocketMQ 保证的是一种局部顺序&#xff08;Partially Ordered&#xff09;​&#xff0c;而非全局顺序&#xff08;Globally Ordered&#xff09;。这意味着消息的顺序性只在某个特定维度&#xff08;比如同一个订单ID&#xff09;下保证&…

【机器学习】 14 Kernels

本章目录 14 Kernels 479 14.1 Introduction 479 14.2 Kernel functions 479 14.2.1 RBF kernels 480 14.2.2 Kernels for comparing documents 480 14.2.3 Mercer (positive definite) kernels 481 14.2.4 Linear kernels 482 14.2.5 Matern kernels 482 14.2.6 String kerne…

Android开发-工程结构

一、项目视图模式在开始之前&#xff0c;确保你的 Project 面板使用的是 【Android】 视图&#xff08;默认&#xff09;。这是最常用的视图&#xff0c;它将相关文件按功能逻辑分组展示。&#x1f4a1; 你也可以切换到 【Project】 视图查看完整的文件系统结构。二、顶级项目结…

mysql的内置函数

文章目录mysql的内置函数时间函数1. 返回值的数据类型和格式2. 功能侧重点3. 函数别名情况我现在想给一个日期加上十天&#xff0c;然后输出加上十天之后的日期&#xff0c;我该怎么做&#xff1f;我现在想给一个日期减去两天&#xff0c;然后输出减去两天之后的日期&#xff0…

【动态规划】子序列问题

一、[最长递增子序列](https://leetcode.cn/problems/longest-increasing-subsequence/description/)二、[摆动序列](https://leetcode.cn/problems/wiggle-subsequence/description/)三、[最长递增子序列的个数](https://leetcode.cn/problems/number-of-longest-increasing-s…

P2P技术应用:去中心化

P2P技术应用&#xff1a;https://www.bilibili.com/video/BV1WH4y1Y7i9 P2P与下载器 P2P技术实现的下载协议&#xff1a; 1、种子文件 2、磁力 3、电骡 播放器&#xff1a; 快车、电骡、迅雷 BT&#xff08;种子&#xff09;下载的基本技术原理 网盘与P2P技术 网盘公司的主…

数据结构(C语言篇):(八)栈

目录 前言 一、概念与结构 二、栈的实现 2.1 头文件的准备 2.2 函数的实现 2.2.1 STInit( )函数&#xff08;初始化&#xff09; 2.2.2 STDestroy( )函数&#xff08;销毁&#xff09; 2.2.3 STPush( )函数&#xff08;入栈&#xff09; 2.2.4 STPop( )函数&#…