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# File.SetAttributes(string path, FileAttributes attributes):设置指定文件或目录的属性

    File.SetAttributes(string path, FileAttributes attributes) 方法用于设置文件或文件夹的属性。它可以接受两个参数:第一个参数 path 是要设置属性的文件或文件夹的路径,第二个参数 attributes 是要设置的属性。attributes 参数可以是一个或多个 FileAttributes 枚举值的组…

    C# 2023年4月19日
    00
  • C#函数式编程中的惰性求值详解

    C#函数式编程中的惰性求值是一种重要的编程技巧,它指的是在执行程序时,只在需要的时候才计算数据或执行函数,而不是一开始就全部计算或执行。这种技巧可以提高程序的效率和性能,减少不必要的资源浪费。 惰性求值的实现方式主要有两种:生成器(yield)和延迟函数(Lazy)。其中,生成器是一种用于生成序列的特殊函数,通过调用yield语句来产生序列中的每个元素,延迟…

    C# 2023年5月15日
    00
  • C#简单实现发送socket字符串

    首先我们需要了解什么是Socket。Socket是用于网络通信的一种机制,可以实现进程之间的通信,也可以实现不同计算机之间的通信。它是一种可以处理网络通信数据的抽象概念,通常与TCP/IP协议族一起使用。 在C#中,我们可以使用Socket类实现网络通信。下面我们来详细讲解一下C#简单实现发送socket字符串的攻略。 第一步:创建Socket对象 我们可以…

    C# 2023年6月8日
    00
  • 事务在c#中的使用

    当我们在C#中使用事务时,通常需要以下几个步骤: 创建一个SqlConnection对象,并打开连接 创建一个SqlTransaction对象,并使用SqlConnection.BeginTransaction()方法开始一个事务 使用SqlCommand对象执行多个SQL语句,这几个语句都要在同一个事务中执行 在所有SQL语句执行完之后,使用SqlTran…

    C# 2023年5月15日
    00
  • c# 循环语句的使用方法

    下面是关于“C#循环语句的使用方法”的详细攻略。 什么是循环语句? 循环语句是编程中常用的一种控制语句,它可以重复执行同一段代码,以达到一定的效果。 在C#语言中,常用的循环语句有for循环、while循环、do-while循环和foreach循环。 for循环的使用方法 for循环是最为常用的一种循环语句,它的基本用法如下: for(初始化表达式; 条件表…

    C# 2023年6月7日
    00
  • SQLite之C#版 System.Data.SQLite使用方法

    下面是“SQLite之C#版System.Data.SQLite使用方法”的完整攻略,包含了使用方法和两条示例。 概述 SQLite 是一款轻量级的关系型数据库,不需要服务器就可以运行。而 System.Data.SQLite 则是 SQLite 的 C# 封装库,它提供了对 SQLite 数据库的访问和管理。 在本篇攻略中,我将介绍如何使用 System.…

    C# 2023年5月15日
    00
  • abp(net core)+easyui+efcore实现仓储管理系统——供应商管理升级之下(六十四)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+easyui+efcore实现仓储管理系统——解决方案介绍(二) abp(net core)+easyui+efcore实现仓储管理系统——领域层创建实体(三)…

    C# 2023年5月7日
    00
  • asp.net core 中优雅的进行响应包装的实现方法

    ASP.NET Core中优雅的进行响应包装的实现方法 在ASP.NET Core应用程序中,我们经常需要对响应进行包装,以便更好地处理错误和异常情况。本攻略将详细介绍如何在ASP.NET Core中优雅地进行响应包装。 响应包装 响应包装是指将响应数据包装在一个对象中,以便更好地处理错误和异常情况。通常,响应包装包括以下属性: 状态码:HTTP状态码,用于…

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