防止重复请求攻击

今天发现自己项目一个漏洞:先为一账户充值100元,然后瞬间发送10次提现请求(都是提现100,提现接口是有做余额不足校验的),其中大约有四五次都是成功的,剩下的会报余额不足。期望是,只有一次可以成功完成提现,分析到能部分请求能通过余额不足校验原因是,由于是瞬间发出的提现请求,这些请求中拿到的余额数据都是余额扣减之前的数据。

以上场景可以提炼出两个关键步骤:

  1. 查询余额并校验,select * from account where user_id = 123;
  2. 扣减余额并支付,update account set balance...

根据以上步骤,可知:1.在两条SQL语句执行的中间这段时间,由于重复请求攻击,可能会出现多次请求的第一步操作成功,并继续执行第二步,最后导致资金损失。2.由于第一步操作是查询操作,没有数据库会限制重复读取数据,数据库层面是没有可能解决这个问题的,所以不用在这个上面浪费时间。

目前的解决方案是:为接口上锁。已经有人做了轮子,比如redis-lock。以用户ID为key,某个uuid为值。将类似提现这样的接口上锁。同一用户在访问添加了该中间件的接口时,第一次没有执行完毕,拒绝执行第二个请求。第一次执行完毕时,释放锁,即清除redis缓存的键值对。同时可设定,缓存时长,以防中途宕机,锁未释放等问题。具体实现可以参考npm包redis-lock文档。

原文地址:https://www.cnblogs.com/jarvisjin/p/9969322.html

时间: 2024-11-05 17:26:54

防止重复请求攻击的相关文章

初步认识csrf 跨站伪造请求攻击

什么是跨站伪造请求攻击? 我自己的理解:用户A用浏览器访问量一个存在漏洞的网站B,同时A又访问了恶意网站C,假设用户A在B网站上进行了一次交易,C网站上有个<img src="A网站的交易地址"/>的html片段,那么此时用户A 的浏览器就会向B网站的交易链接发送请求,由于A已经在B网站登录,所以B网站处理的这个请求,但是这个请求并非用户A自己行为发送的,但是B网站无法判别是否是用户主动发送,所以造成攻击!可以借助这张图片来理解 该图取自hyddd的博客    hyddd的

JS解决页面多次,重复请求 的2个方法

最近的一个case,在web页下,鼠标向下滚动翻页动态请求数据的时候.一般都是判断当前页面距离顶部的高度与整个html的长度之差来决定是否请求下一页的数据. 如果不进行相应处理,滑动事件会触发多次,导致请求多次或者重复请求(取决于代码设计) 思路1: 滑动到下方第一次触发请求后,移除滑动监听,等待请求返回,继续监听滑动事件. 思路2: 对于一次滑动有产生多次不重复的请求的情况.可以让这些请求都进入队列,滑动时判断标志位,为真则取出队列第一个请求并执行,为假则不执行.待请求返回时设置标志位true

微信页面注册时重复请求的问题

以下转载于同事空间日志,做个记录: 最近在微信端的开发当中发现微信浏览器会重复请求后台,搞的我是寝食难安,业务逻辑就是一用户注册逻辑,本地测试没问题,放生产上有时就会报"用户已存在"异常,开始以为是代码逻辑里有重复插入的逻辑,在我来来回回反反复复的看了n遍依然没有发现有重复插入的逻辑时,我又把注意力移到了jquery的ajax上,以为是jquery里ajax重复提交的,于是我改变ajax提交为普通的href连接,结果错误依然.这时我感觉很可能是尼玛微信的套路,最后用了一很勉强的办法暂时

ASP.NET MVC的Ajax.ActionLink 的HttpMethod=&quot;Get&quot; 一个重复请求的BUG

这段时间使用BootStrap+Asp.net Mvc5开发项目,Ajax.ActionLink遇到一个重复提交的BUG,代码如下: 1 @model IList<WFModel.WF_Temp> 2 @{ 3 Layout = null; 4 } 5 6 <!DOCTYPE html> 7 8 <html> 9 <head> 10 <meta name="viewport" content="width=device-w

一次排查页面重复请求的经历

前段时间重构一个页面,页面中存在通过第三方JavaScript代码插入的动态广告(正常的产品需求),上线后发现第三方的广告资源存在重复请求的问题.由于控制广告插入的JavaScript代码由第三方提供,我们只负责按照他们要求的方式引入即可,所以对JavaScript代码内容并不了解,在这种情况下开始了艰难的排查过程.虽困难重重,但最终还是找到了原因,在此过程中有些收获,现将排查过程抽象如下: 注:以下过程和截图皆在Chrome浏览器中进行. 一.代码 <div id="container&

spring boot 通过AOP防止API重复请求

实现思路 基于Spring Boot 2.x 自定义注解,用来标记是哪些API是需要监控是否重复请求 通过Spring AOP来切入到Controller层,进行监控 检验重复请求的Key:Token + ServletPath + SHA1RequestParas Token:用户登录时,生成的Token ServletPath:请求的Path SHA1RequestParas:将请求参数使用SHA-1散列算法加密 使用以上三个参数拼接的Key作为去判断是否重复请求 使用Redis存储Key,

nginx+tomcat重复请求

好久不写技术文章了,越发的觉得单纯的讲技术没啥意思.怪不得知乎越来越火,因为大家都喜欢看故事,不喜欢硬生生的技术文章.笔者今天就来就给大家讲故事:) 最近网站压力突然增大,把带宽都占满了,访问网页发现非常的慢,打开页面的速度也奇慢大概要十几秒.这种情况还是第一次遇到,感觉不是被攻击了就是被攻击了!下面是网站的流量截图,一共1M的带宽在15点左右的时候瞬间慢了,然后就是持续的在峰值左右徘徊. 当时的想法是莫非网站的访问量到达了一定程度要增加带宽了?可是通过看网站的统计数据,访问的人数并没有明显的增

JavaWeb防止用户的重复请求提交

这里实现这个重复提交的防止,是通过在一个FIlter过滤器中生成一个令牌token,保存在Session域中,然后在对这个token加密得到ciphertext(密文),将密文保存在request域中.如果在login.jsp中的一个隐藏表单项中取得这个request域中的密文(ciphertext).提交到一个LoginServlet,进行判断令牌是否匹配成功,成功的话,就到数据库中查询操作,否则的话就打出提示消息.这样的话,就不会导致每一个请求均去数据库进行查询,导致系统超负荷的工作,不至于

Charles——charles 工具栏Tools总结——批量重复请求/重复发包工具/repeat——Advanced Repeat就是重复发包多次

charles 批量请求 重复发包工具/repeat Charles 让你选择一个请求并重复,在测试后端接口的时候非常有用: Charles将请求重新发送到服务器,并将响应显示为新请求. 如果您进行后端更改并希望测试它们,用了charles后,你就没必要在浏览器(或其他客户端)中重复该请求,charles可以非常方便的完成. 特别是如果重新创建请求需要传一些列参数的时候(比如在游戏中获得分数,比如填写一大串表单的请求时候),这将节省大量的精力. 请求的重复在Charles内部完成,因此您无法在浏