标签 SQLite 下的文章

摘要:
OceanBase联合中国人民大学数据库团队的数据库缺陷实证研究,被软件工程顶刊IEEE TSE录用。该研究首次构建了面向开源关系型数据库的细粒度缺陷分类体系,共获得12 项发现,为RDBMS系统的开发维护和测试提供了重要启示。研究发现,涉及SQL数据类型及数据库触发器、存储过程、参数设置等复杂功能的缺陷现有测试工作无法有效触发,这一发现为提升RDBMS缺陷检测能力提供了显著改进空间。

日前,由 OceanBase 联合中国人民大学数据库系统研究团队(刘爽副教授)对主流关系型数据库系统缺陷开展的实证研究《A Comprehensive Study of Bugs in Relational DBMS》被软件工程领域顶级期刊 IEEE Transactions on Software Engineering(TSE) 正式录用。

IEEE TSE 是 IEEE 旗下软件工程方向的权威期刊。在数据库缺陷实证研究方面,本论文首次系统分析了 MySQL 等三个开源数据库中 777 个真实缺陷,揭示了 RDBMS 的缺陷在根因、表症等方面的特点,以及现有测试工具在深层语义缺陷检测上的局限性。

以下为论文介绍。

简 介

本研究通过“系统性实证分析”揭示主流关系型数据库在真实场景中的缺陷规律。研究覆盖 MySQL、SQLite 和 openGauss 三大系统中 777 个高质量修复缺陷,深入剖析其根本原因、症状表现、分布特征及其关联性。

其核心贡献在于:首次构建了面向开源关系型数据库的细粒度缺陷分类体系,研究共获得 12 项发现,为 RDBMS 系统的开发维护和测试提供了重要启示。研究发现,涉及 SQL 数据类型及数据库触发器、存储过程、参数设置等复杂功能的缺陷现有测试工作无法有效触发,这一发现为提升 RDBMS 缺陷检测能力提供了显著改进空间。

方法与分类体系


表1:采集 bug 的统计信息

本研究通过一套严谨的实证方法对关系型数据库中的真实缺陷进行系统性分类与归因。围绕三个核心维度展开:根因、症状和修复模块。研究团队从 MySQL、SQLite 和 openGauss 的官方仓库中收集了 2018 至 2023 年间报告的 2495 个缺陷,经过严格筛选后构建了一个高质量的 777 个缺陷数据集。

在此基础上,作者提出了一套四维分析框架:

根因维度识别出 12 类根本问题(如错误逻辑、API 误用、类型处理缺陷等);
症状维度归纳了包括错误结果、崩溃、死锁、性能退化等行为;
模块维度定位缺陷修复位置(如解析器、优化器、执行引擎、存储层等);
关联性进一步探索三者之间的关联规律,例如“类型相关根因多导致错误结果,且集中于表达式求值模块”。

为确保标注一致性,两名研究人员独立完成全部标签分配,并通过 Cohen’s Kappa 系数评估达成共识。该方法不仅保证了分析的客观性,也为后续数据库测试工具的设计提供了可操作的指导依据。

结果与分析

研究揭示了多项关键发现。首先,在根因分布上,“不正确的代码逻辑”占比最高达 32.3%,“类型处理缺陷”和“API 误用”分别以 9.0% 和 8.4% 的比例成为第二、第三大类根因。其次,在症状表现方面,“结果不一致”是最普遍的症状,占全部缺陷的 42.99%,且往往无崩溃、无报错,具有极强的隐蔽性。


图1:按根本原因划分的缺陷分布

进一步的跨系统对比显示:MySQL 与 SQLite 在缺陷模式上高度相似,而 openGauss 因架构差异与活跃开发状态,表现出显著不同的缺陷谱系。这些结果不仅刻画了数据库内核的脆弱面,也为未来高可靠数据库的设计与质量保障工作指明了方向。


图2:症状与根因的关系

概念验证工具 SQLT

研究中观察到类型相关缺陷在数据库 bug 中占比显著,团队开发了一个概念验证工具 SQLT,用于针对性挖掘此类问题。SQLT 强化了对跨数据类型表达式、隐式类型转换以及非标准类型(如 BIT、JSON)组合的查询生成能力。

该工具通过比对语义等价查询的执行结果,能够有效识别那些不触发崩溃但返回错误结果的静默逻辑缺陷。在实验中,SQLT 不仅成功复现了多个已知类型 bug,还新发现 8 个此前未被报告的问题,其 5 个已被 MySQL、SQLite 和 openGauss 官方确认并修复。


表2:SQLT检测到的缺陷

欢迎访问 OceanBase 官网获取更多信息:https://www.oceanbase.com/

前言

前阵子写的日志分析工具NginxPulse,自开源以来,已过去 2 周时间,目前 GitHub 已收获 1.5k 的 star 。收到了不少用户的反馈建议,花了点时间将这些问题都处理了下。

本文就跟大家分享下新版本都解决了哪些问题,优化了哪些内容,欢迎各位感兴趣的开发者阅读本文。

抛弃 SQLite

有不少用户反馈说日志文件很大的时候( 10G+),解析速度非常慢,需要解析好几个小时,解析完成之后数据看板的查询也比较慢(接口响应在 5 秒左右)。

于是,我重写了日志解析策略(解析阶段不做 IP 归属地查询,仅入库其他数据,将日志中 IP 记录起来),日志解析完毕后,将记录的 IP 做去重处理,随后去做归属地的查询处理(优先本地的 ip2region 库,远程的 API 调用查询做兜底),最后将解析到的归属地回填至对应的数据库表中,这样一套下来就可以大大提升日志的解析速度。

