通过nginx弄一个滑块加图片的人机验证

2024-06-06 07:52

本文主要是介绍通过nginx弄一个滑块加图片的人机验证,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

要通过 Nginx 实现滑块加图片的人机验证,你可以利用 OpenResty 和 Lua 脚本来生成并处理滑块验证码。滑块验证码的基本流程包括以下步骤:

  1. 生成带有缺口的图片
  2. 生成缺口图片
  3. 前端展示图片和滑块
  4. 用户滑动滑块到正确位置
  5. 服务器验证滑块位置

以下是一个示例的实现步骤:

1. 安装 OpenResty 和 Lua 库

首先,安装 OpenResty 和必要的 Lua 库。

# For Debian/Ubuntu
sudo apt-get install openresty# For CentOS/RHEL
sudo yum install openresty# Install LuaRocks
sudo apt-get install luarocks
sudo luarocks install lua-resty-string
sudo luarocks install lua-resty-random
sudo luarocks install gd

2. 配置 Nginx

编辑你的 nginx.conf 文件,添加以下配置:

worker_processes 1;events {worker_connections 1024;
}http {include       mime.types;default_type  application/octet-stream;server {listen       8080;server_name  localhost;location /captcha {content_by_lua_file /path/to/your/captcha.lua;}location /validate {content_by_lua_file /path/to/your/validate.lua;}}
}

3. 编写 Lua 脚本

captcha.lua:生成带有缺口的图片和缺口图片

local gd = require "resty.gd"
local random = require "resty.random"
local str = require "resty.string"local function generate_code()return math.random(100, 300) -- 随机生成一个缺口位置
endlocal function create_captcha()local img = gd.createFromPng("/path/to/your/background.png")local img_width, img_height = img:sizeXY()local gap_size = 50local gap_x = generate_code()local gap_y = img_height / 2 - gap_size / 2local gap_img = gd.createTrueColor(gap_size, gap_size)gap_img:copy(img, 0, 0, gap_x, gap_y, gap_size, gap_size)local white = img:colorAllocate(255, 255, 255)img:filledRectangle(gap_x, gap_y, gap_x + gap_size, gap_y + gap_size, white)local img_str = img:pngStr()local gap_img_str = gap_img:pngStr()return img_str, gap_img_str, gap_x
endlocal img_str, gap_img_str, gap_x = create_captcha()ngx.header.content_type = "application/json"
ngx.say('{"background":"'.. ngx.encode_base64(img_str) ..'", "gap":"'.. ngx.encode_base64(gap_img_str) ..'", "gap_x":'.. gap_x ..'}')

validate.lua:验证用户滑动的位置是否正确

local cjson = require "cjson"ngx.req.read_body()
local args = ngx.req.get_post_args()
local user_gap_x = tonumber(args.gap_x)-- 从 Redis 或其他存储中获取正确的 gap_x
local correct_gap_x = 150 -- 示例值,实际应从存储中获取if math.abs(user_gap_x - correct_gap_x) < 5 thenngx.say(cjson.encode({ success = true }))
elsengx.say(cjson.encode({ success = false }))
end

4. 前端代码

