AnnaSimferopol's Blog

Astro SSG

No Комментарии

 正在检索项目代码并形成审查结论...

基于对代码库的完整检索(Astro SSG 主题 fork,面向“Корпечь 纪念项目”),审查结论如下,按严重程度排序。

严重 (Critical)

  1. GitHub Token 明文暴露在 git 远程地址中

    • 定位:.git/config(remote URL)
    • 说明:push 地址中内嵌了 ghu_ 开头的完整 PAT(https://annachurasheva:ghu_...@github.com/annachurasheva/astro-blog)。任何拿到该工作区/仓库副本的人都能直接复用此凭据推送代码。
    • 建议:立即在 GitHub 吊销该 token,改用凭据管理器或环境变量注入,禁止在 URL 中带密钥。
  2. 站点访问数据被发送给第三方(主题作者)的 Umami 实例

    • 定位:src/config.ts:122(umamiAnalyticsID: 'dab0e4b9-...')、src/config.ts:176(customUmamiAnalyticsJS: 'https://views.radishzz.cc/script.js')
    • 说明:这是上游主题(作者 radishzz)自建 Umami 的地址与站点 ID。当前配置会把本站访客行为数据上报到与纪念项目无关的第三方,属隐私泄漏/模板残留。
    • 建议:换成自己的 Umami 实例与 ID;未部署前应清空这两项。
  3. 非文章页面 OG 图使用了写死的第三方 Apiflash access key,并指向错误站点

    • 定位:src/layouts/Head.astro:39-41
    • 说明:无 apiflashKey 且无 postSlug 时,回退逻辑把他人 API key 02a837b6... 与 https://retypeset.radishzz.cc/(主题作者演示站)拼进 og:image。后果:首页/关于/标签页的社交分享图是别的站点的截图;且该第三方密钥被明文输出到每个页面 HTML 源码。
    • 建议:删除回退密钥;配置自己的 apiflashKey 或改为自建 OG 图(项目已有 src/pages/og/[...image].ts,可扩展用于非文章页)。

高 (High)

  1. 远程图片域配置指向主题作者域名

    • 定位:src/config.ts:168(imageHostURL: 'image.radishzz.cc')、astro.config.ts:23-26
    • 说明:astro:assets 仅允许该第三方域名,LQIP/图片优化也会按该域名处理。若正式内容图片托管在别处,远程图片将被拒绝或产生错误请求。
    • 建议:改为项目实际图片域名,或移除并仅使用本地 src/content/posts/_images。
  2. site.url 仍是占位域名

    • 定位:src/config.ts:17(https://astro-blog.edgeone.dev)
    • 说明:canonical、sitemap、RSS/Atom、OG 均基于该值生成。正式上线前必须改为最终域名,否则所有绝对链接与 SEO 元数据指向错误地址。

中 (Medium)

  1. 评论配置自相矛盾:启用但参数为空

    • 定位:src/config.ts:81(enabled: true)与 :84-94(giscus repo/repoId/category 等全空);src/components/Comment/Index.astro:13-18
    • 说明:showGiscus 恒为 false,文章页实际无任何评论区,但 Layout.astro:33-35 仍按“有评论”预留底部间距(死配置)。
    • 建议:要么补齐 giscus 配置,要么 enabled: false。
  2. Giscus 主题 CSS 依赖上游 GitHub CDN

    • 定位:src/components/Comment/Giscus.astro:51-56
    • 说明:主题样式从 cdn.jsdelivr.net/gh/radishzzz/astro-theme-retypeset@master/... 加载(还锁定 @master),而项目自身 public/giscus/ 已有同名 CSS 却未使用。一旦上游仓库变动或 CDN 不可达,评论主题即失效。
    • 建议:改用本地 ${base}/giscus/theme-*.css。
  3. 模板作者品牌信息残留

    • 定位:src/config.ts:101(twitterID: '@radishzz_')、:106(google 站点验证串,疑似上游残留)
    • 说明:twitter:site 标签会标记为上游作者账号;google verification 若不属于本域反而是噪音/误归属。
    • 建议:核对后改为自己的账号或清空。
  4. 文章内容为空,站点当前近乎空白

    • 定位:src/content/posts/(仅 _images/ 演示图,无任何 .md/.mdx)
    • 说明:首页、标签页、RSS/Atom、/og/*.png 均基于 posts 生成,当前构建结果是空列表页、空 feed、OG 路由无页面。
    • 建议:确认是否为 WIP;上线前至少补充首页与首批文章,否则首页与订阅器均无内容可展示。

低 (Low) / 建议

  1. 俄语站点存在硬编码英文文案

    • 定位:src/components/PostDate.astro:73,79(“updated”、“min”)、src/pages/404.astro:10-17(“PAGE NOT FOUND”整段英文)
    • 说明:阅读时间、更新时间标签、404 页对俄语访客显示英文;与 ui.ts 的俄语 i18n 不一致。
    • 建议:将此类文案并入 i18n 字典(src/i18n/ui.ts)。
  2. Feed 内容渲染与页面不一致

    • 定位:src/utils/feed.ts:15,166
    • 说明:feed 用独立的裸 MarkdownIt 渲染 post.body,不经过站点的 remark/rehype 插件,代码高亮、mermaid/katex、自定义容器等在订阅器中都会丢失或变形。
    • 建议:接受降级并注明,或复用站内渲染管线生成 feed HTML。
  3. 标题锚点 aria-label 引号被双重转义

    • 定位:src/plugins/rehype-heading-anchor.mjs:20-21
    • 说明:先把 "/' 手动替换为 "/',序列化时又会再转义一次,导致含引号标题的无障碍标签显示为字面 "。
    • 建议:直接放入原始文本,由 hast 序列化统一转义。
  4. robots.txt 的 sitemap 地址未拼接 base

    • 定位:src/pages/robots.txt.ts:5-11
    • 说明:new URL('sitemap-index.xml', site) 忽略了 base;当前 base 为空不受影响,但一旦配置子路径部署即出错。
    • 建议:改为 new URL(${base}/sitemap-index.xml, site)。
  5. Footer RSS 链接在 dev/prod 行为不一致

    • 定位:src/components/Footer.astro:19-31
    • 说明:dev 下保留 localizedPath 的尾部斜杠(/atom.xml/),prod 下再裁掉;对 .ts 端点路由(非 HTML 页)尾斜杠可能产生 404。
    • 建议:统一按实际生成路由构造链接。
  6. memoize 缓存无上限

    • 定位:src/utils/cache.ts:10
    • 说明:Map 只增不删(失败才清理)。纯 SSG 影响有限,若未来引入 SSR/函数化会有内存膨胀风险。

总结:项目基于成熟的 Astro 主题二次开发,代码结构清晰、构建链完整,但当前处于明显的模板适配期——最需要优先处理的是三类问题:一是模板作者侧资产残留(Umami、Apiflash key、图片域名、twitter/验证信息),既造成隐私外泄也影响品牌与安全;二是仓库内明文 GitHub token 必须立即吊销;三是内容库为空、域名仍为占位,上线前需补齐正式内容并核对最终 site.url 与评论/统计配置。修复优先级建议为:1-5 → 6-8 → 其余。

Leave a Comment