求教~ 前后端分离网站,怎么应对爬虫

2022-11-21 13:33:15 +08:00
 pokeyou

web 前端代码都是公开的,做了任何加解密,签名验证都会被看到,并且直接做到爬虫程序里~ 如何应对呢。 API 签名有多大意义呢。

7072 次点击
所在节点    程序员
46 条回复
libook
2022-11-21 15:57:41 +08:00
@horou #18 你要这么说,任何程序都可以用汇编来逆向调试,安全通常都是相对的,对于爬虫来说,你提高他的成本到他不愿意折腾了,目的就达到了。
ospider
2022-11-21 15:58:53 +08:00
前端加密没有任何意义,只能挡一下初学者。如果你的服务需要登录,那就限制每个用户的访问频次。如果可以匿名访问,那你唯一能相信的数据就是访问的 IP 地址,根据 IP 的行为、是否机房 IP 、访问频次做限制即可。
namejaho0
2022-11-21 16:50:06 +08:00
登录后限制账号日访问次数 且账号通过微信扫码登录(最佳)或手机验证码登录
RyderWang
2022-11-21 17:41:52 +08:00
加解密,签名应该放到后端做
sanqian
2022-11-21 17:46:54 +08:00
只能提高门槛
karatsuba
2022-11-21 18:04:40 +08:00
最讨厌的是账号限制和图片伪装吧
userKamtao
2022-11-21 18:16:33 +08:00
如果是网页,直接在服务端生成 canvas ,返回前端展示,连复制都没法复制,只能看,别人拿到数据也没用。
vincent321
2022-11-21 18:57:31 +08:00
cloudflare 开 防 ddos 模式?!
fkdtz
2022-11-21 19:03:54 +08:00
最讨厌两种人
一种是爬我接口的人
另一种是接口做反爬不让我爬的人
🐶
montaro2017
2022-11-21 20:59:12 +08:00
最简单方式就是加验证码,虽然可以通过接入打码平台过验证码,但提高了爬虫的成本。
接口做加密,JS 加解密做混淆,又提高了爬虫的成本。
再就是用 WebAssembly 做加密,没点水平的人很难破,成本又又又提高了。
接口限流,要求登录才可以获取数据,检测频率,太快了直接封号。
再教你一招,字体加密,就是看到的字体和实际的 unicode 不对应,看到的可能是数字 3 ,但爬虫爬到的是乱码,当然用户复制的话也是乱码。
learningman
2022-11-21 21:31:36 +08:00
每次请求要附带一个小 challenge ,用 aes 就挺好。
sheeta
2022-11-21 21:35:06 +08:00
recaptcha v3
pengtdyd
2022-11-21 22:37:51 +08:00
爬虫圈子里面有一句名言:只要浏览器能拿到的,那也应该是我能爬到的。
Hider5
2022-11-22 00:16:57 +08:00
可以看下飞书文档的,比银行 js 混淆还头疼,用的非对称加密,返回内容分块,每块对应不同的 token ,还限制每分钟访问速率。重点内容加密,像数字加密可以看下大众点评
MossFox
2022-11-22 00:35:44 +08:00
不记得在哪看到的了,古老的时候有游戏客户端的防止服务器被打的手段是:将 对 [联机之前的某个页面上的某一张静态图片资源] 发起请求的 IP 作为 IP 白名单加入防火墙 (并设置一定的有效期)。这样可以过滤掉绝大部分没有通过游戏官方客户端来连接到服务器的请求。

