leokun
V2EX  ›  浏览器

如何知道网络请求是从浏览器发出的

  •  
  •   leokun · Sep 25, 2025 · 15574 views
    This topic created in 406 days ago, the information mentioned may be changed or developed.
    用户模拟 js 的水平很高的情况下
    109 replies  •  2025-09-29 00:15:45 +08:00
    1  2  
    ❮ ❯
    JFZ
    JFZ
    Sep 25, 2025
    1
    UA?
    shuiduoduo
    shuiduoduo
    Sep 25, 2025 via iPhone
    2
    无解
    leokun
    leokun
    OP
    Sep 25, 2025
    3
    @jiuhuicinv 这是最容易模拟的
    shuiduoduo
    shuiduoduo
    Sep 25, 2025 via iPhone❤️1
    4
    各种无头浏览器
    pingdog
    pingdog
    Sep 25, 2025 via Android
    5
    买 ip 库,检测到 proxy/idc 跑 js PoW ,captcha 验证码,加 fingerprint 差不多了,再搞多就不化算,防的成本多于攻
    fyq
    fyq
    Sep 25, 2025
    6
    用户雇个大学生手动操作也就 3000 一个月
    iOCZS
    iOCZS
    Sep 25, 2025
    7
    不能,只能结合行为做上下文分析
    leokun
    leokun
    OP
    Sep 25, 2025
    8
    想到一个麻烦的办法,也是爬虫模拟与真实操作的本质区别
    在访问网页时,真实的业务访问是连续的,间隔的,同一个用户在特定的业务中是不可能出现并发的,即使用户模拟 js 很厉害,但是在模拟业务次序,调整请求间隔上很难做到与真实用户一样
    wy315700
    wy315700
    Sep 25, 2025
    9
    @leokun #8
    检测请求间隔
    人的请求间隔是不稳定的,无规律的。
    而大部分爬虫往往使用 sleep(random(x,y))的方法模拟间隔,这种均匀分布有很明显的特征
    longzhou6431
    longzhou6431
    Sep 25, 2025
    10
    可以考虑拒绝掉新建连接的第一个请求包,这样可以确保地址不被探活
    Donahue
    Donahue
    Sep 25, 2025
    11
    浏览器 ja3 签名/浏览器指纹之类的
    MYDB
    MYDB
    Sep 25, 2025 via iPhone❤️1
    12
    这属于攻防了,对方水平很高,那建议花更多的钱请个高人或者找业内顶尖团队,否则记录日志就能挡住一些新手写的爬虫了
    nekoneko
    nekoneko
    Sep 25, 2025
    13
    无解
    最多是对前端请求做个摘要, 后端接到后进行验证, 这个只能提高门槛
    另外就是加蜜罐, 这样能知道哪些用户是不正常的.
    tf2
    tf2
    Sep 25, 2025
    14
    用户模拟 js 的水平很高?

    用户直接上无头浏览器!
    triptipstop
    triptipstop
    Sep 25, 2025
    15
    调用 GPU 不给用的 直接怕黑
    voidemoer
    voidemoer
    Sep 25, 2025
    16
    比较有效的方法一是带上各种人机交互验证,二是监控用户鼠标轨迹
    但是对抗情形下,都有破解的方法:第三方解码、多轨迹回放,只不过会大大增加攻击者的成本
    deplives
    deplives
    Sep 25, 2025
    17
    你说的这个无非就是反爬,没有最终的方案,都只是攻防而已
    coefu
    coefu
    Sep 25, 2025
    18
    @leokun #8 这是个蠢办法,你怎么确定,你不会 ban 掉真实的用户?
    rammiah
    rammiah
    Sep 25, 2025 via Android
    19
    无解,人家用无头浏览器,ai 操作
    miyuki
    miyuki
    Sep 25, 2025
    20
    无非猫捉老鼠,后台搞个无头浏览器
    ejin
    ejin
    Sep 25, 2025
    21
    油猴脚本,请求完全是浏览器发出和渲染,你怎么破,哈哈哈
    laggage
    laggage
    Sep 25, 2025
    22
    hmmm, 不能加验证码吗,请求前 js 弹出验证码框,验证通过才给请求?
    play78
    play78
    Sep 25, 2025
    23
    定时更新前端代码和后端接口及加密请求方式,业务流程。只要你改得足够快,模拟的人就跟不上。
    很简单,你前后端稍微改一下业务流程,逆向的人,要花 10 倍的时间去梳理。只要成本与收益不匹配。就没人去做。
    duanxianze
    duanxianze
    Sep 25, 2025
    24
    不可能的,只能用各种人机验证,验证码来预防
    Rickkkkkkk
    Rickkkkkkk
    Sep 25, 2025
    25
    用户直接手点浏览器你感觉能区分吗?
    Ketteiron
    Ketteiron
    Sep 25, 2025
    26
    @leokun #8 请不要重新发明 cloudflare waf ,免费的
    zachariahss
    zachariahss
    Sep 25, 2025
    27
    单请求没办法,请求前的页面渲染状态,埋点,加载状态,鼠标轨迹,行为逻辑分析,一系列东西去判断,但是防不住真想和你做对抗的人....这东西都是一整个团队用上各种手段去尝试,对抗,没啥一劳永逸的办法
    akakidz
    akakidz
    Sep 25, 2025
    28
    本质上,这类问题没有绝对的防御手段。对抗方式往往是一个“试错博弈”的过程,如果用户的试错成本足够低,那么无论你做多少防护,他总能找到突破口。关键在于如何提高用户的试错成本,而不是通过技术手段杜绝爬虫
    Ketteiron
    Ketteiron
    Sep 25, 2025
    29
    这个问题等价于如何防止爬虫
    答案是防不了

    人机验证
    通过接码平台解决

    五秒挑战,参考 Cloudflare 5 秒盾,浏览器静默执行一段 js 脚本,识别当前是否是正常环境
    通过无头浏览器解决

    浏览器指纹验证
    https://github.com/fingerprintjs/fingerprintjs
    但它是开源的,攻击者依然可以想办法绕过

    tls 指纹识别,cloudflare 等云厂商通过对所有开源请求库做特征库,能识别一个请求是否通过浏览器正常发送,甚至能识别无头浏览器
    但可惜可以无头浏览器+伪造特征

    再来就是老一套的混淆接口加解密
    没啥用,5 分钟以内就能破
    MHPSY
    MHPSY
    Sep 25, 2025
    30
    有一个 brightdata ,可以搜索一下

    他们提供完整的无头浏览器远程的方案,包括自动过验证码,自动过 5 秒盾,几乎只需要写拿数据的业务逻辑就可以了,很方便。

    很难爬的数据我就用这个搞,基本都能搞定
    Ketteiron
    Ketteiron
    Sep 25, 2025
    31
    人机验证算是最有效的防护手段了,双方硬拼钱包,但已经渐渐出现 AI 接码服务,攻击者成本会越来越低。
    dddd1919
    dddd1919
    Sep 25, 2025
    32
    也可以 RPA 操作浏览器,无解
    leokun
    leokun
    OP
    Sep 25, 2025
    33
    @play78 如果加解密的过程是动态生成或编译的,攻击者采用模拟手段应该会更加困难
    lisxour
    lisxour
    Sep 25, 2025
    34
    @Ketteiron 现在的打码平台便宜到你怀疑人生,百万级以下上打码平台都不带眨眼的
    Ketteiron
    Ketteiron
    Sep 25, 2025
    35
    @play78 没用,一般都是用无头去爬
    AutumnVerse
    AutumnVerse
    Sep 25, 2025 via iPhone
    36
    直接上 cf 盾,如果这都被破解,那就认了吧
    bzw875
    bzw875
    Sep 25, 2025
    37
    通通加上人机验证,图片验证码
    lavvrence
    lavvrence
    Sep 25, 2025
    38
    felixsama969
    felixsama969
    Sep 25, 2025
    39
    被针对是无解的
    hahahalololo
    hahahalololo
    Sep 25, 2025
    40
    @Ketteiron 5 分钟!!大佬!!!我碰到 js 混淆加密,经常看半天都找不到破解方法
    kxg3030
    kxg3030
    Sep 25, 2025
    41
    以前还有 tls 指纹的 现在 也是轻松过了 放弃吧
    kxg3030
    kxg3030
    Sep 25, 2025
    42
    @MHPSY 不会是广告吧
    macaodoll
    macaodoll
    Sep 25, 2025
    43
    我就是做爬虫的,无解
    dode
    dode
    Sep 25, 2025
    44
    查看 UA ,操作系统,HTTP 请求头
    dode
    dode
    Sep 25, 2025
    45
    统统随机人机验证验证码
    DimensionalBoy
    DimensionalBoy
    Sep 25, 2025
    47
    你防住我的同时也会防住某些客户,然后客户:你的产品真难用
    hnliuzesen
    hnliuzesen
    Sep 25, 2025
    48
    TLS 握手指纹,不过可以模拟
    iorilu
    iorilu
    Sep 25, 2025
    49
    为什么要模拟 js

    现在都是直接程序控制浏览器阿, 确实都是浏览器的访问
    unused
    unused
    Sep 25, 2025
    50
    浏览器是啥
    whp1473
    whp1473
    Sep 25, 2025
    51
    这个不能完全实现,但如果你希望是从自己的产品网页发出则是可以实现的,可以通过 js 代码记录全面的用户行为记录,然后发送行为记录数据,比如鼠标的移动、颤动、停顿、页面的切换等等,模拟成本无限拔高。
    Kinnice
    Kinnice
    Sep 25, 2025 via Android
    52
    埋暗点,比如某几个.js/jpg 返回是 js/jpg 内容,但是实际是后端用来检测是不是爬虫的一个暗点

    需要配合:别直接 ban 对方指纹,而是随机延迟返回,接口随机 50x 报错,假数据

    只针对那种纯发包的爬虫场景,模拟浏览器的还要结合浏览器指纹/ip/一些 hack api ,随机的高级别验证码等
    KagurazakaNyaa
    KagurazakaNyaa
    Sep 25, 2025
    53
    https://github.com/TecharoHQ/anubis 上阿努比斯,每个请求都要计算,正常用户在一个设备上不会有很高频率的请求,爬虫才会
    liudewa
    liudewa
    Sep 25, 2025
    54
    @Ketteiron #29 随便一个网站 你 50 分钟也不一定能搞定
    Ketteiron
    Ketteiron
    Sep 25, 2025
    55
    @liudewa #54 网站发来
    cheng6563
    cheng6563
    Sep 26, 2025
    56
    要求客户客户端挖个矿
    linxiaojialin
    linxiaojialin
    Sep 26, 2025
    57
    @Ketteiron 你好,请教一下,假如需要长时间(例如 24 小时不间断地)爬取一个电商的页面,而它有 CF 盾,同时要和其他人抢购不定时刷新出来的秒杀商品,请问有办法确保不会被屏蔽并尽量抢购到商品吗?
    dosmlp
    dosmlp
    Sep 26, 2025
    58
    无解,反正什么样的数据都可以伪装
    aino
    aino
    Sep 26, 2025❤️1
    59
    好事,攻防对抗 无休无止 又可以让老板多投点资源进来了
    MHPSY
    MHPSY
    Sep 26, 2025
    60
    @kxg3030 #42 毫无利益关系,我自用,不认识他们
    artiga033
    artiga033
    Sep 26, 2025 via Android❤️1
    61
    要不人脸识别吧,也别管是人还是自动程序了,反正你就要求个人坐在摄像头前面
    byasm32
    byasm32
    Sep 26, 2025
    62
    29 楼总结的挺完整的了。
    guiyumin
    guiyumin
    Sep 26, 2025 via iPhone
    63
    @pingdog js pow 怎么玩?谢谢🙏
    liudewa
    liudewa
    Sep 26, 2025
    64
    @Ketteiron #55 https://m.wandacinemas.com/login 大佬登录流程跑通
    liudewa
    liudewa
    Sep 26, 2025
    65
    @liudewa #63 开始了 我给你开始倒计时
    EndlessMemory
    EndlessMemory
    Sep 26, 2025
    66
    行为轨迹
    user1284
    user1284
    Sep 26, 2025
    67
    唯一的办法就是行为监测,但这很容易误伤正常用户,检测是否是人类的算法再完美也没用,到最后就是猛弹窗验证码,肥了打码平台,公开数据真那么重要还不如直接开放合理定价(不合理人家还是选择爬)的 pai 付费接口,钱捞到才是真的。
    viking602
    viking602
    Sep 26, 2025
    68
    其实无解 你只能从用户行为上进行判断 比如短时间内获取了大量数据这种很大概率是有问题的
    Ketteiron
    Ketteiron
    Sep 26, 2025
    69
    @liudewa #64 这全是明文啊,混淆个鬼。而且就算关键接口有混淆,这种场景也并不需要破解,只会 py requests 的话你还得多练。
    Ketteiron
    Ketteiron
    Sep 26, 2025
    70
    @linxiaojialin #57 可以实现,js 逆向是基本功,摸清用户行为控制的级别和边界,看情况上分布式、退避算法、接入 AI 。
    为了不给灰产送子弹,不会提供具体细节。
    Ketteiron
    Ketteiron
    Sep 26, 2025
    71
    @yb2313 #67 接入 AI+MCP 后行为监测也没用了,cloudflare 现在是用 AI 去识别用户是否是 AI ,识别率感人,喜欢用纯键盘(比如我)翻网页的人几乎被误伤到没法用了。
    liudewa
    liudewa
    Sep 26, 2025
    72
    @Ketteiron #69 那你写一个 demo 出来 参数肯定有加密啊
    liudewa
    liudewa
    Sep 26, 2025
    73
    @Ketteiron #69 别扯别的 这个地址你能用 协议带参数请求返回成功 就行了 跑不通少在网上口嗨
    Huelse
    Huelse
    Sep 26, 2025
    74
    最简单的就是加验证码,有个验证码方案是 hash 算力检测,无头浏览器基本过不了,可以访问 openwrt.org 看看。
    然后就是链接行为检测了,TLS 握手、指纹等等,这方面最擅长的是 GFW...
    Ketteiron
    Ketteiron
    Sep 26, 2025❤️1
    75
    @liudewa #72 请求验证码接口 电话号码明文,得到 requestID
    请求登录接口,也全是明文,然后直接就登进去了
    后续看了下改地址、选电影院也没有什么问题
    兄弟,你不会连构造 cookie 都不会吧,玩这套流程让我回到了二十年前。
    aino
    aino
    Sep 26, 2025
    76
    @Ketteiron #55
    下次有人说你吃了两碗凉粉的时候不是抛开肚子给他们看吃了几碗,而是把他眼珠子挖出来吞进肚子里让他们看看到底是几碗
    liudewa
    liudewa
    Sep 26, 2025
    77
    @Ketteiron #75 请求头有个 check 字段 你没看出来? 你把它算法 挖出来吧 写到 js 文件 发出来
    Ketteiron
    Ketteiron
    Sep 26, 2025
    78
    @liudewa #77 算法藏在 gowasm 里,不可能挖出来,hook 调用不就行了
    最简答的上 playwright
    yulon
    yulon
    Sep 26, 2025
    79
    这个方向是错的,客户端 0 信任
    pocketz
    pocketz
    Sep 26, 2025
    80
    在互联网上,没人知道你是一条狗.jpg
    wangtian2020
    wangtian2020
    Sep 26, 2025
    81
    没有任何办法,一个东西他像用户,那他就是用户
    liudewa
    liudewa
    Sep 26, 2025
    82
    @Ketteiron #78 好 知道了👍
    anivie
    anivie
    Sep 26, 2025
    83
    @artiga033 虚拟摄像头+AI 数字人了解一下,别说摇头晃脑眨眼睛了,当场给你摇一段都没问题
    andforce
    andforce
    Sep 26, 2025
    84
    cloudflare 验证码
    可以识别是用户还是模拟,我至今没找到能破解的方法。

    用无头浏览器也不行,还是你能识别是不是人类
    qs
    qs
    Sep 26, 2025 via iPhone
    85
    @andforce 有些网站上强度了我每天都要手动点好几次

    这把真人都拦下来了
    hereIsChen
    hereIsChen
    Sep 26, 2025
    86
    以前听过一个方法,防无头浏览器,就是页面内弄一个隐藏的 a 标签,普通用户是看不到的;
    如果这个标签被访问了,就肯定不是正常访问到的
    Dora112233
    Dora112233
    Sep 26, 2025
    87
    页面放个隐藏图片,没加载过图片的就是非浏览器访问。
    ljl024
    ljl024
    Sep 26, 2025
    88
    直接开一套开放接口供外部平台接入,省得有人看上你的页面
    realpg
    realpg
    Sep 26, 2025
    89
    高级点的机器人检测都是公司最核心的知识产权价值...
    为什么总有人觉得去论谈发个帖就能拿到...

    这玩意给个思路的价值都很离谱
    voidcomma
    voidcomma
    Sep 26, 2025
    90
    我直接 CDP 操作浏览器,你如何应对
    wjpauli
    wjpauli
    Sep 26, 2025
    91
    你可以研究下指纹技术
    ExplodingDragon
    ExplodingDragon
    Sep 26, 2025
    92
    playwright 搭配 chrome cdp 拦截掉暴露的接口几乎无解,任何用户操作均可模拟,做并发限制不把服务搞崩就行
    oyama
    oyama
    Sep 26, 2025 via iPhone
    93
    ja3 已经能绕了,虾皮就是用的 ja3 ,老好绕了
    777777
    777777
    Sep 26, 2025
    94
    必须登录,然后验证手机号,增加攻击者成本,想爬的多就要加钱买账号
    llsquaer
    llsquaer
    Sep 26, 2025
    95
    生成一万个 js 不同 key 的加密脚本可以防脚本。但如果是模拟的话还是得增加前端逆向难度。不过高手基本能跑的过。就算这些都防住了。能防按键精灵之类的么?看来还是不得行。
    kuanat
    kuanat
    Sep 26, 2025❤️1
    96
    这个话题属于懂行的不愿意讲(毕竟多数都会涉及黑灰产),而不懂的基本说不到重点的那种。我就简单总结下算是抛砖引玉了。

    浏览器从来都不是可信环境,理论上没有任何办法可以稳定 100% 准确区分真人和机器。

    对抗爬虫或者 bot 的基本思路就是提高攻击成本。比如登录之后才能看的,就有帐号成本,限制访问频率的,就有 ip 成本,甚至 cf 五秒盾也可以理解为采集时间成本。

    想要提高攻击者的成本,那防御方也要付出代价,比如设想个极端场景,防御方要求所有请求都过一遍 recaptcha ,那防御方确实提高了攻击方的打码成本,但自己也付出了带宽成本,以及造成不便损失正常客户的成本。所以防御方更希望的是,有纯软件的方案,只付出开发成本和少量的运营成本,就能大幅提高攻击者成本的方法。于是就有了各种检测技术。

    我这里随便列举一些常见的技术,以及攻击方的应对策略:

    1. tls 指纹检测

    因为浏览器和常见 python/go 等编程语言的底层 tls 库是不一样的,通过在流量入口做 ssl offloading 的时候,顺便检测一下请求中的 kex (密钥交互)配置,就能起到很好的筛选作用。

    应对方式也比较简单,替换 tls 库或者伪装成特定的指纹配置即可。

    2. 额外校验字段

    同样是针对看请求直接构造接口数据的。在常规业务字段之外增加校验字段,一般由 js 代码执行后产生。

    这种可以通过 cdp 控制浏览器或者跑无头等方式绕过。

    3. 浏览器环境检测

    基本上是前一种方法的增强版。既然攻击者能用真浏览器来伪装,那就检测那些不合理的参数,比如窗口 viewport 大小,一些特定的全局对象等等。到了这一步,基本上标配都是 js 混淆了。

    对于水平不高的检测,有经验的攻击者大部分能根据调用栈定位到关键函数方法,绕开检测逻辑直接生成校验字段。

    4. js vmp 混淆

    基本上这就是最后的防线。把前面各种检测技术打包起来放到 js 中,然后用 js 代码写个虚拟机,再把原始的代码编译成虚拟机指令。这个对抗手段是针对人的,就是拉高对攻击者的技术门槛要求,逆向 vmp 类混淆是要比前面都难的。

    从攻击者的角度来看,硬怼 vmp 还原 ast 指令也不是不行,就是累,而且没办法保证这次逆向出来了能用多久。毕竟防守方的策略是,换个混淆参数就是新虚拟机了。

    所以多数情况下都是把 js 代码完整扒出来,把它当黑盒来调用。因为外部 js 环境和浏览器不一样,缺少浏览器的很多对象,所以有个专门的说法叫“补环境”,让 js 代码能正常运行。想要知道 js 代码都检测了哪些环境信息,又有一些插桩、自吐的应对策略。

    就算实在搞不定,专门搞一个浏览器,就真实地跑校验字段生成,然后把结果给其他自动化的部分用也可以。


    大致上就是这样了。对抗的路线最终都会转换成为“对抗成本”的问题。而且从技术原理上说,攻击方是永远可以看到代码的(尽管可能是混淆版本),所以根本藏不住。
    streamrx
    streamrx
    Sep 27, 2025 via iPhone
    97
    这东西是非常复杂的一套方案
    ragnaroks
    ragnaroks
    Sep 27, 2025
    98
    这个问题本质上是怎么在客户端做防御,看看网络游戏清一色上内核级反作弊就知道是不现实的了
    lnbiuc
    lnbiuc
    Sep 27, 2025
    99
    TLS 指纹 JA3 指纹 JA3S 指纹
    y1y1
    y1y1
    Sep 27, 2025 via iPhone
    100
    楼上大牛那么多,谁来教教我怎么过 cf 验证?
    1  2  
    ❮ ❯
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2872 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 137ms · UTC 12:19 · PVG 20:19 · LAX 04:19 · JFK 07:19
    ♥ Do have faith in what you're doing.