Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >防短信验证码轰炸怎么防_接口幂等性解决方案

防短信验证码轰炸怎么防_接口幂等性解决方案

作者头像
全栈程序员站长
发布于 2022-11-07 07:43:59
发布于 2022-11-07 07:43:59
3.3K00
代码可运行
举报
运行总次数:0
代码可运行

企业短信防火墙【新昕科技】+短信验证码【中昱维信】Java应用实例

一、企业短信防火墙的实现

1.1 简介

新昕科技在交易反欺诈核心上, 通过AI快速学习机制,结合国际领先的设备指纹技术,首次推出无需图形验证码机制的企业短信防火墙,三步完成下载对接。

1.2 第一步:获取防火墙帐号密钥

进入 防火墙控制台,在左侧导航栏选择【网站管理】,进入网站管理页面,单击【发到邮箱】接收密钥。

1.3 第二步:下载防火墙服务器

前往新昕科技官网,在顶部导航栏选择【解决方案】>【下载中心】,进入下载中心页面,找到短信防火墙服务器安装包,点击【下载链接】即可下载。

1.4 第三步:业务系统前后端接入

web 前端接入: 前端接入: Web前端接入文档 Java 在页面合适的位置(标签内)加入以下代码引入JS文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script type="text/javascript" src="/NxtJsServlet"></script>

PHP 在页面合适的位置(标签内)加入以下代码引入JS文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script id="finger" type="text/javascript" src="/nxt_inc/nxt_front.php"></script>

后端接入: Java 修改配置(和业务系统同系统不需要修改): newxtc.ini (存放位置:”/WEB-INF/classes/newxtc.ini”) 修改参数(fireWareUrl)–> fireWareUrl=http://localhost:7502 短信下发

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public RetMsg smsSend(HttpServletRequest request, HttpServletResponse response, String clientMobile) { 

RetMsg retMsg = new RetMsg(-1, "系统异常");
FwClient fwClient = new FwClientImpl();
try { 

// 1 调用【短信防火墙】短信发送请求
HashMap < String, Object > paramMap = fwClient.getSendReq(request, clientMobile);
String jsonReq = fwClient.execReq(paramMap);
String smsSendRet = fwClient.getRetVaule(jsonReq, "riskResult");
if("REJECT".equals(smsSendRet)) { 

retMsg.setRet(3);
retMsg.setMsg("请求过于频繁");
}
else { 

// 业务 TODO
// 业务调用短信接口 TODO
// 调用短信接口 结束
if(smsRetMsg != null && smsRetMsg.getRet() == 0) { 

// 2 调用【短信防火墙】成功结果
fwClient.execSucc(paramMap);
logger.debug("send succ");
retMsg.setRet(0);
retMsg.setMsg("发送验证码成功");
}
else { 

// 2 调用【短信防火墙】失败结果
SmsVerifyCache.getInstance().remove(clientMobile);
fwClient.execFail(paramMap);
retMsg.setRet(-1);
retMsg.setMsg("发送验证码失败");
}
}
}
catch(Exception e) { 

for(StackTraceElement elment: e.getStackTrace()) { 

logger.error(elment.toString());
}
}
return retMsg;
}

短信验证

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public RetMsg smsVerify(HttpServletRequest request, HttpServletResponse response, String clientMobile, String smsVerifyCode) { 

FwClient fwClient = new FwClientImpl();
RetMsg retMsg = new RetMsg(-1, "系统异常");
if(smsVerifyCode == null || smsVerifyCode.isEmpty()) { 

retMsg.setRet(1);
retMsg.setMsg("输入验证码为空");
}
else { 

// 1 调用【短信防火墙】验证请求
HashMap < String, Object > paramMap = fwClient.getVerifyReq(request, clientMobile); // 请求防火墙
String jsonReq = fwClient.execReq(paramMap);
// 报文处理
String smsSendRet = fwClient.getRetVaule(jsonReq, "riskResult");
if("REJECT".equals(smsSendRet)) { 

retMsg.setRet(3);
retMsg.setMsg("请求过于频繁");
}
// 业务 TODO
if(cacheSmsVerify != null && cacheSmsVerify.getVerifyCode() != null && !cacheSmsVerify.getVerifyCode().isEmpty()) { 

if(cacheSmsVerify.getVerifyCode().equals(smsVerifyCode)) { 

retMsg.setRet(0);
retMsg.setMsg("验证成功");
}
else { 

retMsg.setRet(1);
retMsg.setMsg("验证码错误");
}
}
else { 

retMsg.setRet(-9);
retMsg.setMsg("验证码超时");
}
if(retMsg.getRet() == 0) { 

// 2 调用【短信防火墙】成功结果
fwClient.execSucc(paramMap);
}
else { 

// 2 调用【短信防火墙】失败结果
fwClient.execFail(paramMap);
}
}
return retMsg;
}