数据库的数据量大了之后,SQLite 的表现就有点差强人意了,请教了一些后端朋友,他们给了我一些方案,结合我自身的实际场景后,最后选定了 PostgreSQL 作为新的数据库选型。

这套方案落地后,用户群的好兄弟说:他原先需要解析 1 个小时的日志,新版只需要 10 多分钟。

6c1c8781ddb810d57c9f508fdaf47025

UI 配置可视化使用

有一部分用户反馈说他非专业人士,这些晦涩的配置对他来说使用门槛太高了,希望能有一个 UI 配置页面,他只需要点一点、敲敲键盘,就能完成这些配置。

我将整个配置流程做成了 4 步,同时也准备一个[演示视频](NginxPulse 支持 UI 配置化了) - https://www.bilibili.com/video/BV1hqzyBVEU9:

  • 配置站点
  • 配置数据库
  • 配置运行参数
  • 确认最终配置

image-20260125235847464

新增 wiki 文档

因为配置过于庞大,仓库主页浏览 README.md 比较费劲,希望能整理一份 wiki 文档发上去。

花了点时间,简化了下 README ,整理了一份: https://github.com/likaia/nginxpulse/wiki

image-20260126000555725

访问明细模块优化

有部分用户反馈说希望增加更多的筛选条件以及导出 Excel 功能,现在它来了:

image-20260126001010068

概况模块优化

概况页面的日期筛选之前放在趋势分析卡片的上方,但是他的切换影响的维度还包含了指标,于是我就调整了下它的位置,新版如下图所示:

image-20260126001325265

项目地址

写在最后

至此,文章就分享完毕了。

我是神奇的程序员,一位前端开发工程师。

如果你对我感兴趣,请移步我的个人网站,进一步了解。

CyberStrikeAI:让安全测试像对话一样简单——智能渗透测试的技术实践

先附上开源工具链接:

https://github.com/Ed1s0nZ/CyberStrikeAI

从工具堆砌到智能调度:渗透测试的演进之路

作为安全工程师,我们都经历过这样的场景:面对一个新的目标系统,我们需要在数十个安全工具之间不断切换,记忆各种复杂的命令行参数,手动分析海量的扫描结果,然后在不同的工具输出中寻找关联性。这种工作方式不仅效率低下,更严重的是,我们往往在工具的使用上花费了太多精力,反而减少了对安全威胁本质的思考时间

技术人的解决方案:CyberStrikeAI的设计理念

CyberStrikeAI不是要取代安全工程师,而是要成为工程师的智能助手。基于一个朴素但强大的想法:用技术手段解决技术问题,让AI处理重复性工作,让人专注于创造性分析

效果

对话效果


MCP调用

调用链

核心架构:Golang + MCP协议的工程化实现

// 核心架构简示
Agent Loop (AI决策引擎)
    ↓
MCP Server (工具调度中心)  
    ↓
Security Executor (命令执行层)
    ↓
98+ Security Tools (工具生态)

技术栈选择背后的思考

  • Golang:并发性能优异,跨平台编译方便,部署简单
  • MCP协议:标准化工具调用,确保扩展性和兼容性
  • SQLite:轻量级数据存储,适合单机部署场景

实际工作流程对比

传统方式

# 1. 端口扫描
nmap -sS -sV -O 192.168.1.0/24

# 2. Web服务识别
httpx -l targets.txt -title -status-code

# 3. 漏洞扫描  
nuclei -l targets.txt -t /nuclei-templates/

# 4. 手动分析结果,决定下一步...

CyberStrikeAI方式

"对192.168.1.0/24网段进行全面的安全评估,重点关注Web服务漏洞"

系统自动完成:

  1. 识别网络范围,调用nmap进行主机发现
  2. 对发现的Web服务调用httpx进行指纹识别
  3. 基于服务指纹选择相应的漏洞检测模板
  4. 自动分析结果,对可疑目标进行深度扫描
  5. 生成结构化报告,包括漏洞详情和修复建议

面向安全工程师的技术特性

工具集成:不重复造轮子

我集成了98+个经过社区验证的安全工具,包括:

  • 信息收集:nmap, subfinder, amass, theharvester
  • 漏洞扫描:nuclei, sqlmap, xsser, dalfox
  • Web安全:dirb, gobuster, nikto, wafw00f
  • 专项工具:wpscan, jexboss, ysoserial

每个工具都通过YAML配置文件进行标准化封装:

name: "nmap"
command: "nmap"
args: ["-sT", "-sV", "-sC"]
description: "网络扫描工具,用于发现网络主机、开放端口和服务"

parameters:
  - name: "target"
    type: "string"
    description: "目标IP地址或域名"
    required: true

智能决策:AI作为调度器

AI在系统中的角色不是替代工具,而是智能调度器和结果分析器

// AI决策流程
1. 理解用户自然语言请求
2. 分析目标特征和测试需求  
3. 选择最适合的工具组合
4. 动态调整参数优化扫描效果
5. 解析工具输出,提取关键信息
6. 基于发现决定后续测试路径

实时监控:掌握测试全过程

系统提供完整的执行监控:

# 查看工具执行状态
GET /api/monitor

# 实时查看漏洞统计
{
  "total": 23,
  "severityCount": {
    "critical": 2,
    "high": 5, 
    "medium": 10,
    "low": 6
  }
}

实际应用场景分析

场景一:红队渗透测试

需求:快速对目标企业进行外围渗透测试
传统方式:手动信息收集 → 工具链执行 → 结果整理 (耗时:4-6小时)
CyberStrikeAI:单次对话描述测试目标 → 自动执行完整流程 (耗时:30-60分钟)

场景二:漏洞复现与验证

需求:批量验证SRC提交的漏洞
传统方式:逐个手动测试,重复性工作量大
CyberStrikeAI:批量导入目标 → 自动匹配检测方案 → 生成验证报告

场景三:安全巡检

需求:定期对资产进行安全巡检
传统方式:编写脚本,定时执行,人工分析
CyberStrikeAI:配置巡检策略 → 自动执行 → 差异对比 → 告警通知

扩展性与二次开发

自定义工具集成

通过标准的YAML配置即可集成新工具:

name: "custom-scanner"
command: "python3"
args: ["/tools/myscanner.py"]
parameters:
  - name: "target"
    type: "string"
    required: true

API集成现有流程

系统提供完整的REST API,可轻松集成到现有安全体系中:

# 集成到自动化漏洞管理平台
def trigger_scan(target, scan_type):
    response = requests.post(
        'http://cyberstrike-ai:8080/api/agent-loop',
        json={'message': f'{scan_type}扫描 {target}'}
    )
    return process_results(response.json())

技术人的实践建议

部署方案

  • 开发测试:本地Docker部署,快速验证
  • 团队使用:服务器部署,共享使用
  • 集成环境:API方式集成到现有安全平台

使用技巧

  1. 渐进式测试:从基础扫描开始,逐步深入
  2. 结果验证:AI发现的关键漏洞建议人工复核
  3. 工具补充:根据实际需求扩展工具库

结语:技术赋能,专注价值

CyberStrikeAI的本质是通过技术手段提升安全工程师的工作效率,让我们从繁琐的工具操作中解放出来,更加专注于威胁分析、漏洞研究和防护策略等更有价值的工作。

在网络安全人才紧缺的今天,提升个体工程师的效率就是提升整个行业的安全水位。我相信,好的工具应该像得力的助手一样,默默处理繁琐工作,让专家专注于专业判断。

项目地址https://github.com/Ed1s0nZ/CyberStrikeAI

让技术回归本质,让安全测试变得更加高效——这是CyberStrikeAI的技术追求,也是我对安全社区的诚意贡献。

作为一名求职中的中年软件工程师,由于地域和年龄限制,我的选择空间其实就那么几家。我经常需要反复查看自己感兴趣公司的招聘页面。这一过程既耗时又枯燥,尤其是在需要同时跟踪多家公司职位的情况下。虽然许多招聘网站都提供基于邮件的职位提醒,但这些提醒通常要么依赖于对已提交简历进行不透明的 AI 匹配,要么只是简单的关键词匹配。在这两种情况下,我对实际的匹配条件几乎没有控制权。

为了解决这个问题,我决定利用一个 AI Agent 来自动 Watching 招聘页面,并在发布符合我自己定义条件的新职位时通知我。在本文中,我将介绍一个用于验证这一想法的概念验证(PoC)。

在这个 PoC 中,我展示了如何使用 AI Agent 来 Watching 一家公司招聘页面上的软件开发岗位。该 Agent 能够自动浏览招聘网站、搜索相关职位、提取结构化信息,并将结果存储到 SQLite 数据库中,以便后续查询和跟踪。

PoC

职位数据来源

在本次实验中,我选择了一家其招聘页面基于 Eightfold AI 平台构建的公司。如果你的目标公司同样使用 Eightfold AI,那么只需做很少的修改即可复用该 PoC。

Eightfold AI 是一个人才智能平台,利用人工智能支持招聘、员工留任以及劳动力发展。它基于技能和经验将候选人与开放职位进行匹配,目前已被包括 Vodafone、Morgan Stanley 和 Chevron 在内的 100 多家公司使用。该平台覆盖 155 多个国家。

尽管 Eightfold AI 平台本身已经提供了基于 AI 的职位提醒订阅功能,但我仍希望对匹配逻辑和采集到的数据拥有更细粒度的控制,因此才希望有一套自定义解决方案。

Agent 设计

我在 VS Code Copilot Chat 环境中实现了该 PoC,并使用了以下工具和提示词。

MCP 工具

  • 浏览器工具browsermcp:用于导航和操作招聘网站页面。
  • SQLite 数据库工具genai-toolbox:用于持久化存储提取到的职位数据。

./vscode/mcp.json

{
  "servers": {
    "browsermcp": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "@browsermcp/mcp@latest"
      ]
    },
    "sqlite": {
      "command": "~/genai-toolbox/toolbox",
      "args": [
        "--prebuilt",
        "sqlite",
        "--stdio"
      ],
      "env": {
        "SQLITE_DATABASE": "~/jobs/jobs.db"
      }
    }
  }
}

数据库 Schema

CREATE TABLE IF NOT EXISTS xyz_company_jobs (
    job_id TEXT PRIMARY KEY, -- 职位的唯一标识
    req_id TEXT,             -- 招聘需求 ID
    job_title TEXT,          -- 职位名称
    location TEXT,
    date_posted TEXT,        -- 格式:'YYYY-MM-DD'
    business_department TEXT,
    job_description_url TEXT,
    job_description TEXT     -- 职位描述的主要内容
);

Agent 提示词

