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

资讯详情

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

深入 GifHub 源码:Chrome 扩展如何绕过 CSP 调用 Giphy API 搜索 GIF

深入 GifHub 源码:Chrome 扩展如何绕过 CSP 调用 Giphy API 搜索 GIF 深入 GifHub 源码Chrome 扩展如何绕过 CSP 调用 Giphy API 搜索 GIF【免费下载链接】GifHubQuickly insert GIFs in GitHub comments项目地址: https://gitcode.com/gh_mirrors/gi/GifHubGifHub 是一个能在 GitHub 评论中快速搜索并插入 GIF 的 Chrome 扩展很多开发者好奇它调用 Giphy API 搜索 GIF 时为什么要把网络请求绕到后台页面去执行答案就藏在CSP内容安全策略里。本文带你深入 GifHub 源码一步步拆解它绕过 CSP 完成一次 GIF 搜索的完整链路即使你不熟悉扩展开发也能看懂其中的设计巧思。GifHub 是什么GitHub 评论里的 GIF 搜索小助手GifHub 的核心功能一句话就能说清在 GitHub 的评论工具条上加一个按钮点击后弹出 GIF 搜索面板输入关键词即可从 Giphy 海量图库中挑选 GIF 并一键插入评论。正如上图所示评论输入框上方多了一个 Add a GIF 按钮配合 giphy-widget.html 中定义的弹出面板整个交互流畅自然。它依赖 Giphy 官方 API搜索、预览、插入一气呵成是典型的小而美开源项目非常适合作为 Chrome 扩展开发的学习范本。为什么要绕过 CSPGitHub 页面的安全围栏做过前端的人都知道CSP是网站用来限制页面里能加载什么、能请求什么的安全机制。GitHub 对自己的页面设置了严格的 CSP其中一个重要限制就是页面脚本不能随意向第三方域名发起网络请求。这就带来一个矛盾GifHub 的搜索逻辑运行在 GitHub 页面里但它要调用的却是api.giphy.com的接口。如果直接在页面脚本里fetchGiphy API会被 GitHub 的 CSP 直接拦截报错、失败、功能失效。所以绕过 CSP 就成了这个扩展必须解决的第一道关卡。核心思路把 Giphy API 请求交给后台页面GifHub 源码给出的答案非常经典内容脚本Content Script负责界面交互后台页面Background Page负责发请求。为什么后台页面能绕过 CSP因为后台页面是扩展自己的独立环境不受目标网页 CSP 的约束只受扩展自身权限控制。只要在 manifest.json 里声明访问 Giphy API 的权限permissions: [ https://api.giphy.com/v1/* ]后台脚本就能名正言顺地请求 Giphy。看 background.js 中的核心代码请求逻辑干净利落——拼 URL、fetch、解析结果把每张 GIF 的原始图、压缩图地址和名称提取出来返回const apiBase https://api.giphy.com/v1; function giphySearch(searchTerm) { const uri ${apiBase}/gifs/search?q${encodeURIComponent(searchTerm)}api_key${apiKey}; return fetch(uri).then(res res.json())... }这个页面受限、后台放行的思路是解决扩展中跨域/CSP 问题的最常用手段。一次搜索的完整旅程GifHub 的请求链路从用户敲下关键词到 GIF 出现在面板里GifHub 走了一条三跳的请求链路每一跳都有清晰的职责分工页面脚本发消息用户输入关键词后events.js 中的startSearch通过window.postMessage把搜索请求发给内容脚本内容脚本转交后台inject.js 收到消息后调用chrome.runtime.sendMessage把请求交给后台页面后台请求 Giphy 并回传background.js 用chrome.runtime.onMessage监听请求完成 Giphy API 调用后把结果原路返回——先postMessage给页面脚本再由 events.js 的listenForGiphyResponse通知 UI 渲染。这里还有一个很妙的细节inject.js 通过runFnInPage把一段检测函数注入页面上下文用 GitHub 自己的feature-detection模块判断当前页面是不是 GitHub——借对方的特征来识别对方既精准又省心。图片也要过 CSPMarkdown 预览的巧妙复用有意思的是GifHub 不仅要请求绕过 CSP连展示也要绕。Giphy 返回的图片直链如果直接塞进评论GitHub 同样会因 CSP 拦截或代理问题无法渲染。GifHub 的解法很聪明不直接贴图片而是把 Markdown 文本交给 GitHub 自己的预览接口去渲染。在 api.js 的bypassCSPForImages中扩展把alt格式的 Markdown 发给 GitHub 的预览 API再从返回的 HTML 里提取经过 GitHub 官方代理处理过的图片地址——相当于借 GitHub 的手把图片洗白成合规链接。完整逻辑在 index.js 中串联搜索结果先过bypassCSPForImages处理再交给 widget 更新图片列表用户点击后由 utils.js 的toMarkdownImage生成最终 Markdown插入到评论光标处。关键配置manifest.json 权限声明整套机制能跑通离不开 manifest.json 的三处关键配置permissions声明对https://api.giphy.com/v1/*的访问权限这是后台请求 Giphy 的通行证web_accessible_resources把bundle.js和extension.css设为页面可访问资源否则内容脚本注入的脚本和样式会被页面拦截content_scripts声明注入范围与时机document_idle确保页面加载完成后才注入按钮逻辑。这三个字段几乎是所有要往别人页面里塞东西的扩展的标配。小结从 GifHub 源码学到的三点回到标题的问题——GifHub 如何绕过 CSP 调用 Giphy API 搜索 GIF一句话总结内容脚本负责 UI后台页面负责请求GitHub 预览接口负责图片洗白。从中可以提炼出三个可复用的经验后台页面是绕过 CSP 的万能钥匙凡是页面里被 CSP 拦住的请求优先考虑迁到扩展后台执行消息通道要分层页面 → 内容脚本 → 后台的三级通信让每层职责单一、易于排查善用目标站点自己的接口像 GifHub 借用 GitHub 预览 API 处理图片那样很多拦路虎其实可以借力打力。如果你正准备开发自己的 Chrome 扩展或对 CSP 与跨域问题感兴趣这个项目无疑是极佳的入门教材。动手把它 clone 下来在 background.js 和 inject.js 之间打断点走一遍你会对扩展的消息机制有更直观的体会。【免费下载链接】GifHubQuickly insert GIFs in GitHub comments项目地址: https://gitcode.com/gh_mirrors/gi/GifHub创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表