1.5丰富可视化实时风险大盘,

防御拦截数据尽收眼底,实时查看当日数据详情与近期风险趋势。 通过风控数据看板,可查看1-30天的验证情况、风控拦截情况以及验证事件触发的AI模型情况。 进入防火墙控制台,在左侧导航栏选择【风险大盘】,进入风险大盘页面。

二、短信验证码的实现

2.1 简介

企业防火墙只能防止机器人脚本恶意攻击网站或App,如何识别到是本人操作的,还需要结合短信验证码进一步进行身份识别。本文以注册为例,在SpringMVC+Spring+Mybatis框架的基础上完成该短信验证码功能。

发送短信验证码的原理是:随机生成一个4-6位数字,将该4-6位数字保存到session当中,客户端通过sessionid判断对应的session,用户输入的验证码再与session记录的验证码进行比较。

一般的第三方短信平台都会有他们自己的短信接口,只要读懂他们的接口稍作稍作改变就能满足自己的需求。

首先将短信平台接口代码列出:这里需要依赖的三个通用jar包 commons-logging-1.1.1.jar,commons-httpclient-3.1.jar,commons-codec-1.4.jar。

2.2 短信服务商接入

开发短信验证码功能通常是采用第三方短信服务商的服务,作为短信下发渠道,以这个网站短信验证码为例:上海中昱文化传播有限公司【简称中昱维信】成立于2010年,是一家从事增值电信业务和软件开发服务的科技企业。获取试用验证码条数和验证码接口文档,进行接口对接前需首先进行准备工作:

短信签名报备

短信验证码需预先设置短信签名,签名会经过平台审核,审核通过后才可作为接口参数使用。

短信验证码模板报备

短信验证码需预先设置短信模板,签名会经过平台审核,审核通过后才可作为接口参数使用。

获取appId和appKey

为保障接口安全,短信验证码接口,使用多重加密的appId和appKey进行身份鉴权和校验,这两个字段作为验证码接口必填项,建议预先获取到,获取appKey时需要对注册人进行身份校验。

至此,短信服务商验证码接口已经准备完毕,接下来可以进行业务场景,进行短信验证码服务的开发,下面展示通用的短信验证码接入流程。 2.3 短信验证码代码实现

短信验证码前端较为简单,主要就是发送验证码和校验验证码两个ajax请求,结合上面的滑动验证可实现双重验证。前端页面结构如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   <html>
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=0">
<!-- 国内使用 -->
<link rel="stylesheet" href="https://cdn.staticfile.org/amazeui/2.7.2/css/amazeui.min.css">
<script type="text/javascript" charset="utf-8" src="https://cdn.staticfile.org/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
<div class="am-form">
<div class="am-form-group">
<label for="tel">请输入手机号</label>
<input type="text" class="" id="tel" placeholder="请输入手机号">
</div>
<div id="__nc" style="height: 70px">
<div id="nc"></div>
</div>
<div class="am-form-group">
<label for="code">请输入验证码</label>
<input id="code" type="text" placeholder="请输入验证码">
</div>
<button type="button" class="am-btn am-btn-primary">提交</button>
</div>
<script> var nc_token = ["CF_APP_1", (new Date()).getTime(), Math.random()].join(':'); var nc=NoCaptcha.init({ 
 renderTo: '#nc', appkey: 'CF_APP_1', scene: 'register', token: nc_token, trans: { 
"key1": "code200"}, elementID: ["usernameID"], is_Opt: 0, language: "cn", timeout: 10000, retryTimes: 5, errorTimes: 5, inline:false, apimap: { 
 // 'analyze': '//a.com/nocaptcha/analyze.jsonp', // 'uab_Url': '//aeu.alicdn.com/js/uac/909.js', }, bannerHidden:false, initHidden:false, callback: function (data) { 
 window.console && console.log(nc_token) window.console && console.log(data.csessionid) window.console && console.log(data.sig); var tel = $('#tel').val(); $.ajax({ 
 url: "sendCode", type: "post", data: { 
 tel:tel }, dataType: "json", success: function (result) { 
 if (result.code == 0) { 
 alert("验证码已发送!", "green") } else { 
 alert("发送失败,请稍后再试!"); nc.reset() } }, error: function () { 
 alert("系统繁忙,请稍后再试!", "red") } }) }, error: function (s) { 
 } }); NoCaptcha.setEnabled(true); nc.reset();//请务必确保这里调用一次reset()方法 NoCaptcha.upLang('cn', { 
 'LOADING':"加载中...",//加载 'SLIDER_LABEL': "请向右滑动验证",//等待滑动 'CHECK_Y':"验证通过",//通过 'ERROR_TITLE':"非常抱歉,这出错了...",//拦截 'CHECK_N':"验证未通过", //准备唤醒二次验证 'OVERLAY_INFORM':"经检测你当前操作环境存在风险,请输入验证码",//二次验证 'TIPS_TITLE':"验证码错误,请重新输入"//验证码输错时的提示 }); </script>
