C#滑动验证码拼图验证功能实现(SlideCaptcha)

C#滑动验证码拼图验证功能实现(SlideCaptcha)攻略

问题描述

在网站或移动应用等中,为了防止恶意攻击或机器人入侵,通常需要进行验证码验证。其中,滑动验证码拼图验证功能是一种常见的形式,用户需要按照要求把滑块拖动到正确的位置上,才能通过验证。

本文将介绍如何使用C#语言,结合ASP.NET Web应用程序,来实现滑动验证码拼图验证功能的开发。

解决方案

1.前端实现

首先,我们需要在前端页面中添加滑动验证码拼图验证所需要的HTML、CSS和Javascript代码。其中,下面是一个示例代码:

<div class="slide-captcha-container">
  <div class="slide-captcha-bg">
    <img src="images/background.jpg" />
  </div>
  <div class="slide-captcha-print">
    <img src="images/print.png" />
  </div>
  <div id="slide-block" class="slide-captcha-block"></div>
</div>

<script>
    $(document).ready(function() {
        var slider = new SliderUnlock("#slide-block");
        slider.init();
    });
</script>

上述代码中,我们首先在页面上添加了一个滑动验证码的容器slide-captcha-container,其中包含了一个背景图slide-captcha-bg和一个打印图案slide-captcha-print,以及一个滑块slide-block。接着,我们使用了Javascript插件SliderUnlock实现了滑块的拖动功能,并且通过$(document).ready事件,当文档准备好后自动初始化滑块功能。

以下是一段示例的CSS代码,用于实现页面的布局和样式:

.slide-captcha-container {
    position: relative;
    width: 330px;
    height: 200px;
}

.slide-captcha-bg {
    position: absolute;
    top: 0;
    left: 0;
    width: 330px;
    height: 200px;
    background-color: #f5f5f5;
}

.slide-captcha-print {
    position: absolute;
    top: 50%;
    left: 50%;
    width: 130px;
    height: 130px;
    margin-top: -65px;
    margin-left: -65px;
    z-index: 1;
}

.slide-captcha-block {
    position: absolute;
    top: 50%;
    left: 0;
    width: 50px;
    height: 50px;
    margin-top: -25px;
    background-color: #fff;
    border: 1px solid #ddd;
    border-radius: 25px;
    z-index: 2;
    cursor: pointer;
}

2.后端实现

接下来,我们需要在后端服务器中对滑动验证码拼图验证进行后台验证,以确保用户输入的验证码是否正确。

下面是一段基本的后端验证代码,用于对滑块的具体位置进行验证:

public bool CheckSlideCaptcha(int sliderX, int bgWidth, int printWidth) {
    float offset = 10; // 容差范围
    float err = Math.Abs((float)bgWidth * (float)sliderX / (float)printWidth - (float)sliderX);
    if (err < offset) {
        return true;
    } else {
        return false;
    }
}

上述代码中,我们首先传递了用户输入的滑块位置sliderX、背景图宽度bgWidth和打印图案宽度printWidth三个参数。然后,我们使用容差范围来判断滑块的位置是否正确,如果误差在限定范围内,则验证通过,否则验证失败。

3.完整示例

下面是一段完整的示例代码,用于展示如何将前端和后端代码结合起来,实现滑动验证码拼图验证的完整功能:

<!doctype html>
<html>
<head>
    <title>Slide Captcha验证示例</title>
    <meta charset="utf-8" />
    <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css">
    <style>
        .slide-captcha-container {
            position: relative;
            width: 330px;
            height: 200px;
        }

        .slide-captcha-bg {
            position: absolute;
            top: 0;
            left: 0;
            width: 330px;
            height: 200px;
            background-color: #f5f5f5;
        }

        .slide-captcha-print {
            position: absolute;
            top: 50%;
            left: 50%;
            width: 130px;
            height: 130px;
            margin-top: -65px;
            margin-left: -65px;
            z-index: 1;
        }

        .slide-captcha-block {
            position: absolute;
            top: 50%;
            left: 0;
            width: 50px;
            height: 50px;
            margin-top: -25px;
            background-color: #fff;
            border: 1px solid #ddd;
            border-radius: 25px;
            z-index: 2;
            cursor: pointer;
        }
    </style>
</head>
<body>
    <div class="container">
        <br />
        <div class="row">
            <div class="col-md-6">
                <div class="slide-captcha-container">
                    <div class="slide-captcha-bg">
                        <img src="images/background.jpg" />
                    </div>
                    <div class="slide-captcha-print">
                        <img src="images/print.png" />
                    </div>
                    <div id="slide-block" class="slide-captcha-block"></div>
                </div>
            </div>
            <div class="col-md-6">
                <h3>请滑动图片验证</h3>
                <hr />
                <p>请将滑块移动到正确位置上</p>
                <br />
                <button id="check-btn" class="btn btn-primary">验证</button>
            </div>
        </div>
        <br />
    </div>

    <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
    <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    <script src="slide-captcha.js"></script>
    <script>
        $(document).ready(function () {
            var slider = new SliderUnlock("#slide-block");
            slider.init();

            $("#check-btn").on("click", function () {
                var sliderX = parseInt($("#slide-block").css("left"));
                var bgWidth = $(".slide-captcha-bg img").width();
                var printWidth = $(".slide-captcha-print img").width();

                $.post("SlideCaptchaHandler.ashx", { sliderX: sliderX, bgWidth: bgWidth, printWidth: printWidth }, function (res) {
                    if (res === "true") {
                        alert("验证通过!");
                    } else {
                        alert("验证失败,请重新尝试!");
                        slider.reset();
                    }
                });
            });
        });
    </script>
</body>
</html>

