架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 47678|回复: 17

[ASP.NET] asp.net 阿里云滑块验证码测试[附源码]

[复制链接]
发表于 2018-4-2 13:30:39 | 显示全部楼层 |阅读模式
关于阿里云滑块验证的介绍:

滑动验证是服役于阿里巴巴人机识别第一线的验证码产品。用户通过简单的右滑交互,无需思考即可通过验证。

文档链接:https://help.aliyun.com/document_detail/66317.html

产品购买链接:https://yundun.console.aliyun.com/?p=afs#/person-machine

QQ截图20180402130549.jpg

阿里云滑块验证码大体流程如下:

网页加载完->获取到验证码->用户滑动滑块验证码->向阿里云接口获取csessionid、sig参数->带着csessionid、sig、nc_token、nc_login参数向我们后台接口请求->后台拿到参数去阿里云接口验证->返回给前端验证结果

效果图:

ali.gif

html代码如下:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <meta charset="utf-8" />
  5.     <!-- 国内使用 -->
  6.     <script type="text/javascript" charset="utf-8" src="//g.alicdn.com/sd/ncpc/nc.js?t=2015052012"></script>
  7.     <!-- 若您的主要用户来源于海外,请替换使用下面的js资源 -->
  8.     <!-- <script type="text/javascript" charset="utf-8" src="//aeis.alicdn.com/sd/ncpc/nc.js?t=2015052012"></script> -->
  9.     <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
  10. </head>
  11. <body>
  12.     <div><h1>阿里云滑动验证码测试</h1><p>by:http://www.itsvse.com</p></div>
  13.     <div><label>ip:</label><span id="ip"></span></div>
  14.     <br />
  15.     <div id="your-dom-id" class="nc-container"></div> <!--No-Captcha渲染的位置,其中 class 中必须包含 nc-container-->
  16.     <br />
  17.     <div><label>伪造csessionid:</label><input type="checkbox" id="weizao"/></div>
  18.     <br />
  19.     <div><label>测试结果:</label><span id="res"></span></div>

  20.     <script type="text/javascript">
  21.         var nc_token = ["FFFF0N00000000005A40", (new Date()).getTime(), Math.random()].join(':');
  22.         var NC_Opt =
  23.         {
  24.             renderTo: "#your-dom-id",
  25.             appkey: "xxxxxxx",
  26.             scene: "nc_login",
  27.             token: nc_token,
  28.             customWidth: 300,
  29.             trans:{"key1":"code0"},
  30.             elementID: ["usernameID"],
  31.             is_Opt: 0,
  32.             language: "cn",
  33.             isEnabled: true,
  34.             timeout: 3000,
  35.             times:5,
  36.             apimap: {
  37.                 // 'analyze': '//a.com/nocaptcha/analyze.jsonp',
  38.                 // 'get_captcha': '//b.com/get_captcha/ver3',
  39.                 // 'get_captcha': '//pin3.aliyun.com/get_captcha/ver3'
  40.                 // 'get_img': '//c.com/get_img',
  41.                 // 'checkcode': '//d.com/captcha/checkcode.jsonp',
  42.                 // 'umid_Url': '//e.com/security/umscript/3.2.1/um.js',
  43.                 // 'uab_Url': '//aeu.alicdn.com/js/uac/909.js',
  44.                 // 'umid_serUrl': 'https://g.com/service/um.json'
  45.             },
  46.             callback: function (data) {
  47.                 window.console && console.log(nc_token)
  48.                 window.console && console.log(data.csessionid)
  49.                 window.console && console.log(data.sig)
  50.                 var csessionid = data.csessionid;
  51.                 if ($("#weizao").prop("checked"))
  52.                 {
  53.                     csessionid = "xxxxxxxxxxxxx";
  54.                 }
  55.                 var par = "SessionId=" + csessionid + "&Sig=" + data.sig + "&Token=" + nc_token + "&Scene=nc_login";
  56.                 $.get("/test.ashx?" + par, function (res) {
  57.                     //alert(res.msg);
  58.                     $("#res").html(res.msg);
  59.                 });
  60.             }
  61.         }
  62.         var nc = new noCaptcha(NC_Opt)
  63.         nc.upLang('cn', {
  64.             _startTEXT: "请按住滑块,拖动到最右边",
  65.             _yesTEXT: "验证通过",
  66.             _error300: "哎呀,出错了,点击<a href="javascript:__nc.reset()">刷新</a>再来一次",
  67.             _errorNetwork: "网络不给力,请<a href="javascript:__nc.reset()">点击刷新</a>",
  68.         });
  69.         $(function () {
  70.             $.get("/ip.ashx", function (data) {
  71.                 $("#ip").html(data.msg);
  72.             });
  73.         });
  74.     </script>
  75. </body>
  76. </html>
复制代码
test.ashx接口代码如下:

  1. using Aliyun.Acs.afs.Model.V20180112;
  2. using Aliyun.Acs.Core;
  3. using Aliyun.Acs.Core.Profile;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Web;
  8. using System.Web.Routing;

  9. namespace ali_captcha
  10. {
  11.     /// <summary>
  12.     /// test 的摘要说明
  13.     /// </summary>
  14.     public class test : IHttpHandler
  15.     {
  16.         private static readonly string accessKeyId = System.Configuration.ConfigurationManager.AppSettings["accessKeyId"];
  17.         private static readonly string secret = System.Configuration.ConfigurationManager.AppSettings["secret"];
  18.         private static readonly string AppKey = System.Configuration.ConfigurationManager.AppSettings["AppKey"];
  19.         private static IAcsClient client = null;
  20.         static test()
  21.         {
  22.             IClientProfile profile = DefaultProfile.GetProfile("cn-hangzhou", accessKeyId, secret);
  23.             client = new DefaultAcsClient(profile);
  24.             DefaultProfile.AddEndpoint("cn-hangzhou", "cn-hangzhou", "afs", "afs.aliyuncs.com");
  25.         }

  26.         public bool IsReusable => false;

  27.         public void ProcessRequest(HttpContext context)
  28.         {
  29.             context.Response.ContentType = "application/json;charset=utf-8";
  30.             
  31.             AuthenticateSigRequest request = new AuthenticateSigRequest();
  32.             request.SessionId = context.Request.QueryString["SessionId"];// 必填参数,从前端获取,不可更改,android和ios只变更这个参数即可,下面参数不变保留xxx
  33.             request.Sig = context.Request.QueryString["Sig"];// 必填参数,从前端获取,不可更改
  34.             request.Token = context.Request.QueryString["Token"];// 必填参数,从前端获取,不可更改
  35.             request.Scene = context.Request.QueryString["Scene"];// 必填参数,从前端获取,不可更改
  36.             request.AppKey = AppKey;// 必填参数,后端填写
  37.             request.RemoteIp = IPHelper.GetRemoteIp(context.Request.RequestContext);// 必填参数,后端填写

  38.             try
  39.             {
  40.                 AuthenticateSigResponse response = client.GetAcsResponse(request);// 返回code 100表示验签通过,900表示验签失败
  41.                 if (response.Code == 100)
  42.                 {
  43.                     context.Response.Write("{"ret":true,"msg":"ok"}");
  44.                 }
  45.                 else {
  46.                     //{"ret":true,"msg":"ok"}
  47.                     context.Response.Write("{"ret":false,"msg":"no"}");
  48.                 }
  49.                
  50.                 // TODO
  51.             }
  52.             catch (Exception e)
  53.             {
  54.                 Console.WriteLine(e.ToString());
  55.             }
  56.         }

  57.     }

  58.    
  59. }
