各位观众老爷,大家好!我是你们的老朋友,代码界的段子手,今天咱们来聊聊一个听起来高大上,但其实能救你项目于水火之中的技术:Subresource Integrity (SRI)。简单来说,它就是给你的外链资源加了个防盗锁,防止有人偷偷摸摸地篡改你的代码。
一、 啥是CDN劫持?为啥需要SRI?
想象一下,你辛辛苦苦写好的网站,用了某个流行的CDN上的jQuery库。突然有一天,某个黑客攻破了CDN服务器,偷偷地把jQuery库里的代码改了,加了一段恶意脚本,专门偷用户的账号密码。
用户毫不知情地访问你的网站,结果账号密码就被盗了,你也被用户骂得狗血淋头。这,就是CDN劫持!
CDN劫持的危害可不仅仅是偷账号密码,它还能:
- 植入恶意广告: 让你网站上出现一些奇奇怪怪的广告,影响用户体验。
- 篡改页面内容: 把你网站的内容改成一些乱七八糟的东西,甚至传播谣言。
- DDoS攻击: 利用用户浏览器发起DDoS攻击,让你的网站瘫痪。
想想都可怕吧?这就是为啥我们需要SRI!
二、 SRI的工作原理:给外链资源做“体检”
SRI的原理其实很简单,就是给你的外链资源生成一个“指纹”,也就是哈希值。每次浏览器加载这个资源的时候,都会先用相同的算法计算出资源的哈希值,然后和你提供的哈希值进行比对。如果两者一致,就说明资源没有被篡改,可以放心使用;如果两者不一致,就说明资源可能被篡改了,浏览器就会拒绝加载它。
这就像海关安检一样,每个进出口的货物都要经过扫描,确认货物和申报单上的信息一致,才能放行。
三、 如何使用SRI:三步搞定
使用SRI只需要三步:
- 生成资源的哈希值。
- 在HTML标签中添加
integrity
属性,并填入哈希值。 - 指定
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