你是一个可以访问浏览器工具和 SQLite 数据库工具的 AI Agent。你的任务是从 XYZ_Company 的招聘网站中收集与软件开发相关的职位信息,并将提取到的数据存储到 SQLite 数据库中。当前浏览器中打开的页面是 XYZ_Company 的职位搜索门户。

数据库:
```sql
CREATE TABLE IF NOT EXISTS xyz_company_jobs (
    job_id TEXT PRIMARY KEY, -- 职位的唯一标识
    req_id TEXT,             -- 招聘需求 ID
    job_title TEXT,          -- 职位名称
    location TEXT,
    date_posted TEXT,        -- 格式:'YYYY-MM-DD'
    business_department TEXT,
    job_description_url TEXT,
    job_description TEXT     -- 职位描述的主要内容
)
```

规则:
- 在调用一次 `click()` 操作后,必须等待 10 秒,确保页面完全加载,然后再调用 `snapshot` 捕获当前页面状态。
- 在向 `xyz_company_jobs` 表插入新记录之前,需要检查 `job_id` 是否已经存在,以避免重复数据。
- 在生成 INSERT SQL 语句时,确保对值中的单引号进行正确转义。
- 不要收集或点击位于 `document > main > group Similar Position` 区域下的职位。

用户已经准备的环境:
- 浏览器中打开的页面是 XYZ_Company 的职位搜索门户。

你的安装过程:
1. 如果 `xyz_company_jobs` 表不存在,则创建该表。在执行 SQL 时,需保留 SQL 代码块中的注释行。

执行过程:
1. 每一个文本匹配 "$Job_Title$ 于 $time_since_publication$ 前发布" 模式的按钮都代表一个职位。通过 `今天 - time_since_publication` 计算 `Date Posted`。
2. 点击职位按钮以打开职位详情页面,该页面的 URL 即为 `Job Description URL`。
3. 从职位详情页面中提取:职位名称、工作地点、Job ID、业务部门(可选)、Req ID 以及职位描述的主要内容。
4. 仅收集与软件开发相关的职位。
5. 将每个收集到的职位插入 `xyz_company_jobs` 表,并基于 `job_id` 确保不产生重复记录。
6. 如有需要,点击 `更多职位` 按钮以加载更多职位。
7. 至少收集并存储 10 个职位。

运行

  1. 打开一个 Chrome 浏览器标签页,访问 XYZ 公司的招聘门户网站。在该标签页上激活 Browser MCP Chrome 扩展程序。
  2. 在 VS Code 中启动一个新的 Copilot Chat 会话,并使用上述 MCP 配置和提示。

总结

通过上述配置,我成功实现了一个 AI Agent,它能够自动 Watching 目标公司的招聘页面,发现新的软件开发职位。该 Agent 可以自动浏览招聘网站、识别相关职位、提取结构化数据,并将其存储到 SQLite 数据库中,从而方便后续访问和长期跟踪。

后续工作

该 PoC 还可以在多个方面进行扩展:

  • 引入更复杂的匹配逻辑,例如简历解析和基于语义的技能匹配。
  • 将收集到的职位信息导出为 RSS 或邮件摘要,从而构建一个完全自托管的职位提醒系统。
  • 添加通知机制,在发现新的匹配职位时立即提醒我。

作为一名求职中的中年软件工程师,由于地域和年龄限制,我的选择空间其实就那么几家。我经常需要反复查看自己感兴趣公司的招聘页面。这一过程既耗时又枯燥,尤其是在需要同时跟踪多家公司职位的情况下。虽然许多招聘网站都提供基于邮件的职位提醒,但这些提醒通常要么依赖于对已提交简历进行不透明的 AI 匹配,要么只是简单的关键词匹配。在这两种情况下,我对实际的匹配条件几乎没有控制权。

为了解决这个问题,我决定利用一个 AI Agent 来自动 Watching 招聘页面,并在发布符合我自己定义条件的新职位时通知我。在本文中,我将介绍一个用于验证这一想法的概念验证(PoC)。

在这个 PoC 中,我展示了如何使用 AI Agent 来 Watching 一家公司招聘页面上的软件开发岗位。该 Agent 能够自动浏览招聘网站、搜索相关职位、提取结构化信息,并将结果存储到 SQLite 数据库中,以便后续查询和跟踪。

PoC

职位数据来源

在本次实验中,我选择了一家其招聘页面基于 Eightfold AI 平台构建的公司。如果你的目标公司同样使用 Eightfold AI,那么只需做很少的修改即可复用该 PoC。

Eightfold AI 是一个人才智能平台,利用人工智能支持招聘、员工留任以及劳动力发展。它基于技能和经验将候选人与开放职位进行匹配,目前已被包括 Vodafone、Morgan Stanley 和 Chevron 在内的 100 多家公司使用。该平台覆盖 155 多个国家。

尽管 Eightfold AI 平台本身已经提供了基于 AI 的职位提醒订阅功能,但我仍希望对匹配逻辑和采集到的数据拥有更细粒度的控制,因此才希望有一套自定义解决方案。

Agent 设计

我在 VS Code Copilot Chat 环境中实现了该 PoC,并使用了以下工具和提示词。

MCP 工具

  • 浏览器工具browsermcp:用于导航和操作招聘网站页面。
  • SQLite 数据库工具genai-toolbox:用于持久化存储提取到的职位数据。

./vscode/mcp.json

{
  "servers": {
    "browsermcp": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "@browsermcp/mcp@latest"
      ]
    },
    "sqlite": {
      "command": "~/genai-toolbox/toolbox",
      "args": [
        "--prebuilt",
        "sqlite",
        "--stdio"
      ],
      "env": {
        "SQLITE_DATABASE": "~/jobs/jobs.db"
      }
    }
  }
}