……如果不想走正常的路子可以往这个方向想一下 (例如将上面的 IP 加入防火墙白名单 换成 接口对白名单以外的 IP 统一返回错误信息),主要图的就是前端轻易看不出破绽。当然我感觉也可能也会有大坑 (用户中途换了个网络环境,应用就炸了)。先想一下有无必要这么整吧。
johnsona
2022-11-22 03:22:50 +08:00
1.先 ip 频率限制一波 或者没事干再把机房 ip 全给 ban 了
2.再要求必须用微信登陆 或者微信扫码登录 限制单个账号的频率 他要再搞就得自己搞很多微信号 这成本一下子给他搞上去
3.验证码让他点圆柱形那种 多种验证码轮番上证 谷歌验证码也给整上 这一套打下来 对面拿着一点点钱的小爬虫该去找老板加工资然后被开除了
4.限制分页看到的数据 就给看前 100 条好了
5.如果察觉到某个账号异常频繁 给点假数据 他都不知道哪些真那些假
js 用处不大 这些人拿浏览器跟你刚你怎么办
crab
2022-11-22 03:59:18 +08:00
ip 频率限制+WebAssembly
nowheremanx
2022-11-22 04:29:35 +08:00
captcha ,最可靠的方式了。

不过说一点,防爬虫机制有可能误伤真实用户。
sunorg
2022-11-22 09:08:46 +08:00
之前我的做法


拒绝 dev tool
```
function checkDebugger(){
const d=new Date();
debugger;
const dur=Date.now()-d;
if(dur<5){
return false;
}else{
return true;
}
}
function breakDebugger(){
if(checkDebugger()){
breakDebugger();
}
}
document.body.onclick=function(){
breakDebugger();
alert(1);
};

```
检测 chrome headless ,然后执行某命令
```
function checkHeadless()
{
if(typeof MessageEvent === "function") {
if(typeof getBoxObjectFor === "function"){
return true;
}
}

if (/HeadlessChrome/.test(window.navigator.userAgent)) {
handleHeadLess();
}
if(navigator.plugins.length == 0) {
handleHeadLess();

}
if(navigator.languages == "") {
handleHeadLess();
}

var canvas = document.createElement('canvas');
var gl = canvas.getContext('webgl');
var debugInfo = gl.getExtension('WEBGL_debug_renderer_info');
var vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);
var renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);
if(vendor == "Brian Paul" && renderer == "Mesa OffScreen") {
handleHeadLess();
}
var body = document.getElementsByTagName("body")[0];
var image = document.createElement("img");
image.src = "http://iloveponeydotcom32188.jg";
image.setAttribute("id", "fakeimage");
body.appendChild(image);
image.onerror = function(){
if(image.width == 0 && image.height == 0) {
handleHeadLess();
}
}
}
function handleHeadLess()
{
$jsHandleHeadLessCmd //改造这里,做你想要的动作
}
```
数字倒叙,用 css 控制成正序显示
关键文字随机每次都加载生成不同的字库
浏览器指纹
服务端拿到 ip 后,扫描该 ip 端口,有指定端口者认为是爬虫
服务端拿到 IP 后,到订单池里找,有消费记录的加权
canvas 指纹和 reCaptcha 的配合,拿到指纹之后,如果单位时间访问量过多,我们可以临时认为它是爬虫。然后弹出验证窗口。注意这个指纹必须产生足够复杂的图形,才可以尽可能拿到像素级别的差异。
bjzhush
2022-11-22 10:50:13 +08:00
给你介绍下我之前设计的一套简易方案吧。
第一个是在 NGINX 层面做的,主要反 scanner 的,使用到 filebeat+redis+自定义脚本+lua 防火墙,大致流程:采用 filebeat 将 NGINX 的 log 推送到 redis ,然后自己写脚本从 redis 读 log ,分析之后以 ip 为 key ,根据 http code 对 key 进行计数,比如正常 200+1 ,404 直接加 50 ,到一定数值则把 ip 推到黑名单池子里面,lua 防火墙会对每次请求进行黑名单 IP 判断,在黑名单内直接 403.
这个自定义脚本完全可以根据自己的业务进行设计,比如某些接口或者业务进行不同的加权之类的
第二个是业务层面的,对一些重要业务进行记 log+计数,计数以 userID+ymd 为 key ,用于控制当天对一些资源的访问,过了一定的阈值可以弹出 CAPTCHA 确实不是程序,通过 CAPTCHA 后可以计数清零或者根据自己业务调整。
重要的资源肯定是要登录才能访问的,这样基于 userID 来统计和反爬就方便多了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/896776

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX