V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
pokeyou
V2EX  ›  程序员

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

  •  
  •   pokeyou ·
    cnkanwei · 70 天前 · 5045 次点击
    这是一个创建于 70 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    第 1 条附言  ·  70 天前
    感谢各位大佬的建议。
    循序渐进增加设施。
    web 比 app 的优势是没那么大的历史包袱,
    方便更新加固。
    46 条回复    2022-11-24 17:53:22 +08:00
    sss495088732
        1
    sss495088732  
       70 天前
    专业的事交给专业的人 0.0(akamai)
    proxytoworld
        2
    proxytoworld  
       70 天前
    用 js 做运算,同时判断是否是真的浏览器发起的请求,headless 和普通的还是有一定区别的
    ThanksSirAlex
        3
    ThanksSirAlex  
       70 天前
    这和分不分离有关系吗,就算是集成式框架,到了浏览器也是 js html css ,该能看的都能看到,同一的加密解密算法就应该放到服务端去做,防爬虫只能靠一些风控手段去做,比如请求频率什么的去做。
    molvqingtai
        4
    molvqingtai  
       70 天前
    敏感信息,字符用定位,或者用图片
    Features
        5
    Features  
       70 天前
    1.破解混淆和加密是有成本的,并且不低
    2.参考下大厂基本都是通过各种验证码来防机器人的
    youngce
        6
    youngce  
       70 天前   ❤️ 3
    先想 10 个反爬方案,然后不定时随机上线一种方案
    ml1344677
        7
    ml1344677  
       70 天前   ❤️ 2
    主要思路不是防止所有爬虫,而是提高爬虫花费的成本。我之前爬取过某网站,请求接口后返回一个 list ,这个 list 可以按顺序组成一个多边形,当我调试了两三天,全部部署好了后,大概跑了一周多,完全没异常。后来检查数据的时候发现,几万条之后,返回的 list 全是做了乱序的。。。。
    GoCoV2
        8
    GoCoV2  
       70 天前
    逆向思维,爬爬别人的网站,就知道该怎么防了
    yekern
        9
    yekern  
       70 天前
    浏览器指纹,把爬虫的指纹都丢在黑名单里
    copymaster
        10
    copymaster  
       70 天前 via Android
    @ThanksSirAlex op 意思可能是保护接口不被破解,除了他的代码调用以外不准别人调用
    copymaster
        11
    copymaster  
       70 天前 via Android
    首先要明确一点,完全防爬虫是不可能的,只能无限提高门槛,具体思路可以参考其他回复给的建议
    op351
        12
    op351  
       70 天前 via iPhone
    学习 discuz 之类的论坛 直接后台把单 ip 每天的请求次数写死 超过频率就永远拉黑
    zhangkunkyle
        13
    zhangkunkyle  
       70 天前
    极验啊,瑞数啊,安域啊。。。
    libook
        14
    libook  
       70 天前
    用 webassembly 写就不公开了吧
    kozalak
        15
    kozalak  
       70 天前 via Android
    学 cloudflare 的 5 秒盾,加验证码
    Radom
        16
    Radom  
       70 天前
    这个真的太难了
    chengkai1853
        17
    chengkai1853  
       70 天前
    如果你说的是防止抓页面内容,那几乎防不了!
    horou
        18
    horou  
       70 天前
    @libook 用 wabt 等工具还是可以逆向,只是成本又会提升一个量级
    vacuitym
        19
    vacuitym  
       70 天前
    可以试试非对称加密+代码混淆
    fournoas
        20
    fournoas  
       70 天前
    captcha captcha 还是 captcha
    libook
        21
    libook  
       70 天前
    @horou #18 你要这么说,任何程序都可以用汇编来逆向调试,安全通常都是相对的,对于爬虫来说,你提高他的成本到他不愿意折腾了,目的就达到了。
    ospider
        22
    ospider  
       70 天前
    前端加密没有任何意义,只能挡一下初学者。如果你的服务需要登录,那就限制每个用户的访问频次。如果可以匿名访问,那你唯一能相信的数据就是访问的 IP 地址,根据 IP 的行为、是否机房 IP 、访问频次做限制即可。
    namejaho0
        23
    namejaho0  
       70 天前
    登录后限制账号日访问次数 且账号通过微信扫码登录(最佳)或手机验证码登录
    RyderWang
        24
    RyderWang  
       70 天前
    加解密,签名应该放到后端做
    sanqian
        25
    sanqian  
       70 天前
    只能提高门槛
    karatsuba
        26
    karatsuba  
       70 天前
    最讨厌的是账号限制和图片伪装吧
    userKamtao
        27
    userKamtao  
       70 天前
    如果是网页,直接在服务端生成 canvas ,返回前端展示,连复制都没法复制,只能看,别人拿到数据也没用。
    vincent321
        28
    vincent321  
       70 天前
    cloudflare 开 防 ddos 模式?!
    fkdtz
        29
    fkdtz  
       70 天前   ❤️ 15
    最讨厌两种人
    一种是爬我接口的人
    另一种是接口做反爬不让我爬的人
    🐶
    montaro2017
        30
    montaro2017  
       70 天前
    最简单方式就是加验证码,虽然可以通过接入打码平台过验证码,但提高了爬虫的成本。
    接口做加密,JS 加解密做混淆,又提高了爬虫的成本。
    再就是用 WebAssembly 做加密,没点水平的人很难破,成本又又又提高了。
    接口限流,要求登录才可以获取数据,检测频率,太快了直接封号。
    再教你一招,字体加密,就是看到的字体和实际的 unicode 不对应,看到的可能是数字 3 ,但爬虫爬到的是乱码,当然用户复制的话也是乱码。
    learningman
        31
    learningman  
       70 天前
    每次请求要附带一个小 challenge ,用 aes 就挺好。
    sheeta
        32
    sheeta  
       70 天前 via Android
    recaptcha v3
    pengtdyd
        33
    pengtdyd  
       70 天前
    爬虫圈子里面有一句名言:只要浏览器能拿到的,那也应该是我能爬到的。
    Hider5
        34
    Hider5  
       70 天前 via iPhone
    可以看下飞书文档的,比银行 js 混淆还头疼,用的非对称加密,返回内容分块,每块对应不同的 token ,还限制每分钟访问速率。重点内容加密,像数字加密可以看下大众点评
    MossFox
        35
    MossFox  
       70 天前
    不记得在哪看到的了,古老的时候有游戏客户端的防止服务器被打的手段是:将 对 [联机之前的某个页面上的某一张静态图片资源] 发起请求的 IP 作为 IP 白名单加入防火墙 (并设置一定的有效期)。这样可以过滤掉绝大部分没有通过游戏官方客户端来连接到服务器的请求。

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

    不过说一点,防爬虫机制有可能误伤真实用户。
    sunorg
        39
    sunorg  
       69 天前
    之前我的做法


    拒绝 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
        40
    bjzhush  
       69 天前
    给你介绍下我之前设计的一套简易方案吧。
    第一个是在 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 来统计和反爬就方便多了
    cy1027
        41
    cy1027  
       69 天前
    为什么总有人觉得自己的网站很有价值,真的有价值就搞注册制,账号收费注册,自然就没爬虫了,真的有也可起诉
    cy1027
        42
    cy1027  
       69 天前
    干了四五年爬虫了,反爬手段基本都见过,无一例外都有应对策略,想爬你总能爬的,为啥老是想着跟爬虫对着干?当然,如果访问量太大影响网站运行的我认为是攻击行为,不是爬虫行为,你上个 ja3 可以应对大部分小白的攻击行为,还不伤及普通用户,然后在前端限制访问频率就可以了,再做个 ip 限制,这样小白基本上没法攻击你的网站了,如果真有大佬盯上你的网站楼上的策略全都不管用,只有收费注册账号能真正限制爬虫
    liuketh
        43
    liuketh  
       69 天前
    @op351 66666
    llsquaer
        44
    llsquaer  
       69 天前
    js 加密算法投毒??
    xxxbin
        45
    xxxbin  
       67 天前
    +1

    大哥又见到你了 就说头像这么熟悉 哈哈哈哈
    xxxbin
        46
    xxxbin  
       67 天前
    @cy1027 +1

    大哥又见到你了 就说头像这么熟悉 哈哈哈哈
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   实用小工具   ·   303 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 281ms · UTC 20:25 · PVG 04:25 · LAX 12:25 · JFK 15:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.