如何知道网络请求是从浏览器发出的 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
leokun
V2EX    浏览器

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    浏览器从来都不是可信环境,理论上没有任何办法可以稳定 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
        97
    streamrx  
       12 天前 via iPhone
    这东西是非常复杂的一套方案
    ragnaroks
        98
    ragnaroks  
       12 天前
    这个问题本质上是怎么在客户端做防御,看看网络游戏清一色上内核级反作弊就知道是不现实的了
    lnbiuc
        99
    lnbiuc  
       12 天前
    TLS 指纹 JA3 指纹 JA3S 指纹
    y1y1
        100
    y1y1  
       12 天前 via iPhone
    楼上大牛那么多,谁来教教我怎么过 cf 验证?
    1  2  
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2994 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 11:40 PVG 19:40 LAX 04:40 JFK 07:40
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86