因为一些原因需要搞国外服务器一个类似于 Cloudflare 的五秒盾,不是给公司用的,给个人站点用的。大伙看看有没有什么问题,比如绕过的方法,或者一些漏洞可以被用来攻击。
下面是流程图。
注意:流程图中提到的服务器是类似 Apache 和 Nginx 这样的服务器软件。
挂一个 proxy ip 池,每隔一秒换一个 ip, 只需要 5 个 ip 轮换,就轻松破功。
code 计算时是有 IP 的,IP 变化了服务端计算 code 时就对不上了,会重新计算三个 cookie 然后重定向到五秒盾。
你不懂攻击操作手法。每个 IP 的请求 cookie 都是独立的。
防的是什么?
5 秒后这个正常请求如果被重放,似乎并不会被拦?
说白了就是 5 台肉鸡就破了。
我看你似乎在无 cookie 状态下没做任何判断就直接生成 cookie 了?
如果对方针对这个来打爆你的数据库能撑得住吗,还是说在数据库层面做了 ip 去重。
我的五秒盾的目的是对于每个用户首次访问需要延迟五秒,我不是专业的,能否把具体的攻击方式描述一下?所谓攻击就是绕过首次的五秒延迟。
5S 盾的机制应该是像 1 分钟请求超过 100 次或者是 1s 超过 5 次之类时后端做个接口熔断。
然后前端路由切换过快时,做个前端拦截。
你现在单纯的判断上次请求的时间,意思就是每个接口请求间隔必须 5s,那么用户使用体验极差,还有就是像现在的前后端分离的页面,你进入页面后基本都要请求 N 个接口,那么这些接口请求还要间隔 5s 么。如果不需要,怎么判断是正常访问你的页面还是脚本爆破你的服务器呢。
目标就是每个用户首次访问时延迟五秒,延迟五秒后正常访问。重放是可以重放,但是没有意义吧?比如换一个 IP 重放会导致服务端计算的 code 对不上。
服务端不存储任何信息,服务端完全依靠客户端的 cookie 验证。
我没有描述清楚,这个五秒盾只是首次访问的时候延迟五秒,之后就不会延迟了。
恭喜你重新发明了 jwt
CF 做延迟 5 秒是为了放 D 。。。你是为了给用户添堵?。。。。。不能只照着皮毛抄呀。。
不换 IP 重放,code 是一样的
延迟五秒后五秒盾就不会再起作用了,后续会有专门的机制限制 IP 的访问频率。想使用这两个机制稍微抵抗一下代理池。
那我首次访问伪造一下 time cookie 不就破了吗?
只有在客户端提供的 code 和服务器计算的 code 相同时才会判断时间,如果 code 对不上是不会走到判断时间这一步的。
服务端不存储的话,对方岂不是很容易就伪造 hash 了。还是说你寄希望于对方摸不透你 cookie 的生成算法?
哦,等下,你有个 salt 是吧,也就是靠 salt 保密那倒是基本上没问题了,除了不防重放以外。
Cookie 生成算法是可以公开的,因为生成 code 时用到了服务端的一个长度为 128 的随机字符串。对方知道算法也没办法伪造吧?攻击者可以伪造 uid 和 time,但是 code 生成时不仅使用了客户端 IP 和 uid,还使用了一个仅存储在服务端的随机字符串,所以 code 应该时不能伪造的。大概没问题吧?
重放确实不防,不过五秒盾的后面还有一个限制 IP 访问频率的机制,应该可以缓解一下。我是希望使用这两种机制来缓解一下来自代理池的攻击。
确实,time 可能被伪造,我生成 code 时算上 time 吧。谢了!
好像有一个问题,首次访问时只需要修改一下 time 就能绕过了,这应该是一个漏洞。我打算用让 time 参加到 code 的生成过程中,这样应该就没问题了。
首先指定一个用户标记:ip 、uid 、cookie 都行,识别用户。
然后存一个用户的 『首次访问时间』就行了,哪有这么麻烦?用户识别和时间都是以服务器为准,怎么都伪造不了。
看下来后,其实你只要服务器上缓存用户的首次访问时间就行了,以服务端为准,对客户端应该是无感的。过了 5s 限制后服务端把这个缓存记录清除就可以了。(其实和 jwt 的场景很像,二次加密一下 jwt 就是你的 code 计算了。
另外,首次访问延迟 5s 这个需求就有点奇怪(干脆登录接口调用后延迟 5s 下发数据得了。
我感觉楼主就是想实现一个不依赖数据库的鉴权,有些类似于 jwt 。
http2 协议一次请求代替 n 次原先 http 1 协议的请求,
楼主是开倒车吗
你这个也不防 d 啊,流量照样全打上。
个人网站直接套 cf 就好,做这个东西没啥意义,挡不住的。而且这样做就意味着你全站没法用现成的大厂 CDN,回源会出问题。cf5 秒盾后面还有一整套的风控,不是咱几行代码就能抄过来的
没仔细看,但感觉没学到精髓。
印象中 Cloudflare 那个主要是要客户端脚本跑一个比较复杂的算法,防止那些非浏览器的流量进来。算法会故意混淆,防止有人直接用其他语言实现,而且可能几天就换一下,使得只有用 JavaScript 引擎才能算出。
而你这个方案,感觉简单研究一下就能用别的语言实现了。
/>JS Challenge 。我只是想用这个五秒盾搭配 IP 访问频率限制来抵抗一下使用代理池的脚本而已。
可以写个 JS 让客户端帮你算 Proof of Work,然后你服务端交到矿池上去。如果被 D 你也是赚了,不被 D 最好
挡不了爬虫 也就挡挡普通用户
爬虫花几分钟就能爬遍整个小网站,还在意等这几秒吗
那就不要提 CF
简单地说就是对每个 IP 首次访问进行 5 秒延迟。
那你首先得把其他方面做到非得用代理池才能爬。
提高一下攻击成本而已,主要用来对付脚本小子。
并不会为了对付爬虫,主要是为了对付一些消耗服务器性能的攻击,后面还有限制单个 IP 的访问频率的机制,也只是能提高一点攻击成本而已,并不那么有用。
鬼才
我每次都用你 10 秒以前的 key 不久好了,你设置了 cookie 我不需要用啊 1 个 key 无限使用。