</body>
</html>

后端代码主要职责是两方面:1)接收生成验证码请求,生成验证码存入session中;2)接收校验验证码的请求,将存入session的验证码去除,与前端输入的验证码进行比对,比对一致则通过并进行视图转发,比对不一致则告知前端错误原因。主要实现代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    HttpSession session = req.getSession();
// 验证码有效时间
session.setMaxInactiveInterval(600);
try { 

Integer num = RandNumber.getNum();
// 发送验证码通道
Sendsms.Send(num, phone);
session.setAttribute(phone, num);
return R.ok();
} catch (Exception e) { 

e.printStackTrace();
logger.error(e.getMessage());
return R.error("fasle");
}
import java.io.Exception;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;
public class Sendsms { 

private static String Url = "https://vip.veesing.com/smsApi/verifyCode";
// 发送短信验证码
public static void Send(Integer num, String mobile) { 

try { 

HttpClient client = new HttpClient();
PostMethod method = new PostMethod(Url);
client.getParams().setContentCharset("UTF-8");
method.setRequestHeader("ContentType", "application/x-www-form-urlencoded;charset=UTF-8");
NameValuePair[] data = { 
 
new NameValuePair("appId", "*********"),
new NameValuePair("appKey", "**********"), 
new NameValuePair("templateId", "*******"), 
new NameValuePair("mobile", "*******"),
new NameValuePair("variables", "*******") 
};
method.setRequestBody(data);
client.executeMethod(method);
String submitResult = method.getResponseBodyAsString();
System.out.println(submitResult);
} catch (Exception e) { 

e.printStackTrace();
}
}
}
HttpSession session = req.getSession();
String yzm = String.valueOf(session.getAttribute(username));
logger.info(yzm);
if (yzm == null) { 

return R.error("验证码错误");
}
if (yzm != null && !verifycode.equals(yzm)) { 

return R.error("验证码错误");
}

以上就是Java实现企业短信防火墙与短信验证码的全部实现,基于此案例,可实现安全性高、用户体验好的登录注册+企业短信防火墙+短信验证码功能。

原地址:短信接口被恶意调用?【新昕科技】企业短信防火墙+【中昱维信】短信验证码【Java应用实例】

