<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[小波博客]]></title><description><![CDATA[专注技术者～]]></description><link>https://blog.youkuaiyun.com/cxiaobo520</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; cxiaobo520]]></copyright><item><title><![CDATA[PHP 滑动验证码源码实现原理与安全设计：从图片生成到轨迹校验(附有完整的源码)]]></title><link>https://blog.youkuaiyun.com/cxiaobo520/article/details/166362320</link><guid>https://blog.youkuaiyun.com/cxiaobo520/article/details/166362320</guid><author>cxiaobo520</author><pubDate>Tue, 22 Sep 2026 14:16:12 +0800</pubDate><description><![CDATA[这套 PHP 滑动验证码的核心并不是“让用户拖一下滑块”。CAPTCHA│↓ ↓ ↓图像层 身份层 行为层│ │ │↓ ↓ ↓随机图形 Visitor ID Track动态背景 HMAC Token Risk图像变形 Timestamp Final X│ │ │↓Redis 状态↓↓防重放↓Ticket前端交互 + PHP 服务端 + GD 图像处理 + Redis 状态管理 + Token 签名 + 行为轨迹分析组成的一套完整滑动验证码实现。]]></description><category></category></item><item><title><![CDATA[别再只判断X坐标了！PHP实现滑动验证码的完整原理：GD+Redis+轨迹检测]]></title><link>https://blog.youkuaiyun.com/cxiaobo520/article/details/165735069</link><guid>https://blog.youkuaiyun.com/cxiaobo520/article/details/165735069</guid><author>cxiaobo520</author><pubDate>Thu, 17 Sep 2026 12:38:14 +0800</pubDate><description><![CDATA[在网站登录、注册、找回密码、订单提交等场景中，验证码几乎是必不可少的一道防线。
最常见的验证码之一就是滑动验证码。
用户看到一个带缺口的图片，然后拖动下面的拼图，将拼图移动到正确的位置：]]></description><category></category></item><item><title><![CDATA[从一段代码看懂滑动验证码：前端到底是怎么判断你不是机器人？]]></title><link>https://blog.youkuaiyun.com/cxiaobo520/article/details/164859136</link><guid>https://blog.youkuaiyun.com/cxiaobo520/article/details/164859136</guid><author>cxiaobo520</author><pubDate>Thu, 10 Sep 2026 16:25:13 +0800</pubDate><description><![CDATA[为什么很多网站的验证码不再是“输入图片里的字”，而变成了“拖动滑块完成拼图”？
看起来只是一个简单的拖动操作，实际上背后涉及 随机题目生成、拼图渲染、用户行为采集、轨迹分析、Token 校验、前后端协作以及反自动化风控。
本文就从一个真实的原生 HTML + CSS + JavaScript 滑动验证码实现出发，完整拆解它的前端实现原理。]]></description><category></category></item><item><title><![CDATA[滑块验证码：从“拖动一下”到完整的人机验证机制]]></title><link>https://blog.youkuaiyun.com/cxiaobo520/article/details/164362961</link><guid>https://blog.youkuaiyun.com/cxiaobo520/article/details/164362961</guid><author>cxiaobo520</author><pubDate>Fri, 04 Sep 2026 10:50:23 +0800</pubDate><description><![CDATA[&lt;think&gt;我们根据要求生成摘要，不超过150字。内容关于滑块验证码的说明，总结要点：滑块验证码原理、组成、安全性重点。字数控制。&lt;/think&gt;滑块验证码通过“选择滑块+拖动”完成人机验证，核心不止前端交互，更依赖服务端验证一次性Token、滑动轨迹及风险行为。设计需兼顾随机性与用户体验，并作为风控体系的一环，配合权限、频率限制等共同保障安全。]]></description><category></category></item><item><title><![CDATA[go gin+wire实现路由依赖注入]]></title><link>https://blog.youkuaiyun.com/cxiaobo520/article/details/154836060</link><guid>https://blog.youkuaiyun.com/cxiaobo520/article/details/154836060</guid><author>cxiaobo520</author><pubDate>Fri, 14 Nov 2025 14:27:07 +0800</pubDate><description><![CDATA[go gin+wire实现路由依赖注入]]></description><category></category></item><item><title><![CDATA[go grpc 环境搭建教程]]></title><link>https://blog.youkuaiyun.com/cxiaobo520/article/details/154689410</link><guid>https://blog.youkuaiyun.com/cxiaobo520/article/details/154689410</guid><author>cxiaobo520</author><pubDate>Tue, 11 Nov 2025 13:18:29 +0800</pubDate><description><![CDATA[本文介绍了gRPC开发环境的配置与使用。主要内容包括：1）安装必要的Go语言库和protoc编译器；2）配置系统环境变量（Mac和Windows）；3）编写proto文件定义服务接口和消息格式；4）使用protoc命令生成Go代码。其中详细说明了proto文件的语法结构，包括服务定义、RPC方法声明，以及请求/响应消息类型的定义。配置完成后，开发者可通过命令生成服务端和客户端所需的代码文件。]]></description><category></category></item><item><title><![CDATA[docker基础命令]]></title><link>https://blog.youkuaiyun.com/cxiaobo520/article/details/149615988</link><guid>https://blog.youkuaiyun.com/cxiaobo520/article/details/149615988</guid><author>cxiaobo520</author><pubDate>Thu, 24 Jul 2025 21:31:47 +0800</pubDate><description><![CDATA[本文总结了常用的Docker容器管理命令，包括服务启停（stop/start/restart）、容器删除（rm）、运行新容器（run）等基础操作。重点介绍了端口映射、目录挂载、网络配置等关键参数的使用方法，如-p指定端口、-v挂载目录、--subnet创建网络子网等。同时还包含了查看容器状态（ps）、进入容器终端（exec）、网络管理（network）等实用命令。最后提到docker-compose项目启动方式，强调服务链接名的配置要点。这些命令涵盖了Docker容器从创建到管理的全生命周期操作。]]></description><category></category></item><item><title><![CDATA[自己用Dockerfile搭建hyperf框架运行环境]]></title><link>https://blog.youkuaiyun.com/cxiaobo520/article/details/149518655</link><guid>https://blog.youkuaiyun.com/cxiaobo520/article/details/149518655</guid><author>cxiaobo520</author><pubDate>Mon, 21 Jul 2025 23:24:57 +0800</pubDate><description><![CDATA[然后本机通过composer 创建hyperf-skeleton项目。编译成功之后docker-compose up 启动 即可成功。以上命令确实方便快捷，但是要安装第三方php扩展则很不方便。然后执行docker-compose build 进行编译。]]></description><category></category></item><item><title><![CDATA[Redis面试复习笔记]]></title><link>https://blog.youkuaiyun.com/cxiaobo520/article/details/142471112</link><guid>https://blog.youkuaiyun.com/cxiaobo520/article/details/142471112</guid><author>cxiaobo520</author><pubDate>Mon, 23 Sep 2024 23:17:03 +0800</pubDate><description><![CDATA[redis属于单线程(工作线程只有一个，6.x高版本出现io多线程)
reids默认有16个库，默认使用0号库
redis使用了非阻塞式IO,使用epoll作为I/O多路复用
redis使用弱一致性，异步的同步。]]></description><category></category></item><item><title><![CDATA[Mysql面试复习笔记]]></title><link>https://blog.youkuaiyun.com/cxiaobo520/article/details/142470942</link><guid>https://blog.youkuaiyun.com/cxiaobo520/article/details/142470942</guid><author>cxiaobo520</author><pubDate>Mon, 23 Sep 2024 23:07:50 +0800</pubDate><description><![CDATA[索引覆盖理解:创建的索引，该索引包含查询中用的所有字段(叶子节点包含要查询的数据)，称谓索引覆盖。
只要使用到的列全部在索引中就是索引覆盖(不需要回表查询)。
用explian输出的结果，字段Extra的字段Using index时，就能触发索引覆盖。]]></description><category></category></item><item><title><![CDATA[nginx配置一个域名访问多个项目]]></title><link>https://blog.youkuaiyun.com/cxiaobo520/article/details/142470836</link><guid>https://blog.youkuaiyun.com/cxiaobo520/article/details/142470836</guid><author>cxiaobo520</author><pubDate>Mon, 23 Sep 2024 23:03:29 +0800</pubDate><description><![CDATA[实现nginx配置一个域名访问多个项目～]]></description><category></category></item><item><title><![CDATA[php swagger安装和使用教程]]></title><link>https://blog.youkuaiyun.com/cxiaobo520/article/details/132460391</link><guid>https://blog.youkuaiyun.com/cxiaobo520/article/details/132460391</guid><author>cxiaobo520</author><pubDate>Wed, 23 Aug 2023 20:32:07 +0800</pubDate><description><![CDATA[还需要下载swagger-ui，然后修改dist目录index.html 里面url路径。]]></description><category></category></item><item><title><![CDATA[关于swoole reload()平滑重启的坑]]></title><link>https://blog.youkuaiyun.com/cxiaobo520/article/details/132239683</link><guid>https://blog.youkuaiyun.com/cxiaobo520/article/details/132239683</guid><author>cxiaobo520</author><pubDate>Fri, 11 Aug 2023 20:47:05 +0800</pubDate><description><![CDATA[如果对run()方法里面输出内容进行更改，刷新第一次页面会发现内容没变，刷新第二次才会改变。]]></description><category></category></item><item><title><![CDATA[PHP解决高并发加锁失效问题(涉及性能问题)]]></title><link>https://blog.youkuaiyun.com/cxiaobo520/article/details/129189850</link><guid>https://blog.youkuaiyun.com/cxiaobo520/article/details/129189850</guid><author>cxiaobo520</author><pubDate>Thu, 23 Feb 2023 20:47:39 +0800</pubDate><description><![CDATA[通过redis集合记录加锁的key,然后监听这个集合的key，判断key是否存在，不存在则删除，存在则判断过期时间是否小于3秒，如果小于3秒则更新过期时间,保证redis执行命令的原子性，需要通过lua脚本来实现。RedisLock代码。]]></description><category></category></item><item><title><![CDATA[力扣-连续字符串，php解答]]></title><link>https://blog.youkuaiyun.com/cxiaobo520/article/details/121681683</link><guid>https://blog.youkuaiyun.com/cxiaobo520/article/details/121681683</guid><author>cxiaobo520</author><pubDate>Thu, 02 Dec 2021 17:13:27 +0800</pubDate><description><![CDATA[给你一个字符串s，字符串的「能量」定义为：只包含一种字符的最长非空子字符串的长度。

