尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

local-deep-research 1.10.3 深度解读:搜索时间范围默认值变更与多租户安全加固

local-deep-research 1.10.3 深度解读:搜索时间范围默认值变更与多租户安全加固 local-deep-research 1.10.3 深度解读搜索时间范围默认值变更与多租户安全加固【免费下载链接】local-deep-research~95% on SimpleQA (e.g. Qwen3.6-27B on a 3090). Supports all local and cloud LLMs (llama.cpp, Ollama, Google, ...). 10 search engines - arXiv, PubMed, your private documents. Everything Local Encrypted.项目地址: https://gitcode.com/GitHub_Trending/lo/local-deep-researchlocal-deep-research 1.10.3 是一次以行为变更 安全加固为主线的重要发布它把全局搜索时间范围search.time_period的默认值从过去一年改为全部时间并对数据库完成 0030 迁移同时在 WebSocket 会话生命周期、SSRF 防护、出站请求 IP 固定pinning、研究库 PDF 存储的多租户隔离等方向做了大量纵深加固。本文以 发布说明 为主体结合仓库中的迁移脚本、安全环境配置与测试用例逐项展开帮助你理解每项变更的实际影响、升级时必须执行的运维动作以及各项防护在源码层面的落点。读完本文后你将掌握升级 1.10.3 前必须知道的行为变更与数据迁移细节六个新增/变更的运维级环境变量及其适用场景SSRF 与会话加固在src/local_deep_research/security/与src/local_deep_research/settings/env_definitions/security.py中的实现位置以及研究库 PDF 从共享目录切换到按用户隔离目录后的兼容性开关组合。一、破坏性变更search.time_period默认值改为全部时间1.1 变更内容与动机从 1.10.3 起search.time_period的默认值由 Past yeary改为 All timeall。默认搜索不再被静默限制在最近一年之内。动机在迁移脚本的注释中写得很清楚Tavily 引擎从 1.10.3 起真正尊重该设置转发为 Tavily API 的time_range参数而此前serpapi、wikinews等已接线的引擎也一直被同一个默认值驱动——一个几乎所有人都没有主动选择、却悄悄过滤掉更久远往往更权威来源的默认值被判定为一个糟糕的默认因此整体翻转为不做时间过滤见 0030 迁移脚本 的背景说明。1.2 数据迁移 0030 的精确行为迁移 0030_default_time_period_all.py 执行一条针对settings表的更新只更新key search.time_period且存储值恰为yJSON 序列化后带引号的 3 字符字面量y因为该列是 SQLAlchemyJSON类型的行将其改写为all显式选择过dPast 24 hours/wweek/mmonth/all的用户不受影响主动选择过 Past year 的用户其偏好会被一并翻转——因为主动选择与继承默认值在数据上无法区分如仍需年度范围的结果升级后在 Settings 中重新选择Past year即可该迁移提供downgrade()把当前值为all的行回退为y无法区分迁移行与原本就是all的行因此保守地一并回退。1.3 设置的全局生效路径与优先级发布说明明确该全局设置覆盖了所有搜索路径并且优先级高于各引擎自身的默认参数生效引擎Tavily、serpapi、Wikinews生效路径所有基于get_search()的流程包括新闻订阅以及直接调用create_search_engine()的调用方——包括默认的langgraph-agent策略和 MCP server优先级当全局设置存在时search.engine.web.engine.default_params.time_period这类按引擎的覆盖项不生效仅在程序化快照等全局设置缺席的罕见场景下应用例外Brave 不受该全局设置覆盖仍由自己的按引擎设置控制。源码佐证Tavily 引擎 头部注释说明其把LDR的时间范围代码映射为 Tavily API 的time_rangeday/week/month/year未知取值则省略该参数、不做过滤默认设置定义见 default_settings.jsonsearch.time_period及各引擎的default_params.time_period键。Wikinews 的配套变更其内置默认时间范围从隐式的一年窗口改为 All time且遇到无法识别的取值时不再静默回退到一年而是不施加任何过滤——因此除非显式选择更窄的时间范围更久远的文章可能出现在结果中。二、会话与 WebSocket 生命周期加固2.1 登出立即吊销会话 Cookie登出操作现在会立即吊销会话 Cookie。HTTP 与 WebSocket 两条认证路径都会校验 Cookie 对应的服务端会话 ID因此已登出的会话无法再被复用——即使同一用户重新登录也无效闲置/过期会话同样被拒绝滑动过期语义。这是后续多项加固如后台日志持久化改造能够成立的前提。2.2 WebSocket 连接按会话拆除此前活跃的 WebSocket 连接只在握手时校验一次会话现在只要背后的会话终结——登出、修改密码、会话过期、闲置连接被回收——对应连接就会被拆除。效果一个 Socket 不再能在其会话消亡后继续接收你的事件包括携带密钥值的settings_changed事件拆除是按会话粒度scoped per session的在某个标签页登出不会断开其他标签页或设备上的连接每次 connect/subscribe/unsubscribe 都会对仍然有效的会话重新校验作为纵深防御特别地过期或被抓取的 Cookie 无法再打开一个全新 Socket 加入你的事件房间——即便你还有另一个会话或一次正在运行的研究任务保持着数据库连接。对应的回归测试位于 test_socket_teardown_severs.py 等tests/security/用例中。2.3 登出与数据库连接的新语义1.10.3 还改变了登出时数据库连接何时关闭的行为以配合上述会话吊销后台日志持久化不再能重新打开用户的加密数据库、也不会在登出后恢复其连接状态排队的日志条目不再携带用户密码日志队列的 drain 线程只在用户数据库已经打开时写入登出后积压的条目直接丢弃且每轮迭代都会清空缓存凭据登出不再在研究任务仍在运行时关闭用户数据库——以前中途关闭会导致该任务日志被 drain 线程静默丢弃。现在连接会保持到本次运行结束、再额外保留一轮空闲连接清扫数分钟is_user_connected也在同一时点停止把该账号报告为可达上述做法依赖请求/Socket 认证路径上的服务端会话 ID 吊销上游 #5532因此该变更必须与之配套发布修改密码不再暂停其他用户的进行中研究数据库重加密现在按用户门控而非进程级门控只有你自己的新研究在重加密期间被短暂挂起队列处理器在重新打开你的加密数据库之前还会立即复查你的会话使得恰在该瞬间发生的登出无法再把已解密的数据库带回或恢复排队的研究。三、SSRF 防护体系化加固1.10.3 是 SSRF 防护集中收口的一个版本覆盖了静态抓取、JS 渲染抓取、用户可编辑的引擎 URL、出站 HTTP 客户端与通知 Webhook 五条路径。3.1 静态出站请求IP 固定pinning通过safe_get/safe_post/SafeSession发出的出站 HTTP 请求RAG 来源抓取与网页抓取此前存在 TOCTOU 窗口SSRF 守卫校验的是一个解析出的 IP但 HTTP 客户端在真正建连时会独立重新解析域名。现在连接固定到守卫校验过的那个精确 IP并在每一次重定向前重新检查原始主机名仅保留用于 TLS SNI 与证书校验。相关实现与测试见 src/local_deep_research/security/egress/ 与 test_ssrf_dns_pinning.py、test_safe_requests_redirects.py。3.2 无头浏览器路径与静态路径同一套 SSRF 规则使用 JS 渲染的抓取路径Crawl4AI 与原生 Playwright 两个引擎此前是防护盲区。现在无头浏览器下载器发出的每一个子请求——初始导航、每一跳重定向、每个子资源——都会对照与静态抓取路径相同的 SSRF 规则做校验或拦截公开页面把浏览器重定向到云元数据端点或私网/内网主机的行为会在浏览器建连之前被拦截。同路径上的多个旁路一并关闭robots.txt 改为经受 SSRF 保护的会话抓取而不是未经检查的客户端阻止 Service Worker拒绝 WebSocket 连接云元数据 IP 在任何情况下保持拦截PRIVATE_ONLY出站范围仍可达本地实验主机重定向链中设置的 Cookie 现在按跳per hop从浏览器 Cookie 罐重新限定作用域属于某一域的 Cookie 不会再被转发到后续重定向落到不同域的情况与正常浏览器行为一致同域 Cookie 持久化行为不变服务端在链中途清掉的 CookieMax-Age0/ 过期Expires也不会被复活。3.3 用户可编辑的搜索引擎实例 URL 防 SSRF公开搜索引擎实例 URL例如 SearXNG 的instance_url指向私有/回环/链路本地地址时现在在保存时即被拒绝并且默认情况下运行时也不再抓取此类实例。是否允许引擎触达私有实例是纯运维决定刻意不由用户可编辑的policy.egress_scope设置授予。在 localhost/LAN 自托管 SearXNG 的运维可以设置LDR_SEARCH_ALLOW_PRIVATE_ENGINE_URLStrue恢复放行Docker 部署若通过环境变量锁定 URL 则不受影响云元数据端点无论如何保持拦截。更细粒度的替代方案是LDR_SEARCH_PRIVATE_ENGINE_URL_ALLOWLIST见 security.py逗号分隔的精确 URL 源schemehostport默认端口隐含、主机不区分大小写、忽略路径/查询、不支持通配符与 CIDR只有当引擎配置的 URL 命中列表时该引擎的请求链含重定向才以私有访问权限运行。升级注意原文档重点强调SearXNG 的默认实例http://localhost:8080是回环地址本变更之后未显式放行即被拒绝。如果你自托管的 SearXNG 升级后停止返回结果请设置LDR_SEARCH_ALLOW_PRIVATE_ENGINE_URLStrue或改用环境变量锁定 URL引擎因该原因自我禁用时会输出一条点名该开关的警告日志。对应测试test_searxng_private_url_warning.py、test_guarded_engine_url_contract.py、test_egress_settings_save_validators.py。3.4 通知 WebhookApprise发送时 DNS 重绑定防护通知服务 URL 此前只在配置时校验一次而 Apprise 在实际发送时会重新解析域名并跟随重定向——一个重绑定主机可以给校验器一个公网地址、给发送方一个私有/云元数据地址。1.10.3 的处置是发送改为同步、线程内执行并禁用 HTTP 重定向跟随直接封死重定向到内网/外泄即使用户自带?redirectyes也无效每次发送期间把所有 raw-webhook 主机固定到刚校验过的地址上任何未固定且解析到私有/回环/链路本地/云元数据 IP 的查找都在 Socket 层、建连之前被拒绝发送时 DNS 解析带超时边界缓慢或恶意的解析器无法挂起发送线程若固定 shim 不是活动解析器、或投递会扇出到线程本地守卫覆盖不到的工作线程则发送 fail closed各 scheme 策略与校验器一致http/https 未放行则拦私有插件/自托管 scheme 允许 LAN 目标但始终拦截云元数据原始主机名保留用于 TLS SNI 与证书校验固定/拦截为线程本地不影响并发请求LDR_NOTIFICATIONS_ALLOW_OUTBOUND总开关见 security.py默认关闭作为纵深防御保留。后续两轮评审又关闭了具体缺口发布说明原文逐项列出值得运维重点阅读AWS 原生 IPv6 实例元数据端点fd00:ec2::254一个 ULA不在 IPv4 元数据列表与 NAT64 内嵌 IPv4 检查的覆盖范围内现在无条件拦截包括在私有 IP 放行开启时通知服务 URL 的 authority 中出现多于一个的在提取主机之前即被拒绝校验器/固定解析器与 Apprise 自带的解析器对这类 authority 会取出不同主机已确认的发送时 SSRF 拦截被识别为单次尝试立即失败不再进入重试有边界的发送时 DNS 查找运行在 daemon 线程上挂死的恶意解析器不会阻塞进程优雅退出通知插件/raw-webhook 分区在私有 IP 放行开启时也拦截整个链路本地段IPv4169.254.0.0/16、IPv6fe80::/10——云厂商元数据服务经由链路本地提供例如 Scaleway 的169.254.42.42而自托管的 RFC1918/回环/非链路本地 ULA 通知端点不受影响空//authority 但路径中含主机例如json:///169.254.169.254/path校验器解析器看不到主机、而 Apprise 却会拨打路径段的 URL在主机提取之前即被拒绝。四、多租户与本地资源边界加固4.1 嵌入模型设置限定在模型目录内Sentence Transformers 嵌入模型设置local_search_embedding_model此前允许任何已认证用户填入任意绝对路径可被用作文件系统存在性/结构探测并加载任意本地模型。现在只有能解析到应用模型目录之下的值才被视为本地模型其余一律按 HuggingFace 模型 ID 处理试图逃逸模型目录的路径直接拒绝。4.2 多租户纵深防御的三处收口研究库级联删除辅助函数拒绝符号链接/越出根目录的删除按用户哈希的咽喉点对空用户名fail closed按用户的研究并发上限与服务器总上限联动校正——覆盖聊天发起的研究启动send_message与retry_attempt而不只是主研究路由与队列处理器。发布说明特别注明该上限修正的是对全局上限的记账不是按用户公平性——单个用户仍可合法占满全局上限反垄断调度是后续工作。4.3 程序化注册对象按用户作用域通过编程方式注册的搜索 retriever 与自定义 LLM 现在归属注册者本人内置 provider 与引擎仍全局共享但一个用户的注册不能再遮蔽另一个用户的 provider/引擎解析、也不会出现在另一个用户的引擎列表中。同时运行所属用户被穿入所有过去只依赖设置快照的 LLM 解析缝seam。当用户的主要搜索来源是自己的私有本地专用retriever 时本地专用推理策略现在会强制作用于研究运行的模型/provider 覆盖路径、领域分类、以及新闻调度器在运行后的标题/话题生成——关闭了这些调用回落到云端 LLM 处理私有语料运行的通道。安全网当 ADAPTIVE 出站策略无法在任何可见命名空间中归类某次运行的主要引擎时仍解析到宽松可云端范围但现在会输出一条点名主要引擎、并报告是否穿入了用户名的策略审计警告——未来若再漏穿用户名会在日志中显形而不是静默放行。SDK/编程调用注意行为变更register/register_multiple注册None的 retriever 或 LLM 现在抛出ValueError不再静默存储register_multiple是原子的——批次中只要含任一None整批都不注册。4.4 研究库 PDF 存储明文模式收口为运维开关 按用户目录隔离这是发布说明中最长的一段涉及三个相互关联的变更(a) 文件系统明文存储改为纯环境门控。未加密的filesystemPDF 存储模式现在只能通过运维环境变量LDR_RESEARCH_LIBRARY_ALLOW_FILESYSTEM_PDF_STORAGE开启且默认关闭定义见 security.py。此前任何用户都可选择该模式把抓取的第三方 PDF 以明文写入共享库目录。门关闭时设置 UI 隐藏该选项任何已存储或环境值中的filesystem在写 PDF 前被强制改写为加密的database模式一个迁移把既有的filesystem选择重写为database此前写出的明文文件保持可读。默认的database加密与none仅文本模式不变。(b) PDF 改为按用户子目录存储#5521。研究库下载的 PDF 现在落在library/username/下而不是单一共享目录。此前两个用户的资源 ID按用户自增可以在共享目录中撞名导致一个用户的 PDF 覆盖或暴露另一个用户的文件。兼容与迁移策略读取可以回退到旧共享位置因此升级前下载的 PDF 仍能加载不移动任何文件——但该回退现在由运维门控、默认关闭见 (c)共享库模式research_library.shared_library现在要求运维显式开启LDR_RESEARCH_LIBRARY_ALLOW_SHARED_LIBRARY因为shared_library与storage_path都是用户可编辑的若继续尊重用户侧的shared_librarytrue租户可以拆掉按用户边界、把存储指到另一个用户的目录。默认忽略该用户设置。升级注意原文档明确给出既有的共享库部署必须设置LDR_RESEARCH_LIBRARY_ALLOW_SHARED_LIBRARYtrue才能继续共享单一目录否则新下载进入按用户子目录而此前下载的共享 PDF 将停止解析——除非运维同时开启旧版读取回退LDR_RESEARCH_LIBRARY_ALLOW_LEGACY_READ_FALLBACKtrue。(c) 旧共享根回退的只读化与门控。旧共享根的回退现在只读文档删除只在删除者自己的按用户目录内解析绝不沿回退进入共享根——否则一次普通的自助删除如相对路径pdfs/5.pdf可能解析到另一租户的文件并将其 unlink。共享根中的文件保持不被删除。旧共享根的读回退则由LDR_RESEARCH_LIBRARY_ALLOW_LEGACY_READ_FALLBACK门控、默认关闭封住了一个跨租户读取通道回退基址源自用户可编辑的research_library.storage_path攻击者可以把自己的storage_path指到他人目录利用按用户自增资源 ID 天然撞号让自己文档 ID 的读取解析到别人的 PDF。门关闭时库 PDF 读取严格限制在请求者自己的按用户根内需要旧文件继续加载的运维可在单用户或互信部署中放行。相关实现与测试见 pdf_storage_manager.py对空用户名 fail closed 的注释在删除路径上、test_pdf_storage_gate.py 与 test_per_user_library_root.py。五、Bug 修复5.1 OpenAlex 期刊质量数据下载内存问题#4383OpenAlex 快照分区的解码改为逐条记录进行期刊质量下载不再把整个分区驻留内存——修复小主机上内存耗尽、容器陷入 swap 颠簸的问题。5.2 Tavily 时间范围真正生效#4936Tavily 引擎现在尊重配置的时间范围在 Settings → Search 中选择 Past 24 hours / week / month / year 时该值作为time_range转发给 Tavily API选择确实收窄结果而不是被静默忽略。默认 All time不过滤。与第一章一致该设置现在覆盖所有搜索路径包括此前绕过它的默认langgraph-agent策略与 MCP server。5.3 SearXNG 限流改为按实例 URL 进程级共享#5351SearXNG 引擎的请求间隔delay_between_requests现在按实例 URL 在进程内共享研究 agent 工具调用过程中构造的每个按调用实例都能命中同一节流状态。源码中由 search_engine_searxng.py 在初始化时调用respect_rate_limit(self.instance_url, self.delay_between_requests)登记共享限流器。5.4 列表型 LLM 内容块.content为块列表的系统性兼容对返回.content为块列表的 providerAnthropic 扩展思考或工具调用场景1.10.3 修复了多处长时间未处理的AttributeError/TypeError并统一剥离开始思考推理标签与同文件内兄弟调用的既有处理对齐问题生成家族与证据评估器后续问题生成、子问题分解、原子事实分解、补差问题、BrowseComp 实体抽取与渐进式搜索、证据提取——由于StandardQuestionGenerator是默认生成器此前这些故障会在主研究循环的每一轮迭代上触发新闻分析、GitHub 查询优化与话题组织此前话题文本合成抛TypeError、GitHub 搜索查询变成块列表的 repr、新闻摘要返回空高级搜索约束解析、fallback 期刊声誉分数解析两处同类修复。5.5 其他修复连接态测试后泄露的 active-research 状态可被检测#5466显式 OpenAI endpoint URL 的 provider 特定校验边界加锁#5488Wiki 链接自动补全在查询变化时立即使过期请求与结果失效以不同 chunk 数重新索引文档时聚合 RAG chunk 计数保持准确防止旧 Unified Search 响应在查询变化后渲染过期的可点击结果防止过期的文档/研究笔记面板请求覆盖更新的刷新结果LangGraph 子主题溢出改为有界排队而非丢弃并在开始前拒绝超大批次进度元数据以overflow_strategyqueued与overflow_queued_count报告排队溢出省略truncated_from因为没有话题被截断非字符串的 collection 名称/描述返回 400而非 500Unified Search 语义结果在舍入响应值之前用完整相似度精度排序。六、运维升级清单把分散在发布说明中的运维动作汇总如下全部环境变量均为环境级env-only设置无法通过用户可写的设置 API 修改定义集中在 security.py场景必做动作默认行为自托管 SearXNG 在 localhost/LAN设置LDR_SEARCH_ALLOW_PRIVATE_ENGINE_URLStrue或改用LDR_SEARCH_PRIVATE_ENGINE_URL_ALLOWLIST精确放行或 Docker env 锁定instance_url回环/LAN 的instance_url保存即被拒、运行时不抓取需要时间过滤的默认搜索升级后在 Settings 重新选择Past year默认 All time无时间过滤既有共享库部署设置LDR_RESEARCH_LIBRARY_ALLOW_SHARED_LIBRARYtrue如需旧文件继续可读同时LDR_RESEARCH_LIBRARY_ALLOW_LEGACY_READ_FALLBACKtrue新下载进入按用户子目录旧共享 PDF 停止解析需要明文 PDF 存储谨慎LDR_RESEARCH_LIBRARY_ALLOW_FILESYSTEM_PDF_STORAGEtrue强制加密database模式UI 隐藏 filesystem 选项出站通知 Webhook维持LDR_NOTIFICATIONS_ALLOW_OUTBOUND默认关闭除非接受已披露的残余风险关闭单机/可信部署需读旧共享 PDFLDR_RESEARCH_LIBRARY_ALLOW_LEGACY_READ_FALLBACKtrue读取严格限制在本人按用户目录内此外有两类面向开发者的接口行为变化需要纳入代码评审register/register_multiple对None的ValueError与原子批次语义以及程序化注册对象按用户作用域后跨用户借用注册 provider/引擎的写法不再可行。七、结语1.10.3 的三条主线——全局时间范围默认值的纠正、SSRF 与会话生命周期的体系化加固、研究库 PDF 的按用户隔离——都指向同一件事把用户可写设置 × 网络出口 × 文件系统边界三个交叉面上的默认行为统一收敛到保守一侧并把放宽权限的决策权明确留给运维环境变量。对多用户部署而言这一版本升级后应逐项核对上表对单用户自托管者最主要的可见变化是默认搜索不再限定一年以及自托管 SearXNG 需要显式放行回环地址。相关文档可继续参考搜索引擎配置、SearXNG 部署、研究库与 RAG、通知机制 与仓库根目录的 SECURITY.md。【免费下载链接】local-deep-research~95% on SimpleQA (e.g. Qwen3.6-27B on a 3090). Supports all local and cloud LLMs (llama.cpp, Ollama, Google, ...). 10 search engines - arXiv, PubMed, your private documents. Everything Local Encrypted.项目地址: https://gitcode.com/GitHub_Trending/lo/local-deep-research创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表