如有问题可在留言区展开讨论哦,欢迎转发,如有改动请站内信通知本文作者,谢谢!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/184211.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月9日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JAVA实现利用第三方平台发送短信验证码
前段时间自己做的一个小项目中,涉及到用短信验证码登录、注册的问题,之前没涉及过这一块,看了别人的博客其实也是似懂非懂的,现在就将自己做的利用第三方短信平台来发送验证码这个功能记下来。
用户7353950
2022/06/23
6.2K0
JAVA实现利用第三方平台发送短信验证码
短信轰炸是怎么做的?
小卷谷歌了几个在线短信轰炸的网站,找了几个后才终于找到个能用的,如图启动后,小卷的手机开始收到各种乱七八糟的短信了。看了半天,都是些验证码。。。
卷福同学
2023/04/28
7.1K0
短信轰炸是怎么做的?
Spring Security--短信验证码详解
在这一步我们需要写一个controller接收用户的获取验证码请求。注意:一定要为“/smscode”访问路径配置为permitAll访问权限,因为spring security默认拦截所有路径,除了默认配置的/login请求,只有经过登录认证过后的请求才会默认可以访问。
大忽悠爱学习
2021/12/07
1.6K0
Spring Security--短信验证码详解
java手机发送短信验证码
找到一个短信验证平台:这里用的是:中国网建SMS短信平台。 网址:http://sms.webchinese.cn/api.shtml 导入下列包 测试代码: import java.io.IOExc
斯文的程序
2019/11/07
11.5K0
java手机发送短信验证码
java实现短信验证码登陆 demo
我们使用的API平台是:秒嘀云: https://sms.miaodiyun.com/login.html
故久
2019/09/29
5.5K0
java实现短信验证码登陆 demo
thinkPHP框架实现的短信接口验证码功能示例
本文实例讲述了thinkPHP框架实现的短信接口验证码功能。分享给大家供大家参考,具体如下:
PHP开发工程师
2021/06/03
3.4K0
JeecgBoot 短信验证码接口,如何实现防刷机制?
加签配置很简单,直接将需要控制的接口加到 yml 的参数 jeecg.signUrls 中即可。
JEECG
2024/07/06
2840
JeecgBoot 短信验证码接口,如何实现防刷机制?
android短信验证码方案,Android之短信验证码
3.配置AndroidManifest.xml文件,在Application节点中加入以下代码:
全栈程序员站长
2022/09/15
11.3K0
android短信验证码方案,Android之短信验证码
[456]selenium触发不同接口短信验证码
参考:https://www.jianshu.com/p/555b0b424e06
周小董
2023/10/10
5030
短信验证码登录你会吗?
今日主题:短信验证码登录 简介 相信大家在很多网站进行登录的时候,都见过短信验证码登录吧,那现在就来看看怎么实现吧 原理说明 首先我们需要一个短信发送接口,前端发送手机号码到后端,后端随机生成一个验证
java后端指南
2021/05/13
1.7K0
短信验证码登录你会吗?
一文带你看透短信验证码
短信验证码应用于我们生活、工作的方方面面,比如注册登录账号、支付订单、修改密码等等。验证码短信主要出于安全的考虑,防止应用/网站被恶意注册,恶意攻击,对于网站、APP而言,大量的无效注册,重复注册,甚至是恶意攻击很令人头痛。
不是海碗
2023/02/06
2.7K0
一文带你看透短信验证码
android短信验证码方案,Android开发之属于你的短信验证码(一)
最近工作又有新需求,要求用户在注册的时候需要通过手机验证码,这样做的目的是防止用户通过一个邮箱来随便的注册,那么好,今天我们就 一起来学习一下Android中的短信验证码这一个知识点。如有谬误,欢迎批评指正,如有疑问欢迎留言,谢谢
全栈程序员站长
2022/09/16
8.7K0
android短信验证码方案,Android开发之属于你的短信验证码(一)
android 短信验证码的实现
进入后在上面有应用是让选择android还是ios 之类的,点击下载SDK –选择免费短信验证SDK,
全栈程序员站长
2022/09/16
2.8K0
android 短信验证码的实现
网络爬虫实现发送短信验证码
前言:今天要总结的是如何用程序来实现短信发送功能。但是呢,可能需要我们调用一些api接口,我会详细介绍。都是自己学到的,害怕忘记,所以要总结一下,让写博客成为一种坚持的信仰。废话不多说,我们开始吧!
兰舟千帆
2022/07/16
3.1K0
网络爬虫实现发送短信验证码
SpringBoot 整合 发送互亿无线短信验证码
以下 代码需要 Jsoup 支持 自己去 想了解 去看我 Jsoup与xml的文章 https://www.zanglikun.com/1279.html
收心
2022/01/17
1.5K0
SpringBoot 整合 发送互亿无线短信验证码
引入QQ邮箱发送验证码进行安全校验
在我们进行登录注册等等敏感操作时,为了保证用户信息的安全性,常常会碰到需要接收手机短信验证码进行验证的场景,虽然它的安全系数相对较高,但是引入手机验证码使用需要进行付费,显然不适合我们个人项目的学习,于是我们可以尝试使用各大平台的提供的邮件服务进行安全校验,步骤基本一致,本处我们采用QQ邮箱进行演示。
观止study
2024/02/10
7430
日常划水:短信验证码开发实例
我一生的文章都会放在这里,我的博客,我希望每一行代码,每一段文字都能帮助你。 https://github.com/CrazyCodes...
猿哥
2019/07/10
8410
短信验证码登录
3.进入leancloud官网https://leancloud.cn/ a.点击右上角控制台
PHP开发工程师
2021/04/19
14K0
短信验证码登录
一次短信验证码整改实验
这个短信验证码在并发量非常大的情况下有可能会失效,后续会进行整改升级,保证线程安全
阿东
2021/08/16
1.1K0
短信验证码登录流程思路及详细步骤
来源: blog.csdn.net/classabcd/article/details/82464582
Java小咖秀
2021/07/12
3.7K0
相关推荐
JAVA实现利用第三方平台发送短信验证码
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验