Files
cloud-chip.cn/docs/SECURITY_SEO_REMEDIATION.md
T
Lucanlee 76fd36c0a4 上线实测扫描:发现生产部署陈旧,63431dd 修复未生效
- 对 https://cloud-chip.cn 做 curl 实测(速度+SEO/GEO)
- 关键发现:线上 JSON-LD 仍为旧 Organization、无 hreflang、产品页双品牌、security.txt/llms.txt 404 → 63431dd 审计修复未上线
- 速度:TTFB 0.12-0.17s(好),但 no-store 无缓存 + 外部 cdn.tailwindcss.com 拖累
- SEO/GEO 评级:当前 C-,正确部署后可达 B
- 在 docs/SECURITY_SEO_REMEDIATION.md 新增「上线实测扫描」章节含服务器修复命令
- CHANGELOG 新增 [1.0.1] 版本记录
2026-08-08 23:51:35 +08:00

192 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 安全 / SEO / GEO 修复跟踪(SECURITY_SEO_AUDIT 落地记录)
> 配套审计报告:IMA 知识库「网站测试」→ `SECURITY_SEO_AUDIT.md`(扫描 2026-08-06,对象 https://cloud-chip.cn)。
> 本文件记录每一项审计发现的处理状态、具体改动与验证方式,**供未来接手的不同开发者直接使用**。
> 版本日志见根目录 `CHANGELOG.md`。
图例:**✅ 已落地(代码)** · **✔ 已核验(无需改)** · **⏳ 待人工(后台/数据)** · **🚫 工具限制** · **🔧 需云端/架构**
---
## 状态总表
| ID | 优先级 | 发现 | 状态 | 处理 / 改动位置 |
|---|---|---|---|---|
| SEC-01 | P0 | CSP 含 `unsafe-inline` | 🔧 需架构 | 兼容 Tailwind Play CDN;须先完成 REL-03(构建 Tailwind + nonce)再移除,属重构,未动 |
| SEC-02 | P1 | 无 security.txt | ✅ 已落地 | 新增 `public/.well-known/security.txt`(白帽报送入口) |
| SEC-03 | P1 | 依赖 CVE 未知 | 🚫 工具限制 | 本机 composer 不支持 `audit` 命令;需升级 composer 或在 CI 跑 `composer audit` / `composer outdated` |
| SEC-04 | P1 | 生产 APP_DEBUG 未核实 | ✔ 已核验 | 本地 `.env``APP_DEBUG=false` / `APP_ENV=production` / `SESSION_SECURE_COOKIE=true`;需确认生产 `.env` 一致 |
| SEC-05 | P2 | 上传未做魔数校验 | ⏳ 待人工 | 现有 `image` + `mimes:jpg,jpeg,png,gif,webp` + `max:5120` 已具备;魔数校验可后续加 `Intervention` / `finfo` |
| SEC-06 | P2 | UGC 净化一致性 | ✔ 已具备 | `config/purifier.php` 双档(default / article);论坛/页脚走 `Purifier::clean($html,'article')` |
| REL-01 | P0 | 单源站无 CDN/WAF | 🔧 需云端 | 接入阿里云 CDN/Cloudflare;静态走 CDN、动态回源(运维操作) |
| REL-02 | P0 | 公开页 `no-store` | 🔧 需架构 | 当前全局 `no-store` 为避免 CSRF 419(每页含表单 token);建议经 CDN 边缘缓存(忽略 query + ESI)实现,未盲目放开 |
| REL-03 | P1 | 强依赖外部 Tailwind CDN | 🔧 需架构 | 改为构建期编译 Tailwind → `public/css/app.css`;同时解决 SEC-01;属重构,单独排期 |
| REL-04 | P1 | 500 页是否暴露堆栈 | ✔ 已核验 | `APP_DEBUG=false` 即不泄露;可补 `resources/views/errors/500.blade.php`(可选) |
| REL-05 | P2 | OpCache / 整页缓存 | 🔧 需云端 | 开 PHP OpCache;首页/栏目页短时长整页缓存(Redis/文件),运维+代码配合 |
| REL-06 | P2 | 大图未压缩/WebP | ⏳ 待人工 | 图片转 WebP、启用 gzip/brotli(运维+上传流程) |
| PHY-01 | P0 | 无边缘 DDoS/WAF | 🔧 需云端 | 上阿里云 DDoS 防护 + WAF(运维操作) |
| PHY-02 | P0 | 单 ECS 单点 | 🔧 需云端 | 定期快照 + 多实例 + SLB;数据库独立 RDS 并自动备份(运维操作) |
| PHY-03 | P1 | 备份未验证 | 🔧 需云端 | ECS 快照 + 库异地备份 + 恢复演练,保留 ≥30 天,记 RPO/RTO(运维操作) |
| PHY-04 | P2 | 无健康探活 | 🔧 需云端 | 云监控 + supervisor 守护 + 异常自动重启(运维操作) |
| SEO-01 | P0 | 首页 3 个 `<h1>` | ✔ 已核验(代码) | 全站区块已用 `<h2>`;首页 `<h1>` 来自 Hero 轮播富文本(DB),多屏则多 `<h1>`,属后台编辑规范(见下) |
| SEO-02 | P0 | 产品页标题品牌重复 | ✅ 已落地 | `app/Models/Product.php::seoTitle()` 去掉品牌后缀,视图统一 ` - $siteName` |
| SEO-03 | P0 | 品牌命名三处不一致 | ⏳ 待人工(后台) | 代码默认 `site_name=深圳市云创芯电子有限公司` 已规范;线上「云创芯电子(你身边的PD顾问)」/「官网」后缀来自后台 `site_name`/`seo_title_default`,需改规范名 |
| SEO-04 | P1 | 首页 title 堆砌 | ⏳ 待人工(后台) | 代码默认 `seo_title_default=深圳市云创芯电子有限公司 - 多口 TypeC 接口IC` 已自然;线上堆砌版来自后台设置,需改自然表述 |
| SEO-05 | P1 | JSON-LD 仅 Organization | ✅ 已落地 | 布局加 `WebSite`+`SearchAction`;产品页 `Product`+`BreadcrumbList`;文章页 `Article`+`BreadcrumbList` |
| SEO-06 | P1 | 无 hreflang | ✅ 已落地 | 布局加 `alternate` 自引用(zh-CN / x-default |
| SEO-07 | P2 | 图片 alt 未审计 | ⏳ 待人工 | 产品/方案配图补 alt(含关键词但自然),内容侧完善 |
| SEO-08 | P2 | 内链深度/锚文本 | ⏳ 待人工 | 重要页 ≤3 次点击可达 + 描述性锚文本,内容侧完善 |
| GEO-01 | P1 | 缺 FAQ/HowTo 结构化数据 | ⏳ 待人工 | 文章/产品页加 FAQPage/HowTo schema,内容侧完善 |
| GEO-02 | P1 | 品牌实体歧义 | ⏳ 待人工 | 同 SEO-03Organization 的 `sameAs` 可指向官方主页/认证平台(代码可加,见备注) |
| GEO-03 | P2 | 缺作者/权威信号 | ✅ 已落地(部分) | 文章页 `Article` schema 已含 author/publisher/datePublished/dateModified |
| GEO-04 | P2 | 内容未直接作答 | ⏳ 待人工 | 术语/文章开头用 1–2 句直给定义,内容侧完善 |
| GEO-05 | P2 | 无 llms.txt | ✅ 已落地 | 新增 `public/llms.txt` |
| GEO-06 | P2 | 单语言限制 | ⏳ 待人工 | 同 SEO-06,英文版可扩展 AI 答案触达(需 URL 化多语言) |
---
## 已落地改动清单(代码)
1. **SEO-02**`app/Models/Product.php`
```php
public function seoTitle(): string
{
return $this->seo_title ?: $this->name; // 仅实体名;品牌由视图统一追加
}
```
视图 `resources/views/products/show.blade.php:4``@section('title', $product->seoTitle() . ' - ' . $siteName)`
2. **SEO-05 / GEO-03** — 结构化数据
- `resources/views/layouts/app.blade.php`Organization 之后新增 `WebSite` + `SearchAction`(站内搜索 `url('/search')?q={search_term_string}`)。
- `resources/views/products/show.blade.php`:追加 `Product` + `BreadcrumbList`name/description/brand/url/category)。
- `resources/views/articles/show.blade.php`:追加 `Article` + `BreadcrumbList`headline/author/publisher/datePublished/dateModified/mainEntityOfPage)。
- 均用 `json_encode(..., JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_HEX_TAG)` 防 XSS 与 `</script>` 截断。
3. **SEO-06** — `resources/views/layouts/app.blade.php` `<head>`
```html
<link rel="alternate" hreflang="zh-CN" href="{{ url()->current() }}">
<link rel="alternate" hreflang="x-default" href="{{ url('/') }}">
```
4. **SEC-02** — `public/.well-known/security.txt`Contact / Expires / Preferred-Languages / Policy)。
5. **GEO-05** — `public/llms.txt`(站点说明 + 允许抓取栏目)。
---
## 待人工处理(后台 / 数据,非代码)
- **SEO-01(首页多 `<h1>`)**:登录后台「外观 → 首页轮播」,编辑各屏富文本时**只用 `<h2>` 作为屏内标题,全站仅首屏一个 `<h1>`**(或在富文本里不用 h1,由 Hero 文案样式承担视觉层级)。多屏都写 h1 会触发多个 h1。
- **SEO-03(品牌名)**:后台「站点设置」将 `site_name` 改为 **`深圳市云创芯电子有限公司`**(对外简称可用 `云创芯电子`,但全站统一);`seo_title_default` 去掉「官网」后缀。
- **SEO-04(首页 title**:后台「站点设置」将 `seo_title_default` 改为自然表述,例如 `云创芯电子 - 多口 TypeC 接口IC 与快充方案`,去除「PD 接口顾问 拓展坞 视频扩展 端口扩展」式堆砌。
- **GEO-02sameAs**:如需强化实体,可在 `layouts/app.blade.php` 的 Organization JSON-LD 增加 `"sameAs": ["https://..."]` 指向官方认证平台。
- **SEC-05 / REL-06 / SEO-07 / SEO-08 / GEO-01 / GEO-04**:内容/上传流程侧持续完善。
---
## 上线自检(curl 清单)
```bash
# 安全头(应含 CSP / X-Frame-Options / nosniff / Referrer-Policy / HSTS
curl -sS -I https://cloud-chip.cn/ | grep -iE 'content-security-policy|x-frame|x-content|strict-transport|referrer'
# security.txt 可达
curl -sS -o /dev/null -w 'security.txt=%{http_code}\n' https://cloud-chip.cn/.well-known/security.txt
# llms.txt 可达
curl -sS -o /dev/null -w 'llms.txt=%{http_code}\n' https://cloud-chip.cn/llms.txt
# 产品页标题不应再重复品牌
curl -sS https://cloud-chip.cn/products/cc-pd3168 | grep -iE '<title>'
# 首页 h1 数量(应为 1;若 >1 回到后台改 Hero 富文本)
curl -sS https://cloud-chip.cn/ | grep -c '<h1'
# JSON-LD 含 WebSite / Product / Article
curl -sS https://cloud-chip.cn/ | grep -c 'WebSite'
curl -sS https://cloud-chip.cn/products/cc-pd3168 | grep -c '"@type":"Product"'
curl -sS https://cloud-chip.cn/articles/<某slug> | grep -c '"@type":"Article"'
# hreflang 自引用
curl -sS https://cloud-chip.cn/ | grep -iE 'hreflang'
# sitemap 完整性(应 49 条 <loc>
curl -sS https://cloud-chip.cn/sitemap.xml | grep -c '<loc>'
# 敏感路径不应暴露
for p in /.env /phpinfo.php; do echo "$p -> $(curl -sS -o /dev/null -w '%{http_code}' https://cloud-chip.cn$p)"; done
```
---
## 上线实测扫描(2026-08-08 23:4xcurl 直连 https://cloud-chip.cn
> 目的:复核 63431dd 审计修复是否在生产环境真正生效。结论:**未生效——生产部署为陈旧版本**。
### ⚠️ 关键发现:部署陈旧,修复未上线
对线上 HTML/响应头逐项目核验,证明服务器当前运行的是 **63431dd 之前**的代码:
| 验证点 | 预期(63431dd 后) | 线上实测 | 结论 |
|---|---|---|---|
| 首页 JSON-LD | `WebSite`+`SearchAction` | 仍是旧 `Organization` | ❌ 旧代码 |
| 首页 hreflang | `zh-CN` / `x-default` | **完全缺失** | ❌ 旧布局 |
| 产品页标题 | 单品牌 `… - 深圳市…有限公司` | `… - 深圳市云创芯电子有限公司 - 深圳市云创芯电子有限公司官网`(双品牌) | ❌ 旧 `Product::seoTitle()` |
| `/.well-known/security.txt` | 200 | **404nginx 直返,文件不在服务器)** | ❌ 文件缺失 |
| `/llms.txt` | 200 | **404** | ❌ 文件缺失 |
代码历史已同步(`HEAD == origin/main == bc817bf`,含 63431dd),故问题在**服务器工作树/运行时未更新**。
### 根因(二选一或并存)
1. **服务器 checkout 停留在旧提交**`git pull` 因此前「实时更新」自动提交造成的 origin 分歧而失败/未快进,工作树停在 63431dd 之前。
2. **OPcache + 陈旧编译视图**:即便磁盘已是新文件,若 PHP-FPM 的 OPcache `validate_timestamps=Off` 且部署后未重载,旧字节码(含旧 `Product.php`、旧编译 Blade)继续服务;`.well-known` 文件缺失则指向根因 1。
### 服务器修复命令(在 /www/wwwroot/cloud-chip.cn 执行)
```bash
cd /www/wwwroot/cloud-chip.cn
git fetch origin
git reset --hard origin/main # 强制对齐最新提交(含 63431dd + security.txt/llms.txt
php artisan view:clear # 清陈旧编译视图
php artisan config:clear
php artisan route:clear
php artisan optimize:clear
# 重载 PHP-FPM 刷新 OPcache(宝塔中对应 PHP 版本,如 8.3)
# 宝塔面板:软件商店 → PHP-8.3 → 重载;或:
# service php-fpm-83 reload # 视实际服务名调整
```
修复后用下方命令复核(应全部命中):
```bash
curl -s https://cloud-chip.cn/ | grep -oE '"@type": ?"WebSite"|hreflang="zh-CN"'
curl -s -o /dev/null -w '%{http_code}\n' https://cloud-chip.cn/.well-known/security.txt # 期望 200
curl -s -o /dev/null -w '%{http_code}\n' https://cloud-chip.cn/llms.txt # 期望 200
curl -s https://cloud-chip.cn/products/cc-pd3168 | grep -oE '<title>[^<]*</title>' # 应只含一个品牌
```
若 security.txt/llms.txt 仍 404,需确认 nginx 是否拦截 `.well-known`(加 `location ~ /\.well-known/ { access_log off; }` 或确保 root 指向 public)。
### 速度实测(2026-08-08
| 指标 | 结果 | 评价 |
|---|---|---|
| 首页 TTFB(热) | 0.17s(冷启动曾 1.5s,仅首次) | ✅ 好 |
| 子页面 TTFB | 0.120.13s | ✅ 好 |
| gzip | 已开启 | ✅ |
| Cache-Control | 全程 `no-store` | ❌ 无缓存(REL-02 |
| 外部依赖 | `cdn.tailwindcss.com`Tailwind Play CDN,渲染阻塞) | ❌ 拖慢首屏 + SEC-01 根因 |
| CDN | 无(直连杭州源站 47.107.30.116 | ❌ 异地延迟(REL-01 |
| 图片 alt | 3/3 有 alt | ✅ |
### SEO/GEO 当前评级(线上=陈旧版,修复未生效)
- **安全响应头**AHSTS/CSP/X-Frame-Options 等已生效,这些早于本次修复即存在)
- **结构化数据**C(仅 Organization,缺 WebSite/Product/Article/Breadcrumb
- **hreflang**F(缺失)
- **标题规范**:D(关键词堆砌 + 双品牌 + 品牌名不一致「云创芯电子」vs「深圳市云创芯电子有限公司」)
- **sitemap / robots**A(均 200
- **security.txt / llms.txt**F404
- **速度**:B(延迟好,但无缓存+外部 CDN 拖累)
- **综合 SEO/GEO****当前 ≈ C-(基线)**;待正确部署 63431dd 后可达 **B(良好基础)**,但要到 A 仍需解决标题规范(后台设置)、多 h1(内容编辑)、CSP unsafe-inlineTailwind 构建化)、no-store 缓存、CDN 等遗留项。
---
## 备注
- 本文件与 `CHANGELOG.md` 需随代码一起提交,确保后续开发者在仓库内即可看到。
- 状态符号会随修复推进更新;请勿删除「Deferred / 待人工」项,它们是对未来开发者的明确待办。
- 2026-08-08 实测发现**生产部署未包含 63431dd**,见上「上线实测扫描」章节——修复命令已给出,部署后务必用所列 curl 复核。