当前位置: 首页 > news >正文

极验3代 加密分析

  • 目标链接
'aHR0cHM6Ly93d3cuZ2VldGVzdC5jb20vZGVtby9zbGlkZS1mbG9hdC5odG1s'
  • 接口分析
  1. 极验参数重要信息 gt和challenge;gt是固定的,但是challenge每次请求会产生不同的,这里的请求的并没有什么加密参数。
    在这里插入图片描述

  2. 下一个请求 gettype.php,传递了 gt 参数的值以及 callback,callback 为 geetest_ + 时间戳;响应预览中返回了一些 js 文件及对应的版本号。
    在这里插入图片描述

  3. get.php?xxx,传入的参数如下:
    gt:register-slide 响应返回的 gt 值;
    challenge:register-slide 响应返回的 challenge 值;
    w:对轨迹、滑动时间等进行加密后的参数,不存在轨迹直接置空
    callback:geetest_ + 时间戳。
    在这里插入图片描述响应数据好像也没啥,就是极验的帮助中心信息

  4. 点击按钮进行验证之后,Network 中抓包到了以下信息 ajax.php?xxx请求
    gt:register-slide 响应返回的 gt 值;
    challenge:register-slide 响应返回的 challenge 值;
    w:对轨迹、滑动时间等进行加密后的参数, w 值也可以直接置空;
    callback:geetest_ + 时间戳。
    在这里插入图片描述
    响应返回验证码模式,滑块验证码为 slide,点选验证码为 click

  5. 第二个 get.php?xxx,url 中传递了一些参数
    gt:register-slide 响应返回的 gt 值;
    challenge:register-slide 响应返回的 challenge 值;
    callback:geetest_ + 时间戳。
    type:上个请求返回的验证码类型
    在这里插入图片描述重点响应参数:
    bg:被打乱的带缺口背景图,需要还原
    fullbg:被打乱的完整背景图,需要还原
    slice:滑块图片,不需要还原
    c:关键参数,与后面 aa 参数的值有关,固定值;
    s:关键参数,与后面 aa 参数的值有关。

  6. 接下来请求ajax.php?xxx
    t:register-slide 响应返回的 gt 值;
    challenge:register-slide 响应返回的 challenge 值 + 两位字符串,注意多了两位,是第二个 get.php?xxx 返回值中得到的;
    w:对轨迹、滑动时间等进行加密后的参数,需要通过逆向得到;
    callback:geetest_ + 时间戳。在这里插入图片描述

  • 参数分析
    需要分析的参数challenge+两位数、w参数

w参数:

  1. w 参数在 js 文件中有特征码,点击按钮进行验证之后,ctrl + shift + f 全局搜索 “\u0077”,因为 \u0077 就是 w 的 Unicode 编码,然后点击进入 slide.7.8.9.js 文件中,7.8.9 为当前版本。
    在这里插入图片描述

  2. 进入后点击左下角 {} 大括号,格式化文件,再 ctrl + f 局部搜索 “\u0077”,只有一个结果,在第 6086 行,在第 6088 行打下断点,滑动滑块即会断住,h + u 即为 w 参数的值
    在这里插入图片描述

  3. 参数是 h 和 u 相加得到的,所以找到定义的位置,看看是怎么构造生成的

var u = r[$_CAIAt(754)]()
l = V[$_CAIAt(353)](gt[$_CAIAt(218)](o), r[$_CAIAt(756)]())
h = m[$_CAIAt(782)](l)
"\u0077": h + u

