JS `Subresource Integrity (SRI)`:应对 CDN 劫持与内容篡改

各位观众老爷,大家好!我是你们的老朋友,代码界的段子手,今天咱们来聊聊一个听起来高大上,但其实能救你项目于水火之中的技术:Subresource Integrity (SRI)。简单来说,它就是给你的外链资源加了个防盗锁,防止有人偷偷摸摸地篡改你的代码。

一、 啥是CDN劫持?为啥需要SRI?

想象一下,你辛辛苦苦写好的网站,用了某个流行的CDN上的jQuery库。突然有一天,某个黑客攻破了CDN服务器,偷偷地把jQuery库里的代码改了,加了一段恶意脚本,专门偷用户的账号密码。

用户毫不知情地访问你的网站,结果账号密码就被盗了,你也被用户骂得狗血淋头。这,就是CDN劫持!

CDN劫持的危害可不仅仅是偷账号密码,它还能:

  • 植入恶意广告: 让你网站上出现一些奇奇怪怪的广告,影响用户体验。
  • 篡改页面内容: 把你网站的内容改成一些乱七八糟的东西,甚至传播谣言。
  • DDoS攻击: 利用用户浏览器发起DDoS攻击,让你的网站瘫痪。

想想都可怕吧?这就是为啥我们需要SRI!

二、 SRI的工作原理:给外链资源做“体检”

SRI的原理其实很简单,就是给你的外链资源生成一个“指纹”,也就是哈希值。每次浏览器加载这个资源的时候,都会先用相同的算法计算出资源的哈希值,然后和你提供的哈希值进行比对。如果两者一致,就说明资源没有被篡改,可以放心使用;如果两者不一致,就说明资源可能被篡改了,浏览器就会拒绝加载它。

这就像海关安检一样,每个进出口的货物都要经过扫描,确认货物和申报单上的信息一致,才能放行。

三、 如何使用SRI:三步搞定

使用SRI只需要三步:

  1. 生成资源的哈希值。
  2. 在HTML标签中添加integrity属性,并填入哈希值。
  3. 指定crossorigin属性,处理跨域问题。

3.1 生成哈希值

生成哈希值有很多方法,你可以使用命令行工具,也可以使用在线工具。

3.1.1 使用命令行工具 (OpenSSL)

如果你的电脑上安装了OpenSSL,可以使用以下命令生成哈希值:

openssl dgst -sha384 -binary jquery.min.js | openssl base64 -A
  • openssl dgst -sha384 -binary jquery.min.js: 使用SHA-384算法计算jquery.min.js文件的哈希值,-binary参数表示输出二进制格式。
  • openssl base64 -A: 将二进制格式的哈希值转换为Base64编码,-A参数表示输出单行字符串。

运行这个命令,你会得到类似这样的哈希值:


sha384-vkVJjqkF3vV7W/lVmR9R/GEmv74r0qUjFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8jFjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8FjJ8F

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注