请你返回字符串的能量。

示例 1：

输入：s = "leetcode"
输出：2
解释：子字符串 "ee" 长度为 2 ，只包含字符 'e' 。
示例 2：

输入：s = "abbcccddddeeeeedcba"
输出：5
解释：子字符串 "eeeee" 长度为 5 ，只包含字符 'e' 。
示例 3：

输入：s = "triplepillooooow"
输出：5
示例 4：

输入：s = "hooraaa..]]></description><category></category></item><item><title><![CDATA[对workerman梳理http服务代码流程]]></title><link>https://blog.youkuaiyun.com/cxiaobo520/article/details/119041334</link><guid>https://blog.youkuaiyun.com/cxiaobo520/article/details/119041334</guid><author>cxiaobo520</author><pubDate>Fri, 23 Jul 2021 17:57:48 +0800</pubDate><description><![CDATA[对workerman代码进行梳理之后，把它代码进行简化，让一些初学者容易看得懂代码，不会在庞大的项目中找函数库，可以快速清楚它的流程]]></description><category></category></item><item><title><![CDATA[php  PDO 预处理存储MYSQL bit数据类型问题]]></title><link>https://blog.youkuaiyun.com/cxiaobo520/article/details/117083328</link><guid>https://blog.youkuaiyun.com/cxiaobo520/article/details/117083328</guid><author>cxiaobo520</author><pubDate>Thu, 20 May 2021 17:03:24 +0800</pubDate><description><![CDATA[当用PDO预处理存储MYSQL 字段为BIT数据类型会遇到这样的报错:


