Files
cloud-chip.cn/docs/SECURITY_SEO_REMEDIATION.md
T
Lucanlee 63431dd77c 依据 SECURITY_SEO_AUDIT.md 实施第一轮安全/SEO/GEO 修复
代码改动:
- SEO-02 产品页标题品牌重复:Product::seoTitle() 去掉品牌后缀,由视图统一追加 $siteName
- SEO-05/Geo-03 结构化数据:布局增 WebSite+SearchAction;产品页 Product+BreadcrumbList;文章页 Article+BreadcrumbList(含作者/发布日期)
- SEO-06 hreflang 自引用(zh-CN/x-default)
- SEC-02 新增 public/.well-known/security.txt
- GEO-05 新增 public/llms.txt

记录文档(供未来开发者接手):
- CHANGELOG.md:版本与变更日志
- docs/SECURITY_SEO_REMEDIATION.md:逐项状态总表 + 改动位置 + 上线 curl 自检清单
(SEC-01/REL-01~03/PHY-01~04 等需 Tailwind 构建或云端操作项标记为待办,未自动改以免破坏站点)
2026-08-08 23:19:35 +08:00

125 lines
9.1 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
```
---
## 备注
- 本文件与 `CHANGELOG.md` 需随代码一起提交,确保后续开发者在仓库内即可看到。
- 状态符号会随修复推进更新;请勿删除「Deferred / 待人工」项,它们是对未来开发者的明确待办。