「java接口怎么防刷」java如何保证接口调用安全性
今天给各位分享java接口怎么防刷的知识,其中也会对java如何保证接口调用安全性进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
java接口怎么防止被刷
为什么会有人要刷接口?
1、牟利
黄牛在 12306 网上抢票再倒卖。
2、恶意攻击竞争对手
如短信接口被请求一次,会触发几分钱的运营商费用,当量级大了也很可观。
3、压测
用 apache bench 做压力测试。
4、当程序员无聊的时候
什么是刷接口的"刷"字?
1、次数
多
2、频率
频繁,可能 1 秒上千次
3、用户身份难以识别
可能会在刷的过程中随时换浏览器或者 ip
判断接口是否是恶意?
根据用户粒度,如果该用户符合上面提到的“刷”的概念,就是恶意的。
用户粒度如何划分?
1、当前网页
优点:无
缺点:没有任何意义,一刷新页面用户的身份就变了
2、session
优点:伪造成本一般(可以理解成一个浏览器对应了一个用户)
缺点:当用户手动清除 cookie 的时候即失效
3、ip
优点:伪造成本高
缺点:要考虑一个公司、一个小区的人一般会共享一个 ip,所以适当的要放宽对单一 ip 的请求限制
ip 信息是存在请求头里的,而 https 对请求本身做了加密,可以防止 ip 信息被伪造或篡改。所以推荐服务器采用 https 传输。
当知道接口是恶意请求时,我们该怎么做?
一、直接拒绝访问
优点:简单粗暴
缺点:简单粗暴
二、返回“操作频繁”的错误提示
优点:提示友好
缺点:会把确实是操作比较频繁的真实用户拦截
三、验证码
1、图形

2、滑块

3、找不同