数据库 Schema

CREATE TABLE IF NOT EXISTS xyz_company_jobs (
    job_id TEXT PRIMARY KEY, -- 职位的唯一标识
    req_id TEXT,             -- 招聘需求 ID
    job_title TEXT,          -- 职位名称
    location TEXT,
    date_posted TEXT,        -- 格式:'YYYY-MM-DD'
    business_department TEXT,
    job_description_url TEXT,
    job_description TEXT     -- 职位描述的主要内容
);

Agent 提示词

你是一个可以访问浏览器工具和 SQLite 数据库工具的 AI Agent。你的任务是从 XYZ_Company 的招聘网站中收集与软件开发相关的职位信息,并将提取到的数据存储到 SQLite 数据库中。当前浏览器中打开的页面是 XYZ_Company 的职位搜索门户。

数据库:
```sql
CREATE TABLE IF NOT EXISTS xyz_company_jobs (
    job_id TEXT PRIMARY KEY, -- 职位的唯一标识
    req_id TEXT,             -- 招聘需求 ID
    job_title TEXT,          -- 职位名称
    location TEXT,
    date_posted TEXT,        -- 格式:'YYYY-MM-DD'
    business_department TEXT,
    job_description_url TEXT,
    job_description TEXT     -- 职位描述的主要内容
)
```

规则:
- 在调用一次 `click()` 操作后,必须等待 10 秒,确保页面完全加载,然后再调用 `snapshot` 捕获当前页面状态。
- 在向 `xyz_company_jobs` 表插入新记录之前,需要检查 `job_id` 是否已经存在,以避免重复数据。
- 在生成 INSERT SQL 语句时,确保对值中的单引号进行正确转义。
- 不要收集或点击位于 `document > main > group Similar Position` 区域下的职位。

用户已经准备的环境:
- 浏览器中打开的页面是 XYZ_Company 的职位搜索门户。

你的安装过程:
1. 如果 `xyz_company_jobs` 表不存在,则创建该表。在执行 SQL 时,需保留 SQL 代码块中的注释行。

执行过程:
1. 每一个文本匹配 "$Job_Title$ 于 $time_since_publication$ 前发布" 模式的按钮都代表一个职位。通过 `今天 - time_since_publication` 计算 `Date Posted`。
2. 点击职位按钮以打开职位详情页面,该页面的 URL 即为 `Job Description URL`。
3. 从职位详情页面中提取:职位名称、工作地点、Job ID、业务部门(可选)、Req ID 以及职位描述的主要内容。
4. 仅收集与软件开发相关的职位。
5. 将每个收集到的职位插入 `xyz_company_jobs` 表,并基于 `job_id` 确保不产生重复记录。
6. 如有需要,点击 `更多职位` 按钮以加载更多职位。
7. 至少收集并存储 10 个职位。

运行

  1. 打开一个 Chrome 浏览器标签页,访问 XYZ 公司的招聘门户网站。在该标签页上激活 Browser MCP Chrome 扩展程序。
  2. 在 VS Code 中启动一个新的 Copilot Chat 会话,并使用上述 MCP 配置和提示。

总结

通过上述配置,我成功实现了一个 AI Agent,它能够自动 Watching 目标公司的招聘页面,发现新的软件开发职位。该 Agent 可以自动浏览招聘网站、识别相关职位、提取结构化数据,并将其存储到 SQLite 数据库中,从而方便后续访问和长期跟踪。

后续工作

该 PoC 还可以在多个方面进行扩展:

  • 引入更复杂的匹配逻辑,例如简历解析和基于语义的技能匹配。
  • 将收集到的职位信息导出为 RSS 或邮件摘要,从而构建一个完全自托管的职位提醒系统。
  • 添加通知机制,在发现新的匹配职位时立即提醒我。

33 TB 的图书资源,STC 项目

Music 搜查(可以下载 80 多万歌歌词,但不能听)

10 多万首音乐 (可以在线听和搜查)

其他

其他

相关链接

Summa(tantivy 的 wasm 版,速度非常快)

LrcApi

https://docs.lrc.cx/

STC

sql.js-httpvfs

pdp

https://pdp-asset-v6-navy.ipns.gateway.v2ex.pro
大容量网盘,一次性上传超过 150 GiB,可以帮忙生成一个类似与 OpenList 的网页


📌 转载信息
原作者:
ozre
转载时间:
2026/1/18 08:52:01

  1. 最近同事为 ZimaOS 项目写了一个极简的 SQLite ORM:zorm,主打一个 简单、够快、好维护。​
  2. 只支持 sqlite,一个文件搞定嵌入式存储,适合小型服务、边缘设备、单机工具这类场景。​
  3. API 尽量贴近原生 SQL,没有复杂的魔法,熟悉 database/sql 的同学几分钟就能上手。​
  4. 内置自 mock 能力,做单元测试不再纠结怎么 stub 掉数据库调用。​
  5. 当前已经在 Zima 系列内部项目中吃自己狗粮,稳定性和性能还不错。​
  6. GitHub 地址:GitHub - IceWhaleTech/zorm: Zima ORM library (just sqlite) that is simple, ultra-fast and self-mockable for Go ,欢迎佬友拍砖、提 issue、提 PR。​
  7. 如果你也在用 Go+SQLite 写小工具或边缘服务,欢迎试用看看,顺手点个 star 支持一下。​