同时,我们还需要在服务器端添加相对应的SlideCaptchaHandler.ashx文件,用于处理用户提交的滑块位置信息,下面是一段示例代码:

using System;
using System.Web;
using System.Web.SessionState;

public class SlideCaptchaHandler : IHttpHandler, IRequiresSessionState
{
    public void ProcessRequest(HttpContext context)
    {
        HttpRequest request = context.Request;
        HttpResponse response = context.Response;

        int sliderX = Convert.ToInt32(request.Form["sliderX"]);
        int bgWidth = Convert.ToInt32(request.Form["bgWidth"]);
        int printWidth = Convert.ToInt32(request.Form["printWidth"]);

        if (CheckSlideCaptcha(sliderX, bgWidth, printWidth))
        {
            response.Write("true");
            response.End();
        }
        else
        {
            response.Write("false");
            response.End();
        }
    }

    public bool IsReusable
    {
        get { return false; }
    }

    private bool CheckSlideCaptcha(int sliderX, int bgWidth, int printWidth)
    {
        float offset = 10; // 容差范围
        float err = Math.Abs((float)bgWidth * (float)sliderX / (float)printWidth - (float)sliderX);
        if (err < offset)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

总结

本文介绍了如何使用C#和ASP.NET Web应用程序来实现滑动验证码拼图验证功能的开发。我们首先在前端页面中添加了验证码的HTML、CSS和Javascript代码,然后通过Javascript插件实现滑块的拖动功能。最后,我们在后端服务器中对用户提交的验证码进行验证,确保验证码输入的正确性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#滑动验证码拼图验证功能实现(SlideCaptcha) - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • C#实现的算24点游戏算法实例分析

    C#实现的算24点游戏算法实例分析 什么是算24点游戏? 算24点游戏是一种益智游戏,要求玩家根据给定的4个数字,通过加、减、乘、除等数学运算,最终得到结果为24的解。 实现算法需要掌握的知识 算数运算符:加法、减法、乘法、除法 基础数据类型:整型、浮点型 数组:存储4个数字 递归算法:遍历所有可能的数字组合 算法实现步骤 输入4个数字 遍历所有可能的数字排…

    C# 2023年6月1日
    00
  • C# 分支与循环介绍

    C#分支与循环介绍 在C#中,分支与循环结构是编写程序中十分常见的语法,能够实现程序流程控制,对于实现各种业务逻辑非常重要。本文将详细介绍C#中分支与循环的使用方法。 分支结构 C#中的分支结构主要包括 if/else 语句和 switch 语句。 if/else 语句 if/else 语句是一种基本的条件判断结构,通过判断指定的条件是否满足来决定程序执行的…

    C# 2023年5月15日
    00
  • C# 常量 结构体 委托

    常量 const double PI = 3.1415926; 常量名命名一般使用大写字母 枚举类型 开发一个游戏,游戏角色有法师(Mage)、射手(Archer)、刺客(Assassin)、坦克(Tank)、铺助(Support)、战士(Warrior),等不同类型。 ❓如何存储游戏角色 使用int类型 :创建一套规则,提前为各个类型角色绑定一个数字标识 …

    C# 2023年5月6日
    00
  • 详细介绍C# 泛型

    详细介绍C#泛型 什么是泛型? 泛型是C#语言中的一种数据类型,它允许我们写出能够适用于多种数据类型的代码。泛型作用于类、接口、方法等,可以大大提高代码的复用性和可读性。 泛型的语法与用法 泛型类 泛型类可以适用于多种数据类型,我们可以通过类名后加尖括号传入数据类型,例如: public class MyList<T> { private T[]…

    C# 2023年5月15日
    00
  • c#预处理指令分析

    下面是C#预处理指令分析的完整攻略: 1. 什么是C#预处理指令? 在C#中,预处理指令是在代码编译阶段执行的指令。它们用于告诉编译器在编译代码之前执行一些操作,例如在代码中插入一些代码、定义一些符号或在代码中包含其他文件等。 C#中的预处理指令以“#”开头,并且只能出现在代码文件的最顶部。一些常用的预处理指令包括:#define、#if、#else、#en…

    C# 2023年5月14日
    00
  • C#委托所蕴含的函数指针概念详细解析

    C#委托所蕴含的函数指针概念详细解析 什么是委托 委托(Delegate)是C#语言的一个关键词,它是一种类型,用于定义类的实例方法。委托类型可以看作一个函数指针,它可以引用到一个或多个方法,允许您将方法作为参数传递给其他方法,或将方法作为其返回类型返回。换句话说,委托定义了一种类型,该类型可以封装一个或多个方法并由其他代码调用。 C#类库中的许多方法都使用…

    C# 2023年6月7日
    00
  • ASP.NET Core DI手动获取注入对象的方法

    在ASP.NET Core中,依赖注入(DI)是一种常见的设计模式,它可以帮助我们管理应用程序中的对象和服务。在某些情况下,我们可能需要手动获取注入对象,而不是让DI容器自动注入它们。下面是ASP.NET Core DI手动获取注入对象的方法的完整攻略。 在构造函数中注入IServiceProvider 我们可以在构造函数中注入IServiceProvide…

    C# 2023年5月16日
    00
  • C#中字段、属性、只读、构造函数赋值、反射赋值的问题

    C#中包含多种方式来定义和初始化数据,主要有字段、属性、只读字段、以及构造函数和反射进行初始化的方式。这些方式有着不同的取值方式和赋值方式,本文将详细讲解这些问题,帮助开发者深入了解这些方式的差异。 字段 字段是最常见和最基本的一种数据定义方式,它是用来保存数据的一个变量。在C#中,字段一般包含访问修饰符、数据类型、以及一个标识符。在初始化时可以直接进行初始…

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部