优点:精准识别请求是真人还是机器发出的,二次筛选出真正的用户
缺点:不够人性化,用户操作时间长、体验差
4、限制ip
客户端请求的时候 , 把ip记录下来,每次访问这个ip访问次数+1,如果查过制定次数,把这个ip拉黑
实例:
安全问题是长期的和攻击者斗智斗勇的问题,没有一劳永逸的解决方案,不断交锋,不断成长
后台登陆防刷、防爆破以及正常的登录校验
前几天项目上需要对一个正常登陆接口,以及忘记密码的接口进行防爆破处理,这里我用nginx,redis,以及前端的一些简单的图形拖动来做一个简单的安全机制,可能有不完善的地方,大家可以提出来意见。
其实一个接口是无法完全避免接口爆破的,区分人和机器或许可以使用谷歌的图片验证机制,但是我们一般简单项目没必要做那么复杂的,只需要确保不正常的访问频率不会爆破出我们的用户信息,以及让我们机器的处理流量保存在可控范围即可。
验证码只能60s获取一次 并且3小时内只能获取三次,超过次数提升获取频繁,稍后再试。
正常登录1小时内失败6次账号自动锁定,1小时之后自动解锁。
获取验证码无论输入的账号存在不存在均显示发送成功,但是实际不存在的账号不会正常发送。
4.登录失败,账号不存在密码错误不再提示账号不存在等等,而是统一显示账号或密码错误。5.忘记密码前端部分增加滑动校验,60倒计时无法点击发送验证码。前后端共同校验。6.技术限制系统此接口的访问频率。
前端部分可以在这个地址看看这几个简单的组件,这次我们就使用最简单的,滑动拖动即可。
drag-verify
ref="dragVerify"
:width="width"
:height="height"
text="请按住滑块拖动"
successText="验证通过"
:isPassing.sync="isPassing"
background="#ccc"
completedBg="rgb(105, 231, 251)"
handlerIcon="el-icon-d-arrow-right"
successIcon="el-icon-circle-check"
@passcallback="passcallback"
/drag-verify
用户滑动之后需要加上60s倒计时,这块我们使用定时器实现即可,以及邮箱和手机号的正确性校验,不正确则弹窗提示。
this.countDown = 60;
timer = setInterval(() = {
if (this.countDown - 1 = 0) {
this.countDown -= 1;
} else {
clearInterval(timer);
timer = null;
}
}, 1000);
el-button disabled type="text" v-show="time 0"
{{ time 0 ? `${time}` : "" }} s之后重试/el-button
验证邮箱手机号可以使用正则校验进行。
mobileReg = /^1\d{10}$/;
emailReg = /^([A-Za-z0-9_\-\.\u4e00-\u9fa5])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,8})$/;
前端大体思路就是,进行滑块验证,拖到右边之后,60s之内无法操作,60s到期之后自动复原,
显示倒计时时间。这个只能防止用户在页面上多次点击,造成一个验证的假象,如果直接对后端接口爆破,则无法避免。
这是大概的流程图,图中还有些细节问题下面慢慢讲解。
这块本来我想用java或者kotlin写,但是历史项目用go写的,重写的话还有其他一些改动,所以继续使用golang完成这部分逻辑。
先定义一个结构体,然后我们来分析下需要哪些字段来实现我们的业务。
type CommonLogin struct {
CreateTime time.Time
LastTime time.Time
Times uint8
}
// 登录的前置校验
func beforeCommonLoginValid(key string, r *redis.Client, field string) (bool, error) {
// redis中是否存在账号
result, err := r.HExists(field, key).Result()
if err != nil {
fmt.Printf("从redis中获取用户账户失败,账户为: %s", key)
return false, err
}
if result {
login := CommonLogin{}
// 存在账号 说明之前登录失败过 且自从上次失败未登录成功过
commonLogin, err := r.HGet(field, key).Result()
if err != nil {
return false, err
}
json.Unmarshal([]byte(commonLogin), login)
if login.Times 6 {
return true, nil
}
// 是否在1小时内失败了6次
if login.Times = 6 {
// 否
if time.Now().Sub(login.CreateTime) time.Hour*1 {
// 连续输错6次时长大于1小时 解锁
r.HDel(field, key)
return true, nil
} else {
fmt.Printf("用户%s于1小时之内连续登录失败6次,账号锁定,1小时后重试。", key)
return false, nil
}
}
}
// redis中不存在重试记录
return true, nil
}
在所有的登录判断的出口,调用此方法即可,例如用户名密码错误,acl校验未通过等等。
其实原理差不多,唯一的区别就是多了一个获取验证码时间间隔校验。
func beforeForgotPasswordValid(key string, r *redis.Client, field string) (bool, error) {
// redis中是否存在账号
result, err := r.HExists(field, key).Result()
if err != nil {
fmt.Printf("从redis中获取用户账户失败,账户为: %s", key)
return false, err
}
login := CommonLogin{}
// 账号存在
if result {
commonLogin, err := r.HGet(field, key).Result()
if err != nil {
return false, err
}
json.Unmarshal([]byte(commonLogin), login)
// 获取验证码间隔时长不能小于60s
if time.Now().Sub(login.LastTime) time.Second*60 {
fmt.Printf("用户获取验证码间隔小于60s")
return false, nil
}
if login.Times 3 {
return true, nil
}
// 是否在1小时内获取了3次
if login.Times = 3 {
// 否
if time.Now().Sub(login.CreateTime) time.Hour*3 {
// 连续输错6次时长大于1小时 解锁
r.HDel(field, key)
return true, nil
} else {
fmt.Printf("用户%s于3小时之内连续获取验证码3次,账号锁定,3小时后重试。", key)
return false, nil
}
}
}
return true, nil
}
// 更新获取验证码的时间
func afterForgotPasswordValid(key string, r *redis.Client, field string) {
login := CommonLogin{}
commonLogin, _ := r.HGet(field, key).Result()
json.Unmarshal([]byte(commonLogin), login)
// 验证码发送成功
result, _ := r.HExists(field, key).Result()
if result {
login.Times = login.Times + 1
login.LastTime = time.Now()
data, _ := json.Marshal(login)
r.HSet(field, key, data)
} else {
login.Times = 1
login.LastTime = time.Now()
login.CreateTime = login.LastTime
data, _ := json.Marshal(login)
r.HSet(field, key, data)
}
}
nginx是一个非常强大的中间价,在安全方面,我们可以用它来限制来自于同一机器的访问频率,可以做黑名单功能等等,当然有人会说ip代{过}{滤}理池之类的,我们此次演示的只是简单demo,恶意攻击当然需要专业防护了。
具体google一下,看这两篇官方文档。
具体的配置其实很简单了。
限制远程同ip访问频率。
limit_req_zone$binary_remote_addrzone=perip:10mrate=1r/s;
$binary_remote_addr 表示通过remote
addr这个标识来做限制,“binary ”的目的是缩写内存占用量,是限制同一客户端ip地址
zone=one:10m表示生成一个大小为10M,名字为one的内存区域,用来存储访问的频次信息
rate=1r/s表示允许相同标识的客户端的访问频次,这里限制的是每秒1次,还可以有比如30r/m的
location ^~ /api/xxx {
limit_req zone=perip nodelay;
limit_req_status 503;
proxy_pass http://正确地址;
}
上面配置意思就是超过频率返回503,服务不可用。
使用jmeter进行压力测试:1s 10个请求,我们预期只有1个请求成功,其他的返回503.
java后台接口 怎么防止重复提交
防止重复提交的方法很多,例如:
1、Meta法
在你的表单页里HEAD区加入这段代码:
META HTTP-EQUIV="pragma" CONTENT="no-cache"
META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate"
META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT"
2、令牌法
生成一个令牌保存在用户session中,在form中加一个hidden域,显示该令牌的值,form提交后重新生成一个新的令牌,将用户提交的令牌和session中的令牌比较,如不同则为重复提交。
3、禁用按钮法
input type="button" value="提交" onclick="this.disabled=true;this.form.submit()"
4、struts配置法
修改struts-config.xml文件,在action里面有一个redirect重新定向的属性,struts中默认的是false,添加这个属性,改成true,在forword中写上要跳转页面的绝对或者相对地址就行了
修改如下:
action-mappings
action attribute="newsActionForm" name="newsActionForm" input="/addnews.jsp" path="/newsAction" parameter="method" scope="request" type="com.yongtree.news.action.NewsAction"
forward name="list" path="/listnews.jsp" redirect="true"/forward
forward name="error" path="/addnews.jsp"/forward
/action
/action-mappings
怎么防止刷票?
问题一:怎样防止投票项目被刷票 无法防止,是你你也会刷
问题二:微信里的投票怎么防止刷票 九鲸科技开发的微信投票系统是有防刷票的功能,主要有4大功能来防刷票:
可以设置一定时间内投票量达到一定票数警告选手,一定时间内达到一定票数自动锁定此选手并通知,锁定后就不能被投票了。
2、可设置开启和关闭投票验证码功能,投票前需要手动拖动图片完成验证!屏蔽机器刷投票!
3、可设置开启和关闭限制投票用户IP区域,可限制省份限制,如“广东”,也可限制城市限制,如“广州”。
4、限制单个IP每天的投票量设置,防止刷投票。
通过以上4种方式可以尽可能的实现防止刷票,也可以防止软件刷票,但是并不是百分之百可以防止刷票,因为有的刷票也是属于人工正常的投票。
问题三:如何有效防刷票,刷接口 1、加验证码,不过因为运营那边说验证码会导致用户流失,所以我们做了简单的数字识别。生成一个生成一张图片,图片里面1-9无序排列,上下左右位置不一,其中一个数字在图片上设置为红色。然后放入到memcache里面,让用户找出红色的。每次验证完了就删除掉memcache。这样可以防止一批用户。
2、如果上面的还不行,那么因为是抽奖页面所触发的事件,所以我们在打开抽奖页面的时候给浏览器设置了一个cookie。和一个验证cookie。这两个cookie的加密算法都是服务器设置的,服务器只要验证一下cookie是否存在。才能给用户加积分(有积分才能抽奖),加完积分把cookie删掉。。这样就可以防止用户刷积分抽奖。相当于token的验证机制
3、设置用户中奖概率,也就是说当用户在十分钟内,连抽了十次(看视频才能得积分,一个视频最短的30秒,十分钟内能连抽十次,说明来路不正)那么这个用户就再抽也抽不中。。
4、如果不想做得那么麻烦,那就指定时间的人中奖。如果一天必需送出去多少东西,比如说:一天要送出去十台手机。。那么久把十台手机分布在一天的十个点。这个点过后,第一个抽奖的人必中。。其他时间点再怎么抽都没戏。。反正运营要的数字,刷接口的用户也是用户。
问题四:怎么样阻止对方刷票 没办法去阻止,我可以帮你
纯手工拉票速度快又安全xhybz8080
问题五:网页投票,如何防止刷票? 软件不安全,容易被发现而且还可能手机会中病毒;纯手工简简单单而且安全第一拉票xhybz8080
问题六:怎样防止微信投票人工刷票 策略很重要
手工就可以的,
人多速度快,
一票一截图,
可以拿满意名次,
就是冠军第一名
问题七:微信投票如何防止刷票? 我前阵子刚去了
问题八:javaweb做的投票程序怎么防止别人刷票啊? 刷票的都是换IP刷,很难避免的。现在新浪都避免不了
问题九:如何防止微信平台的刷票现象 和你朋友投
一样的。
可以做。
都能投。
问题十:公司举办了一个网上投票,但是怕有人利用换Ip刷票,请问如何避免这种刷票现象 1、验证码:确切的说验证码的出现不是针对于人,而是针对于机器。通过复杂度和识别难易度的控制来阻拦掉一部分刷票机,从而减少刷票的发生。但随着软件技术、识别技术的发展越来越多的验证码面对着先进的刷票软件也失去了其防范的作用。
2、Cookie:这个应该是很老很原始的一种方式来防止刷票了。对用户的每次投票进行Cookie的记录,当下次投票时进行检测发现Cookie中已经存在了此投票记录则禁止此次投票。很遗憾的是此方式对于大多数网民已经失去作用(当然除了特别嫩的菜鸟外)。只需要通过IE清掉Cookie限制就将解除。
3、IP限制(+时段):这种方式也是目前最多的防刷机制。能屏蔽掉部分的刷票。但是其存在很多局限,因此程序员也不得不放弃小群体(采用统一出口的群体,例如网吧等)来顾全大群体。人们上网大都是活动IP地址,因此是不存在真正意义上的IP防刷的。笔者认为其实IP的方案并不是真正的防刷,更应该说他是采用了一种策略:加大投票操作难度和时间成本从而使部分投票者放弃刷票。只不过这种投票操作的难度增加不会影响到当前用户的流程,他是在后台由程序员完成的。也就是说在前台用户操作上没有任何变动因此具有一定的友好性。
4、Mac地址:这种方式比较少见,但是网上有人提出。因为IE的安全级别是不可能获得用户的Mac地址的,只能通过安装ActiveX或是对IE进行特定设置才能实现。个人觉得此效果并不好。一是加大了用户投票的难度,二是Mac地址其实也是可以修改的。
现行方案中都没有一个很好的防止方案。防止刷票之所以很难有完美的解决主要原因在于人。人是一种很聪明、很勤奋、很有耐心的天才动物,有这么一句话“天才就是重复次数最多的人”。因此不论你如何设定防范规则都很难凑效。即便你的规则可以难倒恐怖的刷票机,你却没有办法难倒勤奋有耐心的人。你防止IP我就重复着拨号,你Cookie限制我就重复着清Cookie,你做Mac限制我跟着换,只要我肯花时间没有办不到的。这也再一次应征了那句话“防君子不防小人”。
javaweb开发怎么防止机器攻击一直刷短信验证码
设置时间间隔,发送一次短信验证码之后必须隔一段时间后才能继续下一次验证,在这个基础上,如果还有多次发送的,就开启图灵验证码,必须输入正确图片的内容,才能继续发送短信验证码
java接口怎么防刷的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java如何保证接口调用安全性、java接口怎么防刷的信息别忘了在本站进行查找喔。