代码改动: - 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 构建或云端操作项标记为待办,未自动改以免破坏站点)
125 lines
9.1 KiB
Markdown
125 lines
9.1 KiB
Markdown
# 安全 / 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-03;Organization 的 `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-02(sameAs)**:如需强化实体,可在 `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 / 待人工」项,它们是对未来开发者的明确待办。
|