前端使用 JavaScript 实现滑块和图片展示:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>滑块验证码</title><style>.captcha-container {position: relative;width: 300px;height: 150px;}.captcha-image {width: 100%;height: 100%;}.slider {position: absolute;bottom: 10px;left: 0;width: 50px;height: 50px;background-color: #fff;border: 1px solid #ccc;cursor: pointer;}</style>
</head>
<body><div class="captcha-container" id="captcha-container"><img src="" id="captcha-image" class="captcha-image"><div id="slider" class="slider"></div></div><script>async function loadCaptcha() {const response = await fetch('/captcha');const data = await response.json();const bgImage = 'data:image/png;base64,' + data.background;const gapImage = 'data:image/png;base64,' + data.gap;document.getElementById('captcha-image').src = bgImage;// Render the gap image in a canvas or any other wayreturn data.gap_x;}document.addEventListener('DOMContentLoaded', async () => {const correctGapX = await loadCaptcha();const slider = document.getElementById('slider');let isDragging = false;let startX;slider.addEventListener('mousedown', (event) => {isDragging = true;startX = event.clientX;});document.addEventListener('mousemove', (event) => {if (isDragging) {const moveX = event.clientX - startX;slider.style.transform = `translateX(${moveX}px)`;}});document.addEventListener('mouseup', async (event) => {if (isDragging) {isDragging = false;const moveX = event.clientX - startX;const response = await fetch('/validate', {method: 'POST',headers: { 'Content-Type': 'application/json' },body: JSON.stringify({ gap_x: moveX })});const result = await response.json();if (result.success) {alert('验证成功');} else {alert('验证失败');}}});});</script>
</body>
</html>

5. 注意事项

  1. 路径配置:确保图片路径和 Lua 文件路径正确。
  2. 前端滑块:实际使用时可能需要更复杂的前端代码来处理滑块移动和验证逻辑。
  3. 存储机制:为了简单起见,示例代码没有实现存储机制。在实际应用中,可以使用 Redis 或其他存储系统来存储和验证 gap_x 值。
  4. 安全性:确保传输过程中数据的安全,防止恶意攻击和绕过验证。

通过这些步骤,你可以实现一个基本的滑块验证码系统。如果需要更复杂和高效的验证码系统,可以考虑使用现有的解决方案或服务。

这篇关于通过nginx弄一个滑块加图片的人机验证的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1035516

相关文章

nginx启动命令和默认配置文件的使用

《nginx启动命令和默认配置文件的使用》:本文主要介绍nginx启动命令和默认配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录常见命令nginx.conf配置文件location匹配规则图片服务器总结常见命令# 默认配置文件启动./nginx

Python实现精准提取 PDF中的文本,表格与图片

《Python实现精准提取PDF中的文本,表格与图片》在实际的系统开发中,处理PDF文件不仅限于读取整页文本,还有提取文档中的表格数据,图片或特定区域的内容,下面我们来看看如何使用Python实... 目录安装 python 库提取 PDF 文本内容:获取整页文本与指定区域内容获取页面上的所有文本内容获取

Windows的CMD窗口如何查看并杀死nginx进程

《Windows的CMD窗口如何查看并杀死nginx进程》:本文主要介绍Windows的CMD窗口如何查看并杀死nginx进程问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows的CMD窗口查看并杀死nginx进程开启nginx查看nginx进程停止nginx服务

Python基于微信OCR引擎实现高效图片文字识别

《Python基于微信OCR引擎实现高效图片文字识别》这篇文章主要为大家详细介绍了一款基于微信OCR引擎的图片文字识别桌面应用开发全过程,可以实现从图片拖拽识别到文字提取,感兴趣的小伙伴可以跟随小编一... 目录一、项目概述1.1 开发背景1.2 技术选型1.3 核心优势二、功能详解2.1 核心功能模块2.

Go语言如何判断两张图片的相似度

《Go语言如何判断两张图片的相似度》这篇文章主要为大家详细介绍了Go语言如何中实现判断两张图片的相似度的两种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 在介绍技术细节前,我们先来看看图片对比在哪些场景下可以用得到:图片去重:自动删除重复图片,为存储空间"瘦身"。想象你是一个

使用Python实现base64字符串与图片互转的详细步骤

《使用Python实现base64字符串与图片互转的详细步骤》要将一个Base64编码的字符串转换为图片文件并保存下来,可以使用Python的base64模块来实现,这一过程包括解码Base64字符串... 目录1. 图片编码为 Base64 字符串2. Base64 字符串解码为图片文件3. 示例使用注意

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa

Windows 系统下 Nginx 的配置步骤详解

《Windows系统下Nginx的配置步骤详解》Nginx是一款功能强大的软件,在互联网领域有广泛应用,简单来说,它就像一个聪明的交通指挥员,能让网站运行得更高效、更稳定,:本文主要介绍W... 目录一、为什么要用 Nginx二、Windows 系统下 Nginx 的配置步骤1. 下载 Nginx2. 解压

c/c++的opencv实现图片膨胀

《c/c++的opencv实现图片膨胀》图像膨胀是形态学操作,通过结构元素扩张亮区填充孔洞、连接断开部分、加粗物体,OpenCV的cv::dilate函数实现该操作,本文就来介绍一下opencv图片... 目录什么是图像膨胀?结构元素 (KerChina编程nel)OpenCV 中的 cv::dilate() 函

使用Python实现调用API获取图片存储到本地的方法

《使用Python实现调用API获取图片存储到本地的方法》开发一个自动化工具,用于从JSON数据源中提取图像ID,通过调用指定API获取未经压缩的原始图像文件,并确保下载结果与Postman等工具直接... 目录使用python实现调用API获取图片存储到本地1、项目概述2、核心功能3、环境准备4、代码实现