可以看到,h 参数是传入了 l 参数后经过 m[$_CAIAt(782)] 方法处理后得到的

  1. u参数
    1. u 参数通过 r[$_CAIAt(754)] 方法生成,选中后跟进到方法定义位置
    在这里插入图片描述
    2. 进入函数在 6227 行 return 处打下断点,重新拖动滑块,即会断住
    在这里插入图片描述
    加密地方

    e = new U()[$_CBGAZ(353)](this[$_CBGAZ(756)](!0));
    //还原
    e = new U()["encrypt"](this["$_CCEc"](!0));
    
    1. his[“$_CCEc”] 分析完了,那 new U()[“encrypt”] 是什么呢,选中 new U() 后,从原型链中可以看到 setPublic,根据经验很有可能就是 RSA 加密设置公钥
      在这里插入图片描述

    2. 第 2908 行,ut 函数传入了两个值,t 为公钥值,e 为公钥模数,都是固定值:
      t:“00C1E3934D1614465B33053E7F48EE4EC87B14B95EF88947713D25EECBFF7E74C7977D02DC1D9451F79DD5D1C10C29ACB6A9B4D6FB7D0A0279B6719E1772565F09AF627715919221AEF91899CAE08C0D686D748B20A3603BE2318CA6BC2B59706592A9219D0BF05C9F65023A21D2330807252AE0066D59CEEFA5F2748EA80BAB81”
      e:“10001”
      这里可以直接引库复现,也可以选择将算法部分扣下来,局部搜索 var U = function,在第 2043 行,将整个自执行函数扣下来,这里随机数后期写成固定值,后面也有随机数,不然会造成传参不匹配

    3. 剩下就一点点扣

  2. 参数l

    1. u 参数解决后,接着需要分析 l 参数,内容如下:
    // 混淆
    l = V[$_CAIAt(353)](gt[$_CAIAt(218)](o), r[$_CAIAt(756)]());
    // 未混淆
    l = V["encrypt"](gt["stringify"](o), r["$_CCEc"]());
    

    l 参数的结果是将 gt.“stringify”(o)'和 r.“CCEc"()加密后得到的,先来分析r."_CCEc"() 加密后得到的,先来分析 r."CCEc"()加密后得到的,先来分析r."_CCEc”() , r"$_CCEc"()还是16位字符串。(记得得干rsa同一个值

    1. 将这里写成跟之前一样的固定值, gt[“stringify”](o) 返回的是 JSON 格式的数据,由 o 参数生成
      在这里插入图片描述
      userresponse:滑动距离 + challenge 的值;
      passtime:滑块滑动时间;
      imgload:图片加载时间;
      aa:轨迹加密;
      ep-tm:window[“performance”][“timing”] 相关;
      mocq:每天 key、value 会变,后文分析;
      rp:gt + 32 位 challenge + passtime,再经过 MD5 加密。

    2. 键值进行分析,先来分析下 userresponse,o 定义在第 6012 行:
      在这里插入图片描述

    	o = {'lang': i[$_CAIAt(116)] || $_CAHJd(103),'userresponse': H(t, i[$_CAHJd(182)]),'passtime': n,'imgload': r[$_CAIAt(750)],'aa': e,'ep': r[$_CAHJd(714)]()
    };
    
    1. userresponse 定义在第 6014 行,需要分析 H(t, i[$_CAHJd(182)]),控制台打印一下
      在这里插入图片描述
      见通过整个H函数扣下来补环境。

    2. passtime需要跟轨迹的最后一个时间一样

    3. 接着分析aa 其定义在第 6017 行,值由参数 e 传递,同样向上跟栈到 $_CGlj 中,为第 8168 行的 l 值,l 定义在第 8167 行,三个参数加密后得到:
      在这里插入图片描述

      n[DAAAV(913)][_DAAAV(913)][DAAAV(913)][_CJJJb(1066)]() :轨迹加密后的结果;
      n[DAAAV(69)][_DAAAV(69)][DAAAV(69)][_CJJJb(1097)] :c 值,在第二个 get.php?xxx 返回的响应中得到;
      n[DAAAV(69)][_DAAAV(69)][DAAAV(69)][_CJJJb(319)] :s 值,在第二个 get.php?xxx 返回的响应中得到。
      这里相当于就是得把轨迹进行加密,将其算法全扣下来。细节就是它加密了两次。
      轨迹值:在这里插入图片描述

    4. ep 定义在第 6018 行,跟进到 r/[CAHJd(714)]中,tm参数定义在第6239行![在这里插入图片描述](https://img−blog.csdnimg.cn/be90376df73c4b3c91e86f15195cfba8.png)跟进newbt()[_CAHJd(714)] 中,tm 参数定义在第 6239 行 ![在这里插入图片描述](https://img-blog.csdnimg.cn/be90376df73c4b3c91e86f15195cfba8.png) 跟进 new bt()[CAHJd(714)]中,tm参数定义在第6239![在这里插入图片描述](https://imgblog.csdnimg.cn/be90376df73c4b3c91e86f15195cfba8.png)跟进newbt()[_CBGEC(760)] 中,在第 5268 行打下断点,tm 结果如下
      在这里插入图片描述
      再把this$_BJBFK(666)补上即可

    5. 往下看可以发现o新增了两个参数的,接下来分析 rp 参数,定义在第 6076 行
      在这里插入图片描述

    	o[$_CAIAt(791)] = X(i[$_CAIAt(104)] + i[$_CAIAt(182)][$_CAHJd(139)](0, 32) + o[$_CAHJd(704)]);o["rp"] = X(i['gt'] + i['challenge']['slice'](0, 32) + o['passtime']);
    

    经过验证X就是MD5,而且是没有魔改的

    1. 接下来每次请求会变的那个参数
      在这里插入图片描述
      接着往下找,第 6026 行 a = window[$_CAHJd(744)](s) 执行之后 s 中生成了以上的键值对,所以跟进到 window[$_CAHJd(744)] 中,会跳转到 gct.xxxxxxxx.js 文件中,这个文件的路径可以从 get.php 接口获取到
      在这里插入图片描述
      在该文件的第 1253 行打下断点,可以看到此时的 t 中已经生成了 h9s9: “1803797734” :
  3. 参数 o 复现完毕,回到第 6078 行,分析完 V[$_CAIAt(353)] l 即完成,跟进,定义在第 3218 行,在第 3230 行打下断点,这里为 AES 加密,初始向量 iv 值为 “0000000000000000”:
    在这里插入图片描述

function V(o_text, random_str) {var key = CryptoJS.enc.Utf8.parse(random_str);var iv = CryptoJS.enc.Utf8.parse("0000000000000000");var srcs = CryptoJS.enc.Utf8.parse(o_text);var encrypted = CryptoJS.AES.encrypt(srcs, key, {iv: iv,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7});for (var r = encrypted, o = r.ciphertext.words, i = r.ciphertext.sigBytes, s = [], a = 0; a < i; a++) {var c = o[a >>> 2] >>> 24 - a % 4 * 8 & 255;s.push(c);}return s;
};

对比结果一致

  1. 参数分析完毕,终于只剩下一个 h 了,m$_CAIAt(782) 即将 l 加密后得到的,跟进 m[$_CAIAt(782)],定义在第 1568 行,在第 1575 行打下断点,为 e 中两个 value 值相加:
    在这里插入图片描述
    e 定义在第 1574 行,t 为传入的 l 参数,跟进到 this[$_GFJn(264)] 中,在第 1523 行,直接扣下来至此w参数复现完成。

现在已经将h和u还原成功了。

相关文章:

极验3代 加密分析

目标链接 aHR0cHM6Ly93d3cuZ2VldGVzdC5jb20vZGVtby9zbGlkZS1mbG9hdC5odG1s接口分析 极验参数重要信息 gt和challenge&#xff1b;gt是固定的&#xff0c;但是challenge每次请求会产生不同的&#xff0c;这里的请求的并没有什么加密参数。 下一个请求 gettype.php&#xff0c…...

python 数据分析可视化实战 超全 附完整代码数据

代码数据&#xff1a;https://download.csdn.net/download/qq_38735017/873799141.1 数据预处理1.1.1 异常值检测①将支付时间转为标准时间的过程中发生错误&#xff0c;经排查错误数据为‘2017/2/29’,后将其修改为‘2017/2/27’。②经检测发现部分订单应付金额与实付金额都为…...

有趣的HTML实例(十三) 咖啡选择(css+js)

一个人追求目标的路途是孤单的&#xff0c;一个人独品辛酸的时候是寂寥的&#xff0c;一个人马不停蹄的追赶着&#xff0c;狂奔着&#xff0c;相信前方是一片光明&#xff0c;我从不放弃希望&#xff0c;就像我对生活的信念&#xff0c;没有人可以动摇。 ——《北京青年》 目录…...

【力扣-LeetCode】1139. 最大的以 1 为边界的正方形 C++题解

1139. 最大的以 1 为边界的正方形难度中等137收藏分享切换为英文接收动态反馈给你一个由若干 0 和 1 组成的二维网格 grid&#xff0c;请你找出边界全部由 1 组成的最大 正方形 子网格&#xff0c;并返回该子网格中的元素数量。如果不存在&#xff0c;则返回 0。示例 1&#xf…...

【JavaGuide面试总结】Redis篇·下

【JavaGuide面试总结】Redis篇下1.如何使用 Redis 事务&#xff1f;2.如何解决 Redis 事务的缺陷&#xff1f;3.说说Redis bigkey吧4.大量 key 集中过期问题怎么解决的5.如何保证缓存和数据库数据的一致性&#xff1f;6.缓存穿透有哪些解决办法&#xff1f;7.缓存击穿有哪些解决…...

ForkJoinPool原理

1、概述 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架。ForkJoinPool是Java中提供了一个线程池&#xff0c;特点是用来执行分治任务。主题思想是将大任务分解为小任务&#xff0c;然后继续将小任务分解&#xff0c;直至能够直接解决为止&#xff0c;然后再依次将任…...

02 python基本语法和数据类型

基本语法 python脚本可以在python交互式shell或者代码编辑器中编写与运行。python文件的扩展名一般为.py python使用缩进来区分不同的代码块,此特性有利于提高代码可读性。 下面是一个简单的python条件语句代码: 小明=矮穷错 小红=白富美 小华=高富帅 小李=程序员某人 = &quo…...

【办公类-16-09】“2022下学期 大班运动场地分配表-跳过节日循环排序”(python 排班表系列)

样例展示&#xff1a;跳过节日的运动场地循环排序表&#xff08;8个班级8组内容 下学期一共20周&#xff09;背景需求&#xff1a;上学期做过一次大班运动场地安排&#xff0c;跳过节日。2023.2下学期运动场地排班&#xff08;跳过节日&#xff09;又来了。一、场地器械微调二、…...

全网多种方法分析解决HTTP Status 404资源未找到的错误,TCP的3次握手,dns域名解析,发起http请求以及cookie和session的区别

文章目录1. 文章引言2. 简述URL3. http完整请求3.1 DNS域名解析3.2 TCP的3次握手3.3 发起http请求3.4 浏览器解析html代码3.5 浏览器对页面进行渲染呈现给用户4. 解决404错误的方法5. 补充知识点5.1 cookie和session的区别5.2 ChatGPT的介绍1. 文章引言 正赶上最近ChatGPT很火…...

Django图书商场购物系统python毕业设计项目推荐

mysql数据库进行开发&#xff0c;实现了首页、个人中心、用户管理、卖家管理、图书类型管理、图书信息管理、订单管理、系统管理等内容进行管理&#xff0c;本系统具有良好的兼容性和适应性&#xff0c;为用户提供更多的网上图书商城信息&#xff0c;也提供了良好的平台&#x…...

基于模型预测控制(MPC)的悬架系统仿真分析

目录 前言 1.悬架系统 2.基于MPC的悬架系统仿真分析 2.1 simulink模型 2.2仿真结果 2.3 结论 3 总结 前言 模型预测控制是无人驾驶中较为热门的控制算法&#xff0c;但是对于悬架等这类系统的控制同样适用。 我们知道模型预测控制主要可以划分为三个部分&#xff1a; …...

Word处理控件Aspose.Words功能演示:使用 Java 拆分 MS Word 文档

Aspose.Words 是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。此外&#xff0c;API支持所有流行的Word处理文件…...

图扑数字孪生智慧机场,助推民航“四型机场“建设

前言 民航局印发的《智慧民航建设路线图》文件中&#xff0c;明确提出智慧机场是智慧民航的四个核心抓手之一。并从机场全域协同运行、作业与服务智能化、智慧建造与运维方面&#xff0c;为智慧机场的发展绘制了清晰的蓝图。 效果展示 图扑软件应用自主研发核心产品 HT for …...

内网安装管家婆软件如何实现外网访问?内网穿透的几种方案教程

管家婆软件从网络架构上分两种版本&#xff1a;web&#xff08;浏览器http端口&#xff09;访问的版本和客户端&#xff08;211固定端口sqlserver数据库&#xff09;访问的版本。公司库管经常用仓库登录管家婆&#xff0c;一旦需要在公司外部登陆访问管家婆客户端&#xff0c;就…...

CCNP350-401学习笔记(1-50题)

1、Which function does a fabric edge node perform in an SD-Access deployment?A. Connects endpoints to the fabric and forwards their traffic. B. Encapsulates end-user data traffic into LISP. C. Connects the SD-Access fabric to another fabric or external La…...

基于微信小程序的新冠肺炎服务预约小程序

文末联系获取源码 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7/8.0 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 浏览器…...

网站项目部署在k8s案例与Jenkins自动化发布项目(CI/CD)

在K8s平台部署项目流程 在K8s平台部署Java网站项目 制作镜像流程 第一步&#xff1a;制作镜像 使用镜像仓库&#xff08;私有仓库、公共仓库&#xff09;&#xff1a; 1、配置可信任&#xff08;如果仓库是HTTPS访问不用配置&#xff09; # vi /etc/docker/daemon.json { "…...

网络原理 (1)

网络原理 文章目录1. 前言&#xff1a; 2. 应用层2.1 XML2.2 json2.3 protobuffer3. 传输层3.1 UDP3.1 TCP4. TCP 内部的工作机制 &#xff08;重点&#xff09;1. 确认应答 2.超时重传3. 连接管理3.1 建立联系 &#xff1a;三次握手3.2 断开连接 : 四次挥手4. 滑动窗口5. 流量…...

LeetCode-1139. 最大的以 1 为边界的正方形【前缀和,矩阵】

LeetCode-1139. 最大的以 1 为边界的正方形【前缀和&#xff0c;矩阵】题目描述&#xff1a;解题思路一&#xff1a;前缀和。前缀和来记录边长。解题思路二&#xff1a;0解题思路三&#xff1a;0题目描述&#xff1a; 给你一个由若干 0 和 1 组成的二维网格 grid&#xff0c;请…...

windows10/11,傻瓜式安装pytorch(gpu),在虚拟环境anaconda

安装anaconda地址 &#xff1a;Anaconda | The Worlds Most Popular Data Science Platform安装选项全默认点击next就行。查看支持cuda版本cmd命令行输入nvidia-smi。下图右上角显示11.6为支持的cuda版本。要是显示没有nvidia-smi命令。得安装nvidia驱动&#xff0c;一般情况都…...

Revit导出PDF格式图纸流程及“批量导出图纸”

一、Revit导出PDF格式图纸流程 1、点击左上方“应用程序菜单”即“R”图标&#xff0c;进择“打印”选项。 2、在弹出的对话框中&#xff0c;需要设置图纸“打印范围”&#xff0c;选择“所选的视图/图纸选项”&#xff0c;点击“选择”&#xff0c;按钮&#xff0c;选择我们需…...

【自学Linux】 Linux文件目录结构

Linux文件目录结构 Linux文件目录结构教程 在 Linux 中&#xff0c;有一个很经典的说法&#xff0c;叫做一切皆文件&#xff0c;因此&#xff0c;我们在系统学习 Linux 之前&#xff0c;首先要了解 Linux 的文件目录结构。Linux 主要的目录有三大类&#xff0c;即根目录(/)&a…...

如何让APP在Google Play中成为特色

Google Play覆盖了 190 多个地区&#xff0c;数十亿的用户&#xff0c;所以开发者都会希望APP在应用商店中获得推荐位。 Google Play 上的精选热门应用类型&#xff1a;热门游戏或应用&#xff0c;畅销应用&#xff0c;安装量增长的应用&#xff0c;产生最多收入的应用。 那么…...

【C++】cin的处理过程

使用cin进行输入时&#xff0c;程序将输入视为一系列的字节&#xff0c;其中每个字节都被解释为字符编码。不管目标数据 类型是什么&#xff0c;输入一开始都是字符数据——文本数据。然后&#xff0c;cin对象负责将文本转换为其他类型。 为说明这是如何完成的&#xff0c;来看…...

读取Sentinel和Landsat 压缩包数据,直接进行波段重组、影像裁剪或者匀色镶嵌处理

波段重组在软件中查找&#xff1a;菜单栏-》影像基本处理-》波段处理-》波段重组&#xff0c;弹出如下对话框&#xff1a;根据对话框中的提示&#xff0c;输入需要处理的数据。注意&#xff1a;1、输入数据添加之后&#xff0c;需要点击其中任意一条数据&#xff0c;获取数据波…...

Yakit Web Fuzzer 终极能力强化:热加载 Fuzz

Background 在 HTB&#xff1a;BountyHunter 中&#xff0c;我们发现 Web Fuzzer 在使用中可以 “更强”&#xff0c;我们需要编写 Yak 脚本的事情&#xff0c;如果可以经过某些 Web Fuzzer 的优化&#xff0c;可以达到同样的效果。 在一个标签中&#xff0c;我们实现{{base6…...

Qt新手入门指南 - 如何创建模型/视图(三)

每个UI开发人员都应该了解ModelView编程&#xff0c;本教程的目标是为大家提供一个简单易懂的介绍。Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff…...

【Spring】手动实现简易AOP和IOC

前言 XML&#xff1a;通过Dom4j对XML进行解析和验证。 IOC&#xff1a;通过获取要创建对象的Class类型、构造函数后&#xff0c;通过反射来实现。 AOP&#xff1a;通过使用JDK动态代理和Cglib动态代理实现。 一、解析XML 1.1、解析bean标签 /*** 解析bean标签* param xmlBean…...

EasyExcel的使用

这里写目录标题先导入依赖最简单的写最简单的读項目开发中的一些操作xml一定要默認放先导入依赖 <dependencies><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.7</version><…...

基础篇(-1)-java特点、JDK、JRE、JVM区别、字节码编译、跨平台、程序运行

文章目录1.Java的特点有哪些&#xff1f;2.JDK和JRE和JVM的区别3.Java为什么采用字节码编译&#xff1f;4.什么是跨平台&#xff1f;5.Java程序从源代码到运行需要三步&#xff1f;1.Java的特点有哪些&#xff1f; Java是一种编程语言&#xff0c;被特意设计用于互联网的分布式…...

咸宁市做网站/百度推广开户渠道公司

java 集合类Array、List、Map区别和联系转载▼java集合类主要分为以下三类&#xff1a;第一类&#xff1a;Array、Arrays第二类&#xff1a;Collection&#xff1a;List、Set第三类&#xff1a;Map&#xff1a;HashMap、HashTable一、Array &#xff0c; ArraysJava所有“存储及…...

做网站接活犯法吗/如何对网站进行推广

1. 查看该数据库实例下所有库大小&#xff0c;得到的结果是以MB为单位mysql> select table_schema,sum(data_length)/1024/1024 as data_length,sum(index_length)/1024/1024 \as index_length,sum(data_lengthindex_length)/1024/1024 as sum from information_schema.tabl…...

诸城做网站/seo站长博客

基于顺序搜索动态分区分配算法&#xff0c;只要把概念弄清楚&#xff0c;那么新进程的处理就很简单了。 最佳适应(best,fit BF)算法 所谓最佳&#xff0c;每次为作业分配内存时&#xff0c;总能把能满足要求&#xff0c;又是最小的空闲分配给作业。避免大材小用。主要做法&am…...

装饰公司网站模板下载/企业网站的主要类型有

下载 Hadoop wget https://dlcdn.apache.org/hadoop/common/hadoop-3.2.3/hadoop-3.2.3.tar.gz --no-check-certificate 配置环境变量 首先修改当前用户的配置文件&#xff0c;添加 Hadoop 环境变量。修改 ~/.bashrc Hadoop 解压后即可使用。通过在任意路径下&#xff0c;使…...

假网站连接怎么做的/百度关键词排名十大排名

用java实现短信发送的实例分享 技术菜鸟一枚&#xff0c;最近公司正好要用短信验证码的功能做登录页面&#xff0c;思来寻去发现一款不错的短信发送软件&#xff0c;对接起来很方便快捷&#xff0c;页面排版也很好&#xff0c;特来分享一下 www.ihuyi.com public static void m…...

网站建设营销型网站/网站seo分析案例

为什么80%的码农都做不了架构师&#xff1f;>>> 引擎类型myisam,innodb,区别,性能,默认事务级别,多版本机制,并发扣库存怎么解决索引数据结构,为什么要这样的数据结构锁,锁的原因,怎么分析锁慢SQL日志,分析慢SQL,优化高性能设计及容量规划SQL注入分库分表建议看: 高…...