📌 转载信息
原作者:
linkliang
转载时间:
2026/1/16 18:48:38

KoalaLink
有三个版本
PRO:https://gokaola.top
Lite 演示站(后台密码 admin):https://go.dsi.mom
Nano:https://go.shanku.lol/
具体可以看演示站,已开源。PRO 版本还有点问题没有优化完。
GitHub - Bitkoala/KoalaLink: KoalaLink 考拉链 包含单文件以及自托管,极简单文件短链接跳转工具,零依赖、零配置,上传即用。轻量级短链接管理系统,内置品牌中转页与流量分析,基于 PHP + SQLite 开箱即用。




PRO 演示站点 vip 激活码


📌 转载信息
原作者:
Rgoking
转载时间:
2026/1/14 10:48:52


第三届“数信杯”数据安全大赛数据安全个人赛初赛

数据安全

第四题

题目描述:工程师小王为了保证数据的安全存储,开发了对数据处理的程序,但这样的处理方式安全吗?分析程序功能,解密文件获取原始数据,提交第6行第2列数据。

IDA打开程序



Base64解密即可,第六行数据

MjU3MTA4NzYwNDAgNzE2ODk2MTk4ODI5MDM3NDkzIGFkNzg2MkBiNy5jb20K



答案:716896198829037493

第五题

题目描述:工程师小王认识到前面开发的程序并不能保证对数据的安全存储,现在对处理程序进行了改进,这次能行吗?分析程序功能,解密文件获取原始数据,提交第8行第2列数据。



程序re1e97e14f是64位ELF可执行文件(Linux x86-64,stripped)。通过静态分析确定程序结构:

入口点_start位于0x401190,通过__libc_start_main调用main函数。main函数位于0x401579,负责文件读写和调用核心加密函数。核心加密函数sub_401276位于0x401276,实现三阶段加密处理。

程序执行流程:读取./info_81bedab.ori → 三阶段加密 → 输出./info_81bedab.ori.en

Stage A - 位运算变换(sub_401276内,地址0x4012FE~0x401360):

Stage B - RWX自解密代码执行(sub_401276内,地址0x401360~0x401450):

关键函数调用序列:

0x401368: call malloc(0x1000) 申请4KB内存

0x401380: call mprotect(page, 0x1000, 7) 设置RWX权限

0x4013A0: 从.data段地址0x404060复制0x84(132)字节代码块到RWX页

0x4013B8: 获取密钥 state = (uint16_t)(buf + 0x339)

0x4013D0: 循环调用RWX代码处理每个字节

0x84字节代码块结构(位于.data段0x404060):

解密后的变换代码(key=0x6E72解密后):

等效变换函数:

Stage C - 循环XOR(sub_401276内,地址0x401450~0x4014A0):

解密算法:

Stage C逆操作:cipher XOR "e6911c24" → B[]

从B[0x339]=0xEB, B[0x33A]=0xAB约束搜索Stage B密钥,得到key=0x6E72

Stage B逆操作:通过逆映射表还原 → A[]

Stage A逆操作:A[i] >> 1 → plaintext[]

验证:A[0x339]=0x72, A[0x33A]=0x6E,与key一致

解密成功

答案:878052199921046799

第六题



题目给出一个SQLite数据库文件,提示在Freeblock空闲块中隐藏了自定义链表数据。首先连接数据库查询sys_config表获取三个关键配置:


入口指针格式为"物理页号:偏移",页号0x13B=315,偏移0x4F0=1264,该偏移已跳过Freeblock的4字节头部

链表节点结构为大端序,NextPage占4字节,NextOff占2字节,Len占2字节

加密方式为使用当前物理页号的大端4字节表示循环异或

SQLite文件头偏移16-17处读取页大小为4096字节。链表遍历算法:从入口页315偏移1264开始,读取8字节头部解析出NextPage、

NextOff、Len,然后读取Len字节的加密数据,用struct.pack('>I', current_page)生成4字节密钥循环XOR解密。当NextPage=0且

NextOff=0时链表结束。

解密拼接后得到完整SQL脚本:



执行该SQL查询得到container_id=CN2888991777license_plate=粤B-52816,按题目要求提取container_id和license_plate后五位数字

用下划线连接。

答案:CN2888991777_52816

第七题

题目实现了一个存在漏洞的AES-CBC加密,核心代码如下:

漏洞在于hint泄露了key与message前16字节的异或值。

对于38字节的flag,自定义padding函数会在前面添加10个\x0a字节,得到48字节。PKCS7填充后变成64字节(4块)。

消息结构为:

Block 0: \x0a*10 + flag[0:6]

Block 1: flag[6:22]

Block 2: flag[22:38]

Block 3: \x10*16

由于flag[:5]=b'flag{'已知,只需爆破flag[5]一个字符即可恢复完整key。验证方法是检查解密后最后一块是否为\x10*16。

利用CBC模式特性,后续块使用前一块密文作为IV解密,可恢复完整flag。

答案:flag{IADMIN-TOP-18880101-7634567_2025}

第八题

题目提供损坏的RSA私钥key_pri.pem和加密用户数据encrypted_users.csv。解析私钥DER编码发现大量参数被零填充,属于"变异RSA"私钥恢

复问题。

私钥ASN.1结构解析:

从dp字段提取p的部分高位(496位已知,低48位为0):

p_high =

0x9d025160d56d4971363f3cf2ce7e3e96215c50bf50d0cc606f5645de7ec113d16d931383e649bc2c7328499d219e2982b726ae41c5370

