网站安全自查:无需任何攻击的网店被动安全检测
网店被动安全检测清单:TLS 证书到期、HSTS、CSP、nosniff、Cookie 属性、混合内容、过时的 jQuery、security.txt 和 DMARC。
FixReports 编辑团队阅读约需 4 分钟
只要读取网站本来就会发送给每位访客的内容,您就能从外部检查网店安全配置的很大一部分:TLS 证书(即常说的 SSL 证书)、重定向、HTTP 响应头、Cookie、页面加载的脚本,以及公开的 DNS 记录。这些被动检查不会发送任何攻击流量,也不需要登录,因此给网店带来的负载不会超过一次正常访问。它们能发现各种配置疏漏,例如证书即将过期、缺少 HSTS、Cookie 不安全、存在混合内容,或者使用了含已知漏洞的 jQuery 版本。但它们不是渗透测试,也无法证明网店是安全的。
要点
- 自 2026 年 3 月 15 日起签发的公开受信任 TLS 证书,有效期最长为 200 天;2027 年 3 月将缩短到 100 天,2029 年 3 月缩短到 47 天(CA/Browser Forum (在新标签页中打开))。
- 通过明文 HTTP 发送的 HSTS 头会被浏览器忽略(MDN (在新标签页中打开))。
- CSP 的
frame-ancestors指令在<meta>标签中无效,必须作为响应头发送(MDN (在新标签页中打开))。 - 3.5.0 之前的 jQuery 版本受两个 XSS 漏洞影响,CISA 已于 2025 年 1 月 23 日将其中的 CVE-2020-11023 列入其“已知被利用漏洞”(KEV)目录(NVD (在新标签页中打开))。
security.txt文件必须包含Contact和Expires字段,并放在/.well-known/security.txt(RFC 9116 (在新标签页中打开))。
什么样的检查算被动安全检查?
被动检查只读取网站或其 DNS 对普通请求返回的内容。
也就是加载公开页面、读取证书和响应头、列出页面设置的 Cookie 和加载的脚本,以及查询公开的 DNS 记录。被动检查不会猜测密码、发送注入载荷、探测后台网址或扫描端口。下面的所有检查都可以用浏览器、curl、openssl 和 dig 完成。
如何检查 TLS 证书及其到期时间?
直接读取证书上的日期和域名,并确保续期是自动完成的。
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
| openssl x509 -noout -subject -issuer -dates
请检查 notAfter 距今还有充裕的时间;如果您同时使用 example.com 和 www.example.com,证书要覆盖这两个域名(浏览器的证书查看器会列出这些域名);并且浏览器没有显示任何警告。根据 CA/Browser Forum 的《Baseline Requirements》(第 6.3.2 节,截至 2026 年 10 月为 2.3.1 版),在 2025 年 4 月 11 日通过的 Ballot SC-081v3 (在新标签页中打开) 之后,证书有效期正在逐步缩短:
| 证书签发时间 | 最长有效期 |
|---|---|
| 2026 年 3 月 15 日之前 | 398 天 |
| 2026 年 3 月 15 日至 2027 年 3 月 14 日 | 200 天 |
| 2027 年 3 月 15 日至 2029 年 3 月 14 日 | 100 天 |
| 2029 年 3 月 15 日起 | 47 天 |
有效期越短,手动续期的风险就越大,因此请确认您的主机商或证书工具会自动续期。同时确认明文 HTTP 会重定向到 HTTPS:
curl -sI http://example.com/ | grep -i -E "^HTTP|^location"
理想的结果是 301(或 308)响应,并且 location 头以 https:// 开头。
网店应该发送哪些安全响应头?
少数几个响应头就能以几乎为零的成本阻止常见的浏览器端攻击。
| 响应头 | 作用 | 典型值 | 来源 |
|---|---|---|---|
Strict-Transport-Security | 告诉浏览器只使用 HTTPS,并阻止用户无视证书错误继续访问 | max-age=31536000; includeSubDomains | MDN (在新标签页中打开) |
Content-Security-Policy: frame-ancestors | 控制哪些网站可以嵌入您的页面,用于防御点击劫持 | frame-ancestors 'self' | MDN (在新标签页中打开) |
X-Frame-Options | 较旧的嵌入控制方式;OWASP 表示,在支持 frame-ancestors 的浏览器中,它已被 frame-ancestors 取代 | DENY 或 SAMEORIGIN | OWASP (在新标签页中打开) |
X-Content-Type-Options | 阻止 MIME 类型嗅探,并拦截以错误类型提供的脚本和样式表 | nosniff | MDN (在新标签页中打开) |
Referrer-Policy | 限制您的网址有多少信息会被发送给其他网站 | strict-origin-when-cross-origin | OWASP |
X-XSS-Protection | 浏览器 XSS 过滤器头;OWASP 表示,它可能在原本安全的网站上引入 XSS 漏洞 | 不设置,或设为 0 | OWASP |
检查您的网店发送了哪些响应头:
curl -sI https://example.com/
Strict-Transport-Security: max-age=31536000; includeSubDomains
Content-Security-Policy: frame-ancestors 'self'
X-Content-Type-Options: nosniff
Referrer-Policy: strict-origin-when-cross-origin
有两点需要注意。includeSubDomains 会让只能通过 HTTP 访问的子域名无法打开,所以请先检查各个子域名。HSTS 预加载要求 max-age 至少为 31536000 并带有 includeSubDomains,因此只有在所有子域名都已支持 HTTPS 时才添加 preload。限制脚本来源的完整 CSP 值得部署,但 OWASP 指出它的配置和维护都很复杂,安装了大量应用的网店需要仔细测试。
您的 Cookie 是否设置了 Secure、HttpOnly 和 SameSite?
会话和购物车 Cookie 应同时带有这三个属性,您可以在 Set-Cookie 响应头中看到它们。
| 属性 | 作用(据 MDN (在新标签页中打开)) | 适用场景 |
|---|---|---|
Secure | 只通过 HTTPS 发送;使用明文 HTTP 的网站无法设置该属性 | HTTPS 网店上的所有 Cookie |
HttpOnly | JavaScript 无法通过 document.cookie 读取,有助于防范 XSS | 登录会话和购物车 |
SameSite=Lax 或 Strict | 限制 Cookie 在跨站请求中的发送时机 | 会话;Strict 适合身份验证和购物车 Cookie |
SameSite=None | 在跨站请求中发送;必须与 Secure 一起使用 | 仅用于确实需要它的嵌入式第三方功能 |
如果没有设置 SameSite 属性,浏览器会把该 Cookie 当作 Lax 处理。您自己的脚本需要读取的 Cookie 不能设为 HttpOnly,所以请重点关注用于识别已登录客户或管理员的 Cookie。
curl -sI https://example.com/ | grep -i "^set-cookie"
浏览器开发者工具也会显示同样的信息,包括页面加载后由脚本设置的 Cookie。
如何发现混合内容?
混合内容是指在通过 HTTPS 提供的页面上,通过 HTTP 加载的任何资源,浏览器控制台会把它们列出来。
MDN (在新标签页中打开) 把混合内容分为两类。图片、音频和视频属于“可升级”内容:浏览器会自动通过 HTTPS 请求它们。脚本、样式表、iframe、字体和 fetch() 请求属于“可阻止”内容:浏览器会拦截它们,依赖这些资源的功能也就随之失效。升级后指向纯 IP 地址的请求同样会被拦截。
要找出混合内容,请在关键模板(首页、分类页、产品页、购物车)上打开控制台,并在主题代码、页面内容和应用设置中搜索 http://。Shopify 帮助中心指出,任何包含未通过 HTTPS 提供的资源的店铺页面都会被视为不安全 (在新标签页中打开),并建议把资源托管在 Shopify 上或通过 HTTPS 提供。在 WooCommerce 上,如果网站曾经以 http:// 运行,请检查旧的文章内容和主题选项。
如何发现含已知 CVE 漏洞的过时 JavaScript 库?
列出每个页面加载的库,读取它们的版本,并与美国国家漏洞数据库(NVD)进行比对。
先从 jQuery 开始。在浏览器控制台中,$.fn.jquery 会返回已加载的版本(jQuery API (在新标签页中打开))。需要标记的版本:
| CVE | 受影响版本 | 问题 | NVD 评分(v3.1) |
|---|---|---|---|
| CVE-2020-11022 (在新标签页中打开) | 1.12.0 至 3.5.0 之前 | 把不受信任的 HTML 传给 .html() 或 .append() 等方法时,可能会执行代码 | 6.1 中危 |
| CVE-2020-11023 (在新标签页中打开) | 1.0.3 至 3.5.0 之前 | 同上,针对包含 <option> 元素的 HTML;自 2025 年 1 月 23 日起列入 CISA 的 KEV 目录 | 6.1 中危 |
| CVE-2019-11358 (在新标签页中打开) | 3.4.0 之前 | 通过 jQuery.extend(true, ...) 造成原型污染 | 6.1 中危 |
这两个 2020 年的问题都已在 jQuery 3.5.0 中修复。存在漏洞的版本意味着有缺陷的代码确实存在,但能否被利用取决于网站如何向它传递数据。WordPress 自 5.6 版起 (在新标签页中打开)内置 jQuery 3.5.1,因此如果 WooCommerce 网店上出现旧版 jQuery,说明 WordPress 版本过时,或者某个主题或插件加载了自带的 jQuery。在 Shopify 上,请检查您的主题文件以及会注入脚本的应用。
什么是 security.txt?您的网店需要吗?
它是一个纯文本文件,告诉安全研究人员如何向您报告漏洞。
RFC 9116 (在新标签页中打开)(2022 年 4 月发布,属于信息类 RFC,因此是否遵循出于自愿)规定,该文件必须通过 HTTPS 在 /.well-known/security.txt 以 text/plain 类型提供。Contact 和 Expires 是必填字段,RFC 建议 Expires 日期距今不超过一年。
Contact: mailto:security@example.com
Expires: 2027-09-30T23:00:00.000Z
Preferred-Languages: en
Policy: https://example.com/security-policy
在 WooCommerce 上,您可以把这个文件放到自己的服务器上。在托管平台上,请确认能否在该路径发布文件;如果不能,在联系页面上清楚标注安全联系方式也同样有帮助。
DMARC 如何保护网店免受邮件伪造?
借助 DMARC,您可以要求邮箱服务商隔离或拒收那些在发件人(From)地址中使用您的域名、却没有通过对齐的 SPF 或 DKIM 的邮件。
p=none 的记录只收集报告,并不能阻止伪造邮件。客户会收到来自您域名的订单确认邮件和密码重置邮件,因此显示您确切域名的钓鱼邮件值得拦截。用 dig +short TXT _dmarc.example.com 检查您的策略,规范详见 RFC 9989 (在新标签页中打开)。DMARC 不覆盖仿冒的相似域名,只保护发布了该记录的域名本身。
Shopify 替您管理哪些?WooCommerce 上又由您控制哪些?
Shopify 运营着其店面背后的服务器,而自托管的 WooCommerce 网店则把服务器设置交给您和您的主机商。
| 检查项 | Shopify | WooCommerce(自托管) |
|---|---|---|
| TLS 证书 | 为添加到 Shopify 的所有域名免费提供 (在新标签页中打开);第三方域名最多可能需要 48 小时 | 由您的主机商提供,或自行配置 |
| HTTP 到 HTTPS 的重定向 | 由平台处理 | Web 服务器、CDN 或主机商设置 |
| 安全响应头 | 由 Shopify 的服务器发送 | Web 服务器、CDN 或插件 |
| Cookie 属性 | Shopify 自身的 Cookie 由平台设置;应用和主题的 Cookie 由您负责 | WordPress 核心、插件和服务器 |
| 混合内容和 JS 库 | 您的主题、内容和应用 | 您的主题、内容和插件 |
| security.txt 和 DMARC | 您的域名和 DNS | 您的域名和 DNS |
我们在 2026 年 10 月检查了若干托管在 Shopify 上的店面,它们的响应中都包含 max-age 约为 91 天的 HSTS、X-Content-Type-Options: nosniff,以及带有 upgrade-insecure-requests 的 CSP,而 frame-ancestors 则因店而异。Shopify 表示其已通过 PCI DSS 一级合规认证 (在新标签页中打开)。您的主题和已安装的应用仍由您自己负责。
在 WooCommerce 上,WordPress 的安全加固指南 (在新标签页中打开)建议及时更新 WordPress 和插件,删除不用的插件,并向主机商了解他们采取了哪些安全防护措施。
为什么这不算渗透测试?
渗透测试会主动尝试发起攻击;被动检查只做观察。
NIST SP 800-115 将渗透测试定义为一种安全测试:评估人员模拟真实世界的攻击,寻找绕过系统安全功能的方法(NIST 术语表 (在新标签页中打开))。被动检查看不到插件中的服务器端缺陷、弱密码或重复使用的后台密码、未启用的双重身份验证、失效的访问控制,以及从不出现在页面源代码中的漏洞代码。请把被动检查当作可以随时重复的基线。如果需要更深入的保障,请委托专业人员进行渗透测试,事先书面约定测试范围,并且只针对您拥有或已获授权测试的系统。
免费扫描会对您的网店做一轮初步检查。网站安全报告涵盖本文中的所有被动检查,从 TLS 和重定向,到响应头、Cookie、混合内容、过时的库、security.txt 和 DMARC,并为每项发现提供修复方法。和所有被动审查一样,它无法保证网店是安全的。
常见问题
被动安全检查会给我的网店带来风险吗?
不会超过一次正常访问。它们请求的是任何浏览器或邮件服务器都会请求的公开页面和 DNS 记录,不会尝试登录,也不会发送攻击载荷。
我可以在 Shopify 上添加安全响应头吗?
店面的响应头来自 Shopify 的服务器,如果缺少您需要的某个响应头,请联系 Shopify 支持团队。在主题中添加 CSP <meta> 标签可以加入部分指令,但 MDN 指出 <meta> 中不支持 frame-ancestors。
使用旧版 jQuery 是否意味着我的网店已经被黑?
不是。这说明网站加载了含已知漏洞的代码,如果网站把不受信任的 HTML 传给受影响的方法,风险就会升高。请更新 jQuery,或者移除加载它的主题或插件。
现在 TLS 证书的有效期最长是多久?
自 2026 年 3 月 15 日起签发的公开受信任证书,有效期最长为 200 天。从 2027 年 3 月 15 日起,上限降为 100 天;从 2029 年 3 月 15 日起,降为 47 天。
必须提供 security.txt 文件吗?
RFC 9116 是信息类 RFC,因此按照该标准,发布这个文件是自愿的。发布它的成本很低,还能为安全研究人员提供一个清晰的联系渠道。
被动扫描没有发现问题,是否说明我的网店是安全的?
不是。这只说明公开的配置看起来没有问题。服务器端漏洞、账户安全和业务逻辑缺陷都需要通过其他测试来发现。
参考资料
- Baseline Requirements for the Issuance and Management of Publicly-Trusted TLS Server Certificates, version 2.3.1 (在新标签页中打开),CA/Browser Forum,2026 年 10 月 4 日
- Ballot SC-081v3: Introduce Schedule of Reducing Validity and Data Reuse Periods (在新标签页中打开),CA/Browser Forum,2025 年 4 月 11 日
- Strict-Transport-Security (在新标签页中打开),MDN Web Docs,最后修改于 2026 年 9 月 11 日
- CSP: frame-ancestors (在新标签页中打开),MDN Web Docs,最后修改于 2026 年 8 月 27 日
- X-Content-Type-Options (在新标签页中打开),MDN Web Docs,最后修改于 2026 年 3 月 17 日
- Using HTTP cookies (在新标签页中打开),MDN Web Docs,最后修改于 2026 年 9 月 17 日
- Mixed content (在新标签页中打开),MDN Web Docs,最后修改于 2026 年 8 月 15 日
- HTTP Security Response Headers Cheat Sheet (在新标签页中打开),OWASP Cheat Sheet Series,访问于 2026 年 10 月 22 日
- CVE-2020-11022 (在新标签页中打开),NIST 国家漏洞数据库(NVD),发布于 2020 年 4 月 29 日
- CVE-2020-11023 (在新标签页中打开),NIST 国家漏洞数据库(NVD),发布于 2020 年 4 月 29 日
- CVE-2019-11358 (在新标签页中打开),NIST 国家漏洞数据库(NVD),发布于 2019 年 4 月 20 日
- .jquery (在新标签页中打开),jQuery API 文档,访问于 2026 年 10 月 22 日
- Updating core jQuery to version 3, part 2 (在新标签页中打开),Make WordPress Core,2020 年 11 月 5 日
- RFC 9116: A File Format to Aid in Security Vulnerability Disclosure (在新标签页中打开),IETF,2022 年 4 月
- RFC 9989: Domain-Based Message Authentication, Reporting, and Conformance (DMARC) (在新标签页中打开),IETF,2026 年 5 月
- Enabling secure connections to your Shopify store (在新标签页中打开),Shopify 帮助中心,访问于 2026 年 10 月 22 日
- Security (在新标签页中打开),Shopify,访问于 2026 年 10 月 22 日
- Hardening WordPress (在新标签页中打开),WordPress 开发者资源,访问于 2026 年 10 月 22 日
- Penetration testing (glossary) (在新标签页中打开),NIST 计算机安全资源中心,引用 NIST SP 800-115(2008 年 9 月),访问于 2026 年 10 月 22 日
全部指南
- WCAG 2.2 AA 网店无障碍检查清单:按页面类型逐项自查面向 Shopify 和 WooCommerce 网店、按页面类型整理的 WCAG 2.2 AA 无障碍检查清单:替代文本、对比度、标签、键盘、焦点、目标尺寸及 2.2 新增标准。
- 收到美国 ADA 网站律师函?首先要检查的几件事ADA 网站无障碍律师函通常指控什么、与 WCAG 有何关系、需要收集哪些材料、为何覆盖层插件修不了代码,以及何时该找律师。本文不构成法律建议。
- 无障碍覆盖层插件与 FTC accessiBe 案:网店店主须知FTC 2025 年的最终命令要求 accessiBe 因 WCAG 合规宣传支付 100 万美元。本文解读命令规定了什么、没有规定什么,以及使用无障碍覆盖层插件的网店该怎么做。