复制代码
ip.ashx接口代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Routing;

  6. namespace ali_captcha
  7. {
  8.     /// <summary>
  9.     /// ip 的摘要说明
  10.     /// </summary>
  11.     public class ip : IHttpHandler
  12.     {

  13.         public void ProcessRequest(HttpContext context)
  14.         {
  15.             context.Response.ContentType = "application/json;charset=utf-8";
  16.             string ip = IPHelper.GetRemoteIp(context.Request.RequestContext);
  17.             context.Response.Write("{"ret":true,"msg":"" + ip + ""}");
  18.         }

  19.         public bool IsReusable => true;
  20.     }

  21.    
  22.     public class IPHelper
  23.     {
  24.         /// <summary>
  25.         /// 是否获取真实ip
  26.         /// </summary>
  27.         private static readonly bool IsRemoteIp = Convert.ToBoolean(System.Configuration.ConfigurationManager.AppSettings["IsRemoteIp"]);

  28.         /// <summary>
  29.         /// 获取客户端IP
  30.         /// </summary>
  31.         /// <param name="req"></param>
  32.         /// <returns></returns>
  33.         public static string GetRemoteIp(RequestContext req)
  34.         {
  35.             if (!IsRemoteIp) return "8.8.8.8";//返回一个假的ip
  36.             string result = req.HttpContext.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
  37.             if (string.IsNullOrEmpty(result))
  38.             {
  39.                 result = req.HttpContext.Request.ServerVariables["REMOTE_ADDR"];
  40.             }
  41.             if (string.IsNullOrEmpty(result))
  42.             {
  43.                 result = req.HttpContext.Request.UserHostAddress;
  44.             }
  45.             if (string.IsNullOrEmpty(result))
  46.             {
  47.                 result = "0.0.0.0";
  48.             }
  49.             return result;
  50.         }
  51.     }
  52. }
复制代码


在后台验证的时候,有6个参数,其中4个参数是前台获取的,2个参数是后台填写,如下:

  1. request.SessionId = context.Request.QueryString["SessionId"];// 必填参数,从前端获取,不可更改,android和ios只变更这个参数即可,下面参数不变保留xxx
  2.             request.Sig = context.Request.QueryString["Sig"];// 必填参数,从前端获取,不可更改
  3.             request.Token = context.Request.QueryString["Token"];// 必填参数,从前端获取,不可更改
  4.             request.Scene = context.Request.QueryString["Scene"];// 必填参数,从前端获取,不可更改
  5.             request.AppKey = AppKey;// 必填参数,后端填写
  6.             request.RemoteIp = IPHelper.GetRemoteIp(context.Request.RequestContext);// 必填参数,后端填写
复制代码


RemoteIp参数,我从阿里云官方文档,一直没有找到该参数的解释。。。。。从字面意思,我们可以看出该参数是请求者的ip地址。。。

web.config有一项配置:

  1. <add key="IsRemoteIp" value="false"/>
复制代码


IsRemoteIp为true时,我就返回伪造的ip,也就是8.8.8.8,如果为false的时候,我们就返回用户的真实ip,如下图:

QQ截图20180402131918.jpg

测试结果,无论是伪造的请求ip,还是真实的请求者ip,都不影响验证结果,由此表明,RemoteIp对验证结果几乎应该没有任何影响。。。。

如果伪造csessionid的话,验证是失败的,如果伪造Token的话,验证也是失败的!

下图是伪造token的值:

QQ截图20180402132653.jpg

(完)

源码下载:

游客,如果您要查看本帖隐藏内容请回复





上一篇:[Windows API]供C#查询API的使用代码助手[附源码]
下一篇:挥别Windows时代!微软解散工程师团队,主攻云服务
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2019-1-11 11:45:01 | 显示全部楼层
您好,阿里云滑块验证码这块有需求,怎么联系你,我QQ 132.188.6153
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2019-1-11 11:27:48 | 显示全部楼层
一直在找这块的资料,希望可以研究下
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2019-7-25 10:39:16 | 显示全部楼层
thanks
这个阿里的文档真的有点水
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2018-4-4 14:13:44 | 显示全部楼层
拿来看看
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2019-1-7 09:46:47 | 显示全部楼层
感谢分享!
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2019-1-11 12:47:27 | 显示全部楼层
学习学习
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2019-2-28 17:12:10 | 显示全部楼层
学习了,感谢分享
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2019-4-13 16:05:13 | 显示全部楼层
厉害厉害厉害厉害厉害
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2019-4-15 23:54:50 | 显示全部楼层
look look look
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2019-4-16 20:45:36 | 显示全部楼层
学习一下
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2025-2-16 05:55

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表