请帮助我们保护使用课件伴读的人。安全问题包括但不限于 API Key 或源站凭据泄露、绕过 API 地址白名单、未经用户动作向外发送课件、扩大网站权限、跨站脚本执行,以及模型回答被当作代码执行。
- 先打开本仓库 GitHub 页面的 Security 选项卡。如果仓库启用了 Private vulnerability reporting,请使用其中的私密报告入口提交,不要创建公开 Issue。
- 如果页面没有私密报告入口,请先创建一个不包含漏洞细节的公开 Issue,只询问维护者可用的私密联系渠道。例如说明“有一个可能的安全问题,希望获得私密报告方式”,不要附带密钥、Cookie、完整利用代码或敏感课件。
- 在私密渠道中提供足够复现问题的信息:受影响的提交或版本、浏览器和操作系统、最小复现步骤、影响范围、必要的日志或请求样例,以及已经采取的临时缓解措施。所有日志都应先脱敏。
项目没有在文档中承诺固定响应时间、奖励或披露时间表。维护者确认收到后,会根据影响和可复现性评估处理方式;请不要在公开渠道提前发布未修复的细节。
如果 API Key、Cookie、访问令牌或学校账号已经出现在 Issue、PR、截图或日志中,请立即在对应服务商或学校系统中撤销、轮换或退出会话,再编辑或删除公开内容。删除页面不等于所有副本都已消失,也不要把原始秘密重新发给维护者以便“确认”。提供脱敏后的前后几位字符或占位符即可。
不要把真实密钥写入测试。测试可以使用固定的假值,例如 test-key,并通过断言确认请求结构,不要调用付费服务。
- 本地文件。 选择导入的 PDF 在扩展页面中由随包 PDF.js 解析。文件内容只有在你提交问题或快捷操作后,才会作为上下文进入 AI 请求;本地文件不会先上传到项目服务器。
- 源 PDF。 打开链接时,扩展会从你选定的 URL 获取 PDF,并使用
credentials: include以支持需要登录的站点。源站可能看到浏览器发送的 Cookie;请只打开你信任的链接。遇到需要额外权限的跨域链接,扩展在用户操作后请求该来源的主机权限。 - AI API。 API Key 只发送到设置中通过校验的官方 HTTPS 主机名,并作为
Authorization: Bearer请求头发送。请求明确使用credentials: omit且禁止重定向。服务商仍能看到请求内容并按其政策处理;不要向模型发送不该交给第三方的资料。 - 权限。
activeTab、scripting、contextMenus和storage用于当前页面候选 PDF 查找、右键菜单、配置和临时选区传递。HTTP/HTTPS 主机权限是可选权限,在你主动读取 PDF 源或保存 API 地址时按来源请求。权限范围或触发条件发生变化时,应同时更新隐私说明。 - 聊天和上下文。 当前聊天记录保存在阅读标签页内存中;刷新、清空聊天或载入另一份 PDF 时,代码会清除当前历史。浏览器进程、系统备份、开发者工具和 AI 服务商的保留行为不由扩展控制,因此不能把界面上的清空按钮当成所有环境中的安全擦除。
- 模型输出。 PDF 文字、历史消息和手动上下文会被作为资料传给模型,并在请求中要求模型忽略资料里的指令。提示注入和模型错误仍然可能发生;回答按纯文本显示,不执行生成的 HTML 或脚本,但用户仍应检查其内容后再复制到其他系统。
涉及网络或权限的改动,请确认:
- 没有把 API Key 放入 URL、查询参数、日志或仓库文件;
- 没有把任意用户可控 URL 变成 API 目标,也没有放宽 HTTPS、官方主机名和端口校验;
- 不会在打开文件、读取页面或展示候选项时静默调用 AI;
- 外部文字仍作为数据传入模型,角色过滤和长度上限仍然有效;
- 模型回答继续按文本插入页面,不经过
innerHTML或脚本执行路径; - 相关单元测试和构建检查已运行,并在 PR 中说明没有覆盖的真实站点或浏览器环境。