String data,right truncated:1406 Data too long for column 'xxxx' at row 10

解决方案:

  1.设置参数:


PDO::ATTR_EMULATE_PREPARES = false

  2.在使用bindValue,后面需要加参数:


$pdo-&gt;bindValue(':bit',0,\PDO::PARAM_INT);

就解决了~
...]]></description><category></category></item><item><title><![CDATA[laravel ajax put上传图片返回http419]]></title><link>https://blog.youkuaiyun.com/cxiaobo520/article/details/105779571</link><guid>https://blog.youkuaiyun.com/cxiaobo520/article/details/105779571</guid><author>cxiaobo520</author><pubDate>Sun, 26 Apr 2020 23:00:31 +0800</pubDate><description><![CDATA[解决方案:

请求欺骗 可以加一个隐藏表单


&lt;input type="hidden" name="_method" value="put"&gt;

 ajax method 依旧为post请求

这样就可以正常上传图片啦
]]></description><category></category></item><item><title><![CDATA[vue.js 实现路由模块化，并自动加载]]></title><link>https://blog.youkuaiyun.com/cxiaobo520/article/details/102644022</link><guid>https://blog.youkuaiyun.com/cxiaobo520/article/details/102644022</guid><author>cxiaobo520</author><pubDate>Sat, 19 Oct 2019 22:27:30 +0800</pubDate><description><![CDATA[在src目录下,新建router.js


import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'

Vue.use(Router)

const files = require.context('./router',false,/\.js$/)
...]]></description><category></category></item><item><title><![CDATA[php扩展学习笔记]]></title><link>https://blog.youkuaiyun.com/cxiaobo520/article/details/102576837</link><guid>https://blog.youkuaiyun.com/cxiaobo520/article/details/102576837</guid><author>cxiaobo520</author><pubDate>Tue, 15 Oct 2019 23:04:12 +0800</pubDate><description><![CDATA[注:
TSRMLS_CC 是用来保证线程的安全
SUCCESS 成功
FAILURE 失败
EG() 这个宏用来访问符号表，函数，资源信息和常量
CG() 用来访问核心变量
PG() php全局变量
FG() 文件全局变量。大多素文件i/o或相关的全局变量的数据流都塞进标准扩展出口结构。
PHP CLI是指的单线程模式
$GLOBALS不过EG(symbol_table)的封装一层
EG(ac...]]></description><category></category></item></channel></rss>