aa8000000000000

使用Coppersmith小根攻击恢复p的完整值。设p = p_high + x + y*2^496,其中x为低位未知部分(约48位),y为高位修正(约16位)。构

造格基,利用LLL算法求解满足p | n的小根。

cuso库求解代码:

恢复完整p =

0xf5e49d025160d56d4971363f3cf2ce7e3e96215c50bf50d0cc606f5645de7ec113d16d931383e649bc2c7328499d219e2982b726ae41c

5370aab851b8a28df37

验证:n mod p = 0,p为512位素数。计算q = n/p,d = e^(-1) mod (p-1)(q-1),构建RSA私钥,使用PKCS1_OAEP解密查找目标记录。

答案:294_010880753296303612_5108757973927325

第九题



答案:S20251001

第十题

题目提供了三个文件:secret_image.png(隐写图片)、multimodal_model.pth(PyTorch模型权重)和stego_hint.txt(提示文件)。

根据提示文件,隐写规则如下:

1图片的R通道中隐藏了模型输入特征

2取图片左上角前20个像素的R值,计算 R值 mod 10 得到20维特征向量

3将20维特征输入MLP模型,输出数值四舍五入取整即为flag的ASCII码

4ASCII码转换为字符得到完整flag

关键点在于"左上角前20个像素"的取法:按扫描顺序取第一列从上到下的20个像素(x=0, y=0..19)。

模型结构为3层全连接神经网络(MLP):20->64->32->27,使用ReLU激活函数。输出27维向量对应flag的27个字符。

答案:flag{A12I_shu1xin2bei_2025}

数据分析

数据应急

题目背景: 一家科技公司服务器被黑客入侵,重要文件被窃取并删除。需要根据系统自动备份的残存内容进行溯源分析。

第一题



三个文件全部导出



答案:HT-2025-001234

第二题

解压压缩包,得到一个内存镜像

非预期

