网站安全自查:无需任何攻击的网店被动安全检测

网店被动安全检测清单:TLS 证书到期、HSTS、CSP、nosniff、Cookie 属性、混合内容、过时的 jQuery、security.txt 和 DMARC。

FixReports 编辑团队阅读约需 4 分钟

只要读取网站本来就会发送给每位访客的内容,您就能从外部检查网店安全配置的很大一部分:TLS 证书(即常说的 SSL 证书)、重定向、HTTP 响应头、Cookie、页面加载的脚本,以及公开的 DNS 记录。这些被动检查不会发送任何攻击流量,也不需要登录,因此给网店带来的负载不会超过一次正常访问。它们能发现各种配置疏漏,例如证书即将过期、缺少 HSTS、Cookie 不安全、存在混合内容,或者使用了含已知漏洞的 jQuery 版本。但它们不是渗透测试,也无法证明网店是安全的。

要点

什么样的检查算被动安全检查?

被动检查只读取网站或其 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; includeSubDomainsMDN (在新标签页中打开)
Content-Security-Policy: frame-ancestors控制哪些网站可以嵌入您的页面,用于防御点击劫持frame-ancestors 'self'MDN (在新标签页中打开)
X-Frame-Options较旧的嵌入控制方式;OWASP 表示,在支持 frame-ancestors 的浏览器中,它已被 frame-ancestors 取代DENY 或 SAMEORIGINOWASP (在新标签页中打开)
X-Content-Type-Options阻止 MIME 类型嗅探,并拦截以错误类型提供的脚本和样式表nosniffMDN (在新标签页中打开)
Referrer-Policy限制您的网址有多少信息会被发送给其他网站strict-origin-when-cross-originOWASP
X-XSS-Protection浏览器 XSS 过滤器头;OWASP 表示,它可能在原本安全的网站上引入 XSS 漏洞不设置,或设为 0OWASP

检查您的网店发送了哪些响应头:

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 应同时带有这三个属性,您可以在 Set-Cookie 响应头中看到它们。

属性作用(据 MDN (在新标签页中打开))适用场景
Secure只通过 HTTPS 发送;使用明文 HTTP 的网站无法设置该属性HTTPS 网店上的所有 Cookie
HttpOnlyJavaScript 无法通过 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 网店则把服务器设置交给您和您的主机商。

检查项ShopifyWooCommerce(自托管)
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,因此按照该标准,发布这个文件是自愿的。发布它的成本很低,还能为安全研究人员提供一个清晰的联系渠道。

被动扫描没有发现问题,是否说明我的网店是安全的?

不是。这只说明公开的配置看起来没有问题。服务器端漏洞、账户安全和业务逻辑缺陷都需要通过其他测试来发现。

参考资料