尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

Burp Suite自定义SQL注入扫描插件开发实战指南

Burp Suite自定义SQL注入扫描插件开发实战指南
📅 发布时间:2026/7/2 0:24:46

1. 项目概述:为什么需要自定义SQL注入扫描

在渗透测试和Web应用安全评估的日常工作中,Burp Suite是绕不开的核心工具。它的Scanner模块功能强大,能自动化发现大量常见漏洞。但如果你经常测试一些特定的、或者使用了非标准框架的应用,可能会发现一个尴尬的情况:Burp自带的扫描器要么漏报,要么产生大量误报,尤其是在SQL注入检测上。标准扫描器往往依赖于预定义的攻击载荷和模式匹配,对于使用了自定义过滤、WAF规则、或者ORM框架生成的特殊SQL语句结构,其检测效果会大打折扣。

这就是“自定义扫描”的价值所在。它不是一个替代品,而是一个强大的补充和放大器。通过编写Burp Suite插件,我们可以将渗透测试人员的经验、对特定目标代码逻辑的理解、以及对新型攻击手法的研究,固化为一套可重复、可优化、可分发的检测逻辑。简单来说,自定义扫描插件让你能“教会”Burp Suite如何更聪明、更精准地发现目标应用特有的SQL注入漏洞。这不仅仅是发送几个‘ OR ‘1’=’1那么简单,而是涉及到对请求/响应流的深度分析、上下文感知的载荷插入、以及基于应用行为的智能判断。

本篇文章,我将从一个实战者的角度,拆解如何从零构建一个用于SQL注入检测的Burp Suite插件。我们会涵盖从环境搭建、核心API理解、到扫描逻辑设计、以及最终的分析模块实现的完整流程。无论你是想提升自己团队的测试效率,还是想深入理解Burp Suite的扩展机制,这篇文章都将提供一条清晰的路径和大量“踩坑”后总结的实操经验。

2. 环境准备与Burp Extender API初探

2.1 开发环境搭建

开发Burp插件,首选的语言是Java,因为Burp本身基于Java开发,原生支持JAR包形式的扩展。虽然也有Python(通过Jython)和Ruby的选项,但为了获得最佳的性能、稳定性和API访问完整性,我强烈建议使用Java。

工具链选择:

  1. JDK: 建议使用JDK 8或JDK 11。Burp Suite(尤其是较新版本)对高版本JDK的兼容性有时会有小问题,JDK 8是最稳妥的选择。确保JAVA_HOME环境变量正确配置。
  2. IDE: IntelliJ IDEA或Eclipse。我个人更推荐IntelliJ IDEA,它对Maven/Gradle的支持和代码提示更友好,能极大提升开发效率。
  3. 构建工具: Maven或Gradle。用于管理依赖和打包。Burp Suite的API JAR包需要作为依赖引入。你可以直接从Burp Suite的安装目录(BurpSuitePro.jar所在目录)找到burp-api-xxx.jar,或者从PortSwigger的官方GitHub仓库下载对应版本。

创建项目(以Maven为例):在IntelliJ IDEA中新建一个Maven项目。在pom.xml中,关键配置是添加Burp Extender API依赖。这里有个坑:官方并不总是将API JAR发布到中央仓库,所以更可靠的方式是将下载的burp-api.jar安装到本地Maven仓库,或者使用system作用域指定本地路径。

<dependency> <groupId>net.portswigger.burp.extender</groupId> <artifactId>burp-extender-api</artifactId> <version>2.3</version> <!-- 版本号需与你使用的Burp版本对应 --> <scope>system</scope> <systemPath>${project.basedir}/lib/burp-api-2.3.jar</systemPath> </dependency>

将下载的API JAR文件放在项目根目录的lib文件夹下。另一种更“干净”的做法是使用mvn install:install-file命令将其安装到本地仓库,然后使用标准的groupId、artifactId和version来引用。

2.2 理解核心API:IBurpExtender与IScannerCheck

任何Burp插件都必须实现IBurpExtender接口,这是插件的入口点。这个接口只有一个方法:registerExtenderCallbacks(IBurpExtenderCallbacks callbacks)。IBurpExtenderCallbacks对象是你的插件与Burp Suite世界交互的“总控台”,通过它你可以设置插件名称、获取各种工具(如IExtensionHelpers辅助类)、注册扫描检查器、修改HTTP流量等。