直接搜索flag{



预期解



发现有C:\Program Files\TrueCrypt\TrueCrypt.exe

Elcomsoft Forensic Disk Decryptor挂载

加载内存镜像先搜索一下key

保存1.evk



成功挂载



答案:flag{33c3789a36bb61beb6d4268cd7d13038}

第三题

过滤响应200的包



最后一个包发现是exe程序



导出来看看

解包

找到一个exfiltrator_balanced.pyc

反编译

该程序是一个基于 ICMP 协议的隐蔽数据外带工具,通过将文件切分为 224 字节的数据块并伪装成 Windows Ping 流量发送。其核心安全机

制包含三个部分:
程序运行时会生成一个随机的 16 字节 CryptoSeed 和一个基于时间的 ScrambleSeed(用于乱序)。利用 PBKDF2-HMAC-SHA256 算

法,结合 CryptoSeed 和两组被混淆和硬编码的盐值(b'Bloodharbor!2024'b'Silent_Update!!!'),迭代 10,000 次分别派生出两

层加密所需的 32 字节密钥。
每个数据块首先添加 4 字节大端序长度头,然后使用 ChaCha20-Poly1305 进行内层加密(Layer 1),输出包含 Nonce、密文和 Tag。接着

对 Layer 1 的完整结果使用 AES-256-GCM 进行外层加密(Layer 2),同样输出 Nonce、密文和 Tag,确保了数据的机密性与完整性。
程序首先发送包含种子的元数据块(以 EX1L 开头)。为了对抗流量分析,它利用 ScrambleSeed 初始化随机数生成器,对所有数据块的发

送顺序进行全随机打乱(Shuffle)。发送时,每个 ICMP 包的 Payload 前部填充 16 字节的伪造 Windows Ping 数据,并使用复杂的线性同

余算法生成伪随机的 ICMP ID 和序列号,使得流量在外观和统计特征上极难被识别。



打开流量包,发现流量包含有大量 ICMP 请求,其中部包含 EX1L 标志的 Payload,确认为数据外带。提取 EX1L 元数据块,获取 Crypto

Seed 和 Scramble Seed。加密机制为双层加密:首先是 ChaCha20-Poly1305 (Layer 1,带 4 字节长度头),其次是 AES-GCM (Layer 2)。密

钥由 PBKDF2 基于 Crypto Seed 和硬编码盐值生成。数据块顺序经过混淆,需利用 Scramble Seed 初始化随机数生成器并还原顺序。编写脚

本提取 ICMP Payload,还原顺序并依次解密 Layer 2 和 Layer 1,拼接后得到一个 ZIP 文件。

解压得到100张图片



写一个脚本OCR识别18316978925

[+] 找到目标: person_086.png



答案:江苏省南京市鼓楼区西湖路200号梧桐里15栋4单元101室

数据分析

背景描述

随着维真科技(VerityTech)业务规模的不断扩张,公司积累了大量内部 PDF 文档,包括重要的研发资料、业务报告、内部制度说明等。在长期

的运作过程中,由于文档管理规范不完善、缺乏统一的安全策略,公司文档的安全风险逐渐显现。

近期,公司文档服务器遭遇未知勒索程序攻击。部分 PDF 文件被加密无法打开,系统中还出现可疑链接的文档,疑似为攻击入口。同时,安

全团队在受感染终端中提取到了一份可疑的可执行程序(exe 文件),推测为勒索程序主体。

为了定位安全漏洞、恢复文档数据、查明攻击来源,公司启动了"文档安全事件分析"专项工作。本题给出攻击样本、加密文档及疑似钓鱼

PDF 文档,请你协助安全团队进行取证分析、密钥恢复、数据解密以及钓鱼链接识别。

相关信息

公司合法域名为:

其余域名均视为可疑链接,需重点审查。

第一题

通过file命令识别en.exe为Windows PE可执行文件,使用strings发现Python相关字符串,判断为PyInstaller打包程序。使用pyinstxtractor.py

解包后,在en.exe_extracted/key/目录下发现RSA密钥对文件pr.pem和public_key.pem。读取pr.pem文件内容,定位-----BEGIN PRIVATE

KEY-----标记位置,提取其后的32位字符即为答案。

答案:MIIEvgIBADANBgkqhkiG9w0BAQEFAASC

第二题

反编译

分析解包后的pyc文件,发现加密流程采用混合加密机制:使用RSA-OAEP(SHA256)加密AES密钥并保存到store.key,使用AES-256-ECB模

式对PDF文件进行加密。解密流程为:首先使用提取的RSA私钥pr.pem通过PKCS1_OAEP(SHA256)解密store.key获取AES密钥,然后使用

AES-ECB模式解密PDF文件并去除PKCS7填充,最后计算解密后文件的MD5值。

答案:52fd2cb4fc43eceb3c79233038bb5f42

第三题

使用PyMuPDF遍历999份解密后的PDF,提取PDF Annotation超链接中的URI。合法域名为veritytech.com及其子域名*.veritytech.com,排

除.local和.internal等内部域名后,筛选出所有指向外部非法域名的钓鱼URL。同时检查URL参数中的跳转地址(redirect/next/url等参数)。

过滤掉包含非ASCII字符的无效URL,将所有钓鱼URL按字典序升序排序后用逗号拼接,计算MD5值。

答案:0a16f1ca5e8db1270074d0d39f6edeaf

数据审计

背景描述

某公司运维团队在日常安全巡检过程中发现系统存在异常访问和潜在入侵迹象。经初步技术研判,问题可能与公司用于关键服务器相关。该

服务器被确认存在一定安全风险,但目前尚无法确定攻击者是否已成功获取其中的证书信息。

为进一步排查与分析潜在的数据泄漏情况,运维团队已导出该服务器的所有网络流量文件,请根据流量包文件分析并回答以下问题。

第一题

题目提供了params.csv文件,包含500组RSA参数(id, e, p, q)。需要根据id=285的参数合成RSA私钥,然后遍历所有pcap文件,提取TLS证

书中的公钥模数n,与id=285计算得到的n(n = p * q)进行匹配,找到对应的流量包。具体步骤:首先读取params.csv获取id=285的e、p、

q参数,计算n = p * q;然后遍历pcap文件,解析其中的X.509证书,提取RSA公钥的模数n;最后比对两个n值,相等则说明该pcap使用了

id=285对应的证书。

答案:mAqY0WRHsV.pcap

第二题

需要使用params.csv中的RSA参数生成私钥,然后用私钥解密TLS加密的流量包,获取HTTP明文数据。具体步骤:首先根据e、p、q计算私

钥参数d = e^(-1) mod (p-1)(q-1),生成PEM格式私钥文件;然后遍历每个pcap文件,提取证书中的公钥模数n,匹配对应的私钥;使用

tshark配合私钥解密TLS流量,提取HTTP请求体;解密后的数据为POST请求到/api/v1/user/profile,请求体为hex编码的JSON,包含

username和phone字段;遍历所有解密结果,查找username为"王梅"的记录,获取其phone字段。

答案:13930079365

第三题

系统在请求包中设置了Authorization头部字段,使用JWT进行身份认证。JWT的payload中包含username和phone信息,而请求体中也包含

相同字段。越权访问的判断标准是:JWT中的用户信息与请求体中的用户信息不一致。具体步骤:解密所有流量包获取HTTP明文;提取

Authorization头部中的JWT token;JWT由三部分组成(header.payload.signature),对payload部分进行Base64URL解码获取JSON数

据;同时解析请求体中的hex编码JSON数据;比较JWT payload中的username和phone与请求体中的username和phone;若不一致则判定为

越权访问,统计越权账号总数。

答案:5

书接上回:【Github 开源】Obsidian 插件:obsidian-github-stars-manager
小工具,加了一些小更新,不多, GitHub: 代码仓库

本来想上架官方仓库之后再发的,目前看来遥遥无期,想问点问题,熟悉 Obsidian 插件开发、上架的大佬来解惑一下

1、Obsidian 插件上架周期大概多久,PR 一直处于原地打转的状态
2、有没有什么检验代码规范的插件或者其他工具,每次 PR 都要等待,然后解决 bot 提的不规范代码,目前用的 eslint-plugin-obsidianmd(Claude 给的建议)
3、当前使用 json 存储数据,但是有同学反馈 star 数超过 600 会有卡顿现象,有没有必要换 SQLite 或者 LokiJS(AI 给的建议)

接下来准备做的:

添加标签颜色,同步选择显示颜色
标签信息可修改
删除主题切换功能,鸡肋
优化性能

看看收藏的 L 站大佬们的项目

其他

  1. 随缘更新:能用就行原则
  2. 风格参考:站内看到的各种 github stars 管理项目

感谢站内公益站点!

Anyrouter、Wong、随时跑路、Cubence、Duckcoding、我爱 996

依然暂时提供插件压缩包

github-stars-manager.zip


📌 转载信息
原作者:
sparks
转载时间:
2025/12/30 10:19:06