对于扫描插件,核心是实现IScannerCheck接口,并通过callbacks.registerScannerCheck(this)进行注册。IScannerCheck定义了三个关键方法:

  • doPassiveScan(IHttpRequestResponse baseRequestResponse): 执行被动扫描。它分析给定的请求/响应消息,但不发送任何新请求。适合用于信息泄露、敏感数据、错误信息等检测。
  • doActiveScan(IHttpRequestResponse baseRequestResponse, IScannerInsertionPoint insertionPoint): 执行主动扫描。这是SQL注入检测的主战场。Burp会为每个可插入参数(GET/POST参数、Cookie、Header等)提供一个IScannerInsertionPoint对象,你的插件需要利用这个插入点,构造并发送攻击载荷,然后分析服务器的响应。
  • consolidateDuplicateIssues(Issue existingIssue, Issue newIssue): 合并重复的漏洞报告。当同一个漏洞被多次报告时,此方法决定如何合并。

一个最简插件骨架如下:

package com.example.burp.sqlscan; import burp.*; public class BurpExtender implements IBurpExtender, IScannerCheck { private IBurpExtenderCallbacks callbacks; private IExtensionHelpers helpers; @Override public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) { this.callbacks = callbacks; this.helpers = callbacks.getHelpers(); callbacks.setExtensionName("Custom SQLi Scanner"); // 注册扫描检查器 callbacks.registerScannerCheck(this); callbacks.printOutput("Custom SQLi Scanner loaded successfully!"); } @Override public List<IScanIssue> doPassiveScan(IHttpRequestResponse baseRequestResponse) { // 被动扫描逻辑,本文重点在主动扫描,此处可返回null return null; } @Override public List<IScanIssue> doActiveScan(IHttpRequestResponse baseRequestResponse, IScannerInsertionPoint insertionPoint) { // 主动扫描逻辑将在这里实现 List<IScanIssue> issues = new ArrayList<>(); // ... 你的检测代码 return issues.isEmpty() ? null : issues; } @Override public int consolidateDuplicateIssues(IScanIssue existingIssue, IScanIssue newIssue) { // 如果两个Issue的URL和漏洞名称相同,则认为是同一个 if (existingIssue.getUrl().equals(newIssue.getUrl()) && existingIssue.getIssueName().equals(newIssue.getIssueName())) { return -1; // -1 表示使用已存在的Issue } else { return 0; // 0 表示不合并 } } }

注意:在registerExtenderCallbacks中,务必通过callbacks.getHelpers()获取IExtensionHelpers实例。这个辅助类提供了大量解析HTTP请求、生成随机数、编解码等实用方法,能极大简化你的代码,避免重复造轮子。

3. 核心扫描逻辑设计与实现

3.1 定义攻击载荷与检测策略

一个有效的SQL注入检测插件,其核心在于攻击载荷库和与之匹配的检测逻辑。我们不能只依赖简单的布尔检测(如返回“You have an error in your SQL syntax”)。一个健壮的自定义扫描器应该实现多层次的检测策略。

1. 基于布尔逻辑的检测:这是最经典的方法。向插入点注入能改变原始SQL查询逻辑的载荷,通过对比真假条件下服务器响应的差异来判断。

  • 真条件载荷:‘ OR ‘1’=’1,‘) OR (‘1’=’1,‘ OR 1=1 --
  • 假条件载荷:‘ AND ‘1’=’2,‘) AND (‘1’=’2,‘ AND 1=2 --
  • 数字型参数:1 OR 1=1,1 AND 1=2

实现关键:如何定义“差异”?不能简单比较整个响应体。我们需要一个“差异比对器”。通常比较响应长度(helpers.analyzeResponse(response).getBodyOffset()获取的Body长度)是一个快速筛选方法,但不够可靠。更精细的做法是:

  • 提取特征区域:聚焦于动态内容区域,例如数据库错误信息可能出现的区域、查询结果回显的区域。这需要分析基线响应(原始请求的响应)。
  • 使用模糊哈希(Fuzzy Hash)或编辑距离:对于响应内容进行局部相似度比较,容忍一些动态变化(如时间戳、CSRF Token)。

2. 基于时间盲注的检测:当应用没有直接回显或错误信息时,时间盲注是利器。注入能引起数据库延时执行的载荷,如‘; SELECT SLEEP(5) --(MySQL),通过测量响应时间来判断。

  • 挑战:网络延迟抖动可能导致误判。必须建立合理的基线时间和阈值。
  • 实现:发送一个“基准载荷”(如‘ AND SLEEP(0) --)测量正常响应时间T_base。再发送延时载荷(如‘ AND SLEEP(5) --)测量时间T_delay。如果(T_delay - T_base) > 阈值(如4秒),则怀疑存在注入。
  • 技巧:延时时间不宜过长(通常3-10秒),避免拖慢扫描速度。可以发送多个延时请求取平均值,提高准确性。

3. 基于报错信息的检测:注入能触发数据库报错的载荷,从错误信息中提取证据。例如,在MySQL中利用extractvalue()或updatexml()函数:‘ AND extractvalue(1, concat(0x7e, version())) --。

  • 实现:在发送载荷后,分析响应内容,使用正则表达式匹配常见的数据库错误信息模式(如“You have an error in your SQL syntax”,“Microsoft OLE DB Provider for ODBC Drivers”,“PostgreSQL ERROR:”等)。
  • 优势:一旦触发,证据确凿,误报率极低。

4. 联合查询检测(适用于有回显的点):尝试注入UNION SELECT语句,观察页面是否将查询结果回显。这需要猜测列数(通过ORDER BY)和每列的数据类型。

  • 自动化挑战:自动化猜测列数和类型比较耗时,容易产生大量请求。在自定义插件中,可以针对已知框架或模式进行优化。例如,如果识别出应用使用Laravel的Eloquent ORM,可能更容易推断出背后的查询结构。

3.2 实现主动扫描方法doActiveScan

在doActiveScan方法中,我们将上述策略付诸实践。方法的输入是基础请求/响应和插入点。我们的任务是:针对这个插入点,依次尝试各种检测策略,如果发现漏洞,则构造并返回一个IScanIssue对象列表。

步骤分解:

  1. 获取基线信息:使用插入点buildRequest(byte[] payload)方法,构造一个“无害”的请求(如空载荷或原值),发送并获取基线响应。记录基线响应的长度、特定标记内容、响应时间。

    // 获取原始值作为基线的一部分(可选) byte[] originalValue = insertionPoint.getInsertionPointValue(); // 构建并发送基线请求(例如,插入一个不会改变逻辑的占位符) byte[] baselineRequest = insertionPoint.buildRequest("".getBytes()); // 插入空值 IHttpRequestResponse baselineReqResp = callbacks.makeHttpRequest( baseRequestResponse.getHttpService(), baselineRequest); byte[] baselineResponse = baselineReqResp.getResponse(); int baselineLength = helpers.analyzeResponse(baselineResponse).getBodyOffset(); long baselineTime = System.currentTimeMillis(); // 记录开始时间 // ... 发送请求 ... baselineTime = System.currentTimeMillis() - baselineTime; // 计算耗时
  2. 循环载荷库:遍历你预先定义好的载荷列表。每个载荷应包含:载荷字符串、对应的检测策略类型(布尔真/假、时间盲注、报错等)。

    List<Payload> payloads = Arrays.asList( new Payload("' OR '1'='1", Payload.Type.BOOLEAN_TRUE), new Payload("' AND '1'='2", Payload.Type.BOOLEAN_FALSE), new Payload("' AND SLEEP(5)-- ", Payload.Type.TIME_BASED), new Payload("' AND extractvalue(1,concat(0x7e,version()))-- ", Payload.Type.ERROR_BASED) );
  3. 发送攻击请求并分析:

    • 对于布尔型:分别发送真、假载荷,比较响应与基线的差异(使用前面提到的差异比对器)。
    • 对于时间型:发送延时载荷,精确测量响应时间,与基线时间对比。
    • 对于报错型:发送报错载荷,在响应体中搜索数据库错误模式。
    • 关键API:使用callbacks.makeHttpRequest()发送请求。这是一个异步调用,但对于时间盲注,我们需要同步等待。Burp的API调用本身是同步的,但要注意整个扫描队列的管理。
  4. 判断与生成Issue:如果某个载荷的响应满足漏洞判定条件(如布尔逻辑成立、延时显著、发现报错信息),则构造一个自定义的IScanIssue实现类对象,添加到返回列表中。

    if (isVulnerable) { issues.add(new CustomScanIssue( baseRequestResponse.getHttpService(), helpers.analyzeRequest(baseRequestResponse).getUrl(), new IHttpRequestResponse[] { callbacks.applyMarkers(baseRequestResponse, requestMarkers, responseMarkers) }, "SQL Injection Vulnerability", "Detailed description...", "High", "Certain" )); }

    applyMarkers方法非常重要,它用于在Burp的UI中高亮显示请求/响应中与漏洞相关的部分(即我们注入的载荷和服务器响应的特征部分),极大方便了后续的手动验证。

实操心得:在实现差异比对时,不要只依赖响应长度。我曾在测试一个大型Java应用时,发现无论注入什么,响应长度都固定,因为错误被封装在JSON的一个字段里。后来我改为提取JSON中特定的error字段内容进行比对,才成功检测到漏洞。教训是:理解目标应用的响应结构比盲目发送载荷更重要。

4. 构建智能分析模块

一个只会报告“发现SQL注入”的插件是初级的。高级的插件应该能提供分析信息,帮助测试者快速理解漏洞的上下文、数据库类型、甚至可能的利用方式。这就是分析模块的价值。

4.1 指纹识别与数据库类型判断

在检测到漏洞后,我们可以通过一些技巧尝试判断后端数据库的类型,这能为后续的利用提供方向。

  • 基于报错信息:这是最准确的方式。不同的数据库有独特的错误信息风格。

    • MySQL:“You have an error in your SQL syntax”,“MySQL server version”
    • PostgreSQL:“PG::SyntaxError”,“PostgreSQL ERROR:”
    • Microsoft SQL Server:“Microsoft OLE DB Provider for SQL Server”,“Unclosed quotation mark”
    • Oracle:“ORA-”开头的错误代码。
    • 实现:在报错检测逻辑中,加入正则表达式匹配这些关键词,并将数据库类型作为漏洞详情的一部分输出。
  • 基于特定函数/语法:发送一些数据库特有的测试载荷。

    • 注入‘ AND ‘1’=’1和‘ AND ‘1’=’2如果都返回相同页面,可能不存在,或者有逻辑问题。可以尝试‘ AND 1=1和‘ AND 1=2。
    • 尝试注释符:--(SQL Server, Oracle),#(MySQL),/* */(多数通用)。
    • 尝试连接字符串函数:‘ || ‘1’(Oracle, PostgreSQL),‘+’1‘(SQL Server),CONCAT(‘a‘,‘b‘)(MySQL)。
    • 通过观察哪些语法被成功执行(改变了响应),可以间接推断数据库类型。

4.2 上下文感知与WAF/过滤器绕过

现代应用通常部署了WAF或具有自定义输入过滤器。一个聪明的扫描插件应该能尝试识别过滤规则并生成绕过载荷。

  • 探测过滤规则:

    1. 发送一个简单的注入载荷‘ OR 1=1 --。
    2. 如果请求被阻断或返回异常(如403, 或包含“blocked”、“forbidden”等字样),则可能存在WAF。
    3. 尝试大小写混淆:‘ oR 1=1 --
    4. 尝试URL编码:%27%20OR%201%3D1%20--
    5. 尝试双写关键字:‘ OORR 1=1 --(假设过滤器移除OR后变成‘ OR 1=1 --)
    6. 尝试插入注释分隔符:‘ /*!OR*/ 1=1 --(MySQL内联注释)
    7. 尝试使用非常规空白符:‘%0BOR%0C1=1 --(使用垂直制表符、换页符等)
  • 实现自适应载荷生成:插件可以维护一个“绕过技术”列表。当基础载荷被阻断时,自动迭代尝试各种绕过技术,直到找到一个能到达后端应用的载荷变体。这需要插件具备一定的状态记忆能力,知道当前对哪个目标、哪个参数正在尝试哪种绕过技术。

  • 分析响应,识别防护模式:除了阻断,有些WAF会“净化”输入,例如将单引号转义为\'。插件可以检测响应中是否包含被转义后的原始载荷,从而判断出净化行为,并调整策略(例如尝试数字型注入或无引号注入)。

4.3 漏洞验证与误报降低

主动扫描插件最大的挑战之一是平衡检出率和误报率。一个狂轰滥炸产生几百个“疑似漏洞”的插件毫无价值。我们必须加入严谨的验证逻辑。

  • 多重条件验证:不要因为一次布尔逻辑成功就断定有漏洞。可以采用“三步验证法”:
    1. 真条件成立:注入‘ OR ‘1’=’1,页面状态/内容发生变化(与基线不同)。
    2. 假条件成立:注入‘ AND ‘1’=’2,页面状态/内容发生变化(与基线不同),且变化模式与真条件相反(例如,真条件显示了额外数据,假条件则不显示)。
    3. 中性条件:注入一个不会改变逻辑的随机字符串(如‘ AND ‘1’=’1,注意这里‘1’=’1恒真,所以整个条件取决于前面的AND,如果原查询无WHERE,可能出错,需谨慎设计),观察页面是否恢复基线状态或产生另一种变化。这有助于排除页面本身存在随机内容的情况。
  • 时间盲注的统计验证:对于时间盲注,发送多次延时请求(如3次),要求多次测量结果都显著超过阈值,并且平均延时与注入的延时值有合理的相关性(例如,注入SLEEP(5),平均响应增加应在4.5-5.5秒之间)。这可以排除偶发的网络延迟高峰。
  • 人工验证辅助标记:在生成的IScanIssue中,提供尽可能详细的证据:高亮显示请求中的注入点、响应中的差异部分或报错信息。让安全工程师能快速复核,这是降低插件“信任成本”的关键。

5. 插件优化、打包与实战调试

5.1 性能优化与资源管理

扫描插件如果设计不当,很容易拖慢整个Burp Suite,甚至导致卡死。以下是一些优化点:

  • 控制请求速率:避免在doActiveScan中快速循环发送大量请求。可以使用Thread.sleep()进行小幅延迟,或者更优雅地,利用Burp的扫描队列机制本身(但自定义检查器对队列控制力较弱)。一个折中方案是,在插件设置中增加一个“请求延迟(毫秒)”的配置项。
  • 合理使用线程:doActiveScan方法是在Burp的扫描线程池中被调用的。不要在方法内部再显式创建大量线程,这会导致线程爆炸。Burp的扫描引擎本身是并发的,你的插件逻辑应保持相对轻量和同步。
  • 缓存机制:对于同一个主机/路径,可能多次调用doActiveScan(针对不同参数)。可以考虑缓存基线响应、数据库指纹等信息,避免重复计算。但要注意缓存的生命周期和线程安全。
  • 载荷库的精简与针对性:不要加载一个包含成千上万条载荷的巨型文件。根据初步的指纹识别(如应用技术栈:PHP/Java/.NET, 数据库疑似类型:MySQL/MSSQL),动态加载最相关的载荷子集。

5.2 插件配置与用户交互

一个好的插件应该允许用户进行一些配置,以适应不同的测试环境。

  • 实现ITab接口:为你的插件创建一个图形配置界面(Swing或JavaFX)。可以放置以下配置项:
    • 开关:启用/禁用特定检测策略(布尔、时间、报错、联合查询)。
    • 阈值设置:时间盲注的延时阈值、布尔检测的相似度阈值。
    • 载荷管理:允许用户导入、导出、编辑自定义载荷文件。
    • 目标范围:设置插件的生效范围(如特定域名、URL路径)。
  • 使用callbacks.saveExtensionSetting()和callbacks.loadExtensionSetting():持久化保存用户的配置。
  • 输出调试信息:在开发阶段,充分利用callbacks.printOutput()和callbacks.printError()将调试信息打印到Burp的Extender标签下的Output和Errors窗口。这是排查问题的生命线。

5.3 打包、部署与问题排查

  1. 打包:使用Maven或Gradle将你的项目及其所有依赖(除了Burp API,因为Burp自带)打包成一个可执行的JAR文件(mvn clean compile assembly:single)。

    重要提示:确保打包时不包含burp-extender-api的JAR。这个JAR应该被标记为provided作用域,因为Burp运行时环境会提供它。如果打包进去,可能会导致类加载冲突,使插件无法加载。

  2. 部署:在Burp Suite中,切换到Extender->Extensions->Add,选择Extension type为Java,然后浏览并加载你生成的JAR文件。

  3. 常见问题排查:

    • 插件加载失败:检查Output和Errors窗口。最常见的原因是:
      • Java版本不兼容:尝试切换JDK 8。
      • 依赖冲突:确保没有打包进冲突的库。使用mvn dependency:tree检查。
      • 未实现IBurpExtender接口或构造函数不是默认的:插件主类必须有一个公共的无参构造函数。
    • 插件加载成功但无效果:
      • 检查是否在registerExtenderCallbacks中正确注册了IScannerCheck。
      • 在doActiveScan方法开始处添加printOutput语句,确认方法被调用。
      • 检查你的扫描逻辑是否过于严格,导致没有触发漏洞判定条件。尝试对一个已知漏洞(如DVWA的SQL注入关卡)进行测试。
    • Burp变卡或崩溃:
      • 检查是否有死循环或递归。
      • 检查是否在扫描方法中进行了耗时的同步网络I/O(除了makeHttpRequest)。
      • 使用Java VisualVM等工具监控插件的内存和CPU使用情况。

一个实用的调试技巧:在开发初期,可以先实现一个“回声”插件。在doActiveScan中,只是简单打印插入点的类型、位置和基值,而不发送任何攻击请求。这能帮你确认插件框架是否正常工作,以及Burp为你提供了哪些插入点。确认无误后,再逐步加入复杂的检测逻辑。

6. 从插件到平台:扩展思路与高级应用

当你掌握了基础插件的开发后,可以探索更高级的应用,将简单的扫描器升级为一个分析平台。

  • 与Burp其他工具联动:你的插件不仅可以做扫描,还能与其他模块交互。
    • IScannerListener: 监听Burp全局的扫描事件,当其他扫描器(或你的插件)发现漏洞时,触发自定义逻辑,例如自动将漏洞信息发送到工单系统。
    • IHttpListener: 监听所有经过Burp代理的HTTP流量。你可以用它来实时检测流量中的SQL注入模式,甚至实现被动式的、基于流量学习的SQL注入检测。
    • IMessageEditorTabFactory: 为Burp的请求/响应编辑器添加自定义标签页。例如,可以创建一个标签页,专门用于格式化、高亮显示SQL查询(如果从请求中提取出来),或对响应中的JSON数据进行SQL注入相关的模式分析。
  • 集成外部情报与AI:
    • 调用外部API来查询某个SQL注入特征是否在公开漏洞库(如CVE)中存在。
    • (概念性探索)将请求/响应特征向量化,使用一个本地训练的简单机器学习模型(需离线训练,插件内集成模型文件)来辅助判断是否存在漏洞。这可以作为传统规则引擎的一个补充,用于发现新型、变种的注入模式。注意:这实现复杂,且对性能影响大,需谨慎评估。
  • 生成漏洞报告与利用建议:在IScanIssue的getRemediationDetail()方法中,不仅描述漏洞,还可以提供具体的、针对性的修复建议(如:建议对id参数使用预编译语句PreparedStatement),甚至提供简单的概念验证(PoC)利用代码片段。

开发Burp自定义扫描插件是一个深度结合安全知识、编程能力和对目标理解的过程。它迫使你不仅仅是一个工具的使用者,更成为一个思考者,去理解漏洞的本质、检测的原理以及自动化与人工智慧的边界。从这个项目出发,你可以将同样的思路应用到XSS、SSRF、命令注入等其他漏洞的检测上,逐步构建起属于自己的自动化安全测试武器库。

相关新闻

  • 基于OpenVAS构建企业级自动化漏洞扫描体系:从架构设计到安全运营
  • 终极指南:掌握Juicebox进行Hi-C数据可视化与三维基因组分析
  • TVBoxOSC电视盒子全能播放器:3步打造家庭影院级观影体验

最新新闻

  • 原生Signals正式落地、管道操作符终结“嵌套地狱”、WebNN调用NPU算力——4个让前端代码“减重”50%的ES2026特性
  • AI服装设计工作流拆解:为什么说下一站不是“AI画图工具”,而是“垂直AI设计平台”
  • 检索增强从零落地:检索增强系统的索引、召回与评测
  • AI 辅助:Node.js 与 Go 后端选型:高并发不是唯一判断标准
  • Java毕业设计-基于 Java 的在线文献分类管理系统的设计与实现 基于 Java 的在线文献检索管理系统(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • 3分钟上手AutoScreenshot:Windows和Linux自动截屏神器

日新闻

  • Python Playwright录制功能:从零到一构建自动化测试脚本
  • 如何用开源工具永久保存你心爱的小说:novel-downloader全攻略
  • In-Context Learning不是教知识,而是模式对齐:从5个示例到100个工业级样本的真相

周新闻

  • Windows字体自定义终极方案:No!! MeiryoUI完全指南
  • Deepin Boot Maker:告别命令行,3分钟制作Linux启动盘的智能解决方案
  • Plain Craft Launcher 2:重新定义你的Minecraft游戏体验

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号