V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
loveyou1
V2EX  ›  JavaScript

[有趣的问题] 关于前端请求,后端服务如何做到只响应当前站点的请求。类似于如何防爬虫...。

  •  
  •   loveyou1 · 2021-12-06 22:23:19 +08:00 · 4832 次点击
    这是一个创建于 1111 天前的主题,其中的信息可能已经有所发展或是发生改变。

    今天一个小伙伴问我:如何才能让请求能不能不饶过当前站点,比如:node 模拟当前站点的请求,是不被站点服务允许的。

    我想了想:但是似乎并不行。

    • 代码上撒毒,生成一些自定义请求头,生存的过程代码,通过压缩混合。后端验证。 [也存在破解的可能]

    • 通过特殊请求头,host ,origin ,referer [可以写入,不管用]

    大佬们对这个问题有配方吗?剧毒那种 ^__^。

    71 条回复    2021-12-07 17:54:04 +08:00
    jmllx1963
        1
    jmllx1963  
       2021-12-06 22:28:44 +08:00   ❤️ 1
    有个小想法,如果是可以登陆的,登录后建立一个 websocket 连接,请求需要 websocket 连接且 token 匹配才可以放行。🤣
    wunonglin
        2
    wunonglin  
       2021-12-06 22:29:21 +08:00
    月经贴了。答:不能
    jorneyr
        3
    jorneyr  
       2021-12-06 22:33:17 +08:00
    必须登录才让访问,登录时使用 IP 、浏览器版本、agent 等各种数据一起生成 token ,服务器判断只有有效的 token 才允许访问,其他人拿到 token 也访问不了。
    loveyou1
        4
    loveyou1  
    OP
       2021-12-06 22:35:32 +08:00
    @jmllx1963 websocket node 也能模拟
    loveyou1
        5
    loveyou1  
    OP
       2021-12-06 22:39:15 +08:00
    @jorneyr
    1. 必须登陆才能访问,我登陆完,就拷贝 cookie ,这些参数在 node 发起写进去,其实也没啥用啊,
    2. 前端生成的 token ,后端如何校验。

    上述的两个方式,我只要知道一个请求,我就能通过 node 在重新发一遍吧...。
    ZE3kr
        6
    ZE3kr  
       2021-12-06 22:41:33 +08:00 via iPhone
    用 webassembly 加密请求
    eason1874
        7
    eason1874  
       2021-12-06 22:43:17 +08:00
    HTTP Headers 太容易伪造了,加入 SSL 检查,不是常见的就要求验证,验证 Cookie 跟 SSL 信息绑定,这样在浏览器验证过再复制 Headers 去给爬虫工具用也不能行

    设备风控只是增加难度,防不了那些用无头浏览器采集的。行为风控比较重要,看看某宝,动不动就让你验证,验证过了,多访问几个页面又让你验证
    ericls
        8
    ericls  
       2021-12-06 22:47:31 +08:00 via iPhone
    HTTP 是 stateless
    loveyou1
        9
    loveyou1  
    OP
       2021-12-06 22:52:34 +08:00
    @eason1874
    这句话能说扽具体点吗,不太理解实现的过程 :验证 Cookie 跟 SSL 信息绑定,这样在浏览器验证过再复制 Headers 去给爬虫工具用也不能行。
    看看某宝,动不动就让你验证,验证过了,多访问几个页面又让你验证:
    几个页面多次验证就是 IP 和请求次数。但我了解的验证,后端生成不包含前端逻辑的是可以做到不能绕过的,比如后端直接生成验证码图片,但是比如什么前端验证码,滑块啊,这些都是前端做的,本质上都是能从接口拿到验证码,或者直接绕过的吧。
    loveyou1
        10
    loveyou1  
    OP
       2021-12-06 22:53:49 +08:00
    @ZE3kr 了解过一点,没有具体应用的地方,不知道我说的对不对,这玩意就是通过 C C++来写一些 js 函数,但是本质上加密的过程,node 端也能模拟吧。
    loveyou1
        11
    loveyou1  
    OP
       2021-12-06 22:55:40 +08:00
    @ericls so ?
    dcsuibian
        12
    dcsuibian  
       2021-12-06 23:08:35 +08:00   ❤️ 2
    答案是,不能。再怎么做也只是增加成本罢了,完全防住很难,收益太低
    不说普通的发送 http 请求了,如果用 Puppeteer 和 playwright 这种模拟用户操作浏览器的爬虫能怎么防呢
    zyEros
        13
    zyEros  
       2021-12-06 23:17:08 +08:00 via Android
    可以试试对于频繁请求的用户或 IP 加个人机识别验证,比如友验( fastyotest.com
    ericls
        14
    ericls  
       2021-12-06 23:28:40 +08:00 via iPhone
    @ericls 请求和请求之间是没有关系的
    agdhole
        15
    agdhole  
       2021-12-07 00:05:22 +08:00
    给用户一个远程桌面(
    3dwelcome
        16
    3dwelcome  
       2021-12-07 00:27:47 +08:00 via Android
    以前讨论过,ssl 指纹技术可防。
    node 和浏览器的 ssl 指纹是完全不一样的。
    ch2
        17
    ch2  
       2021-12-07 00:36:56 +08:00
    @3dwelcome #16 那我用 chrome 插件爬呢
    ch2
        18
    ch2  
       2021-12-07 00:39:02 +08:00
    剧毒方法只能是以误杀普通人为代价,进行严格的风控
    不过如果你数据很少的话这个就是纯粹恶心普通用户,因为高手终究是能把你的数据全拿走的
    eason1874
        19
    eason1874  
       2021-12-07 01:28:54 +08:00   ❤️ 1
    @loveyou1 #9 HTTP 是应用层,SSL/TLS 是传输层,HTTP 请求工具通常不关心 SSL 的具体过程

    所以当你从 Chrome Copy as cURL 去 Shell 发起请求的时候,你只是复制了一个完整的 HTTP 请求,并不包括 SSL 的部分,而不同软件的 SSL 支持是不一样的,于是乎你可以通过一些 SSL 信息判断出设备发生了变化,比如 $ssl_ciphers 和 $ssl_curves
    XiLingHost
        20
    XiLingHost  
       2021-12-07 01:48:01 +08:00
    每次由服务器端编译并签名生成限时可用的二进制指令流发送到客户端执行,然后由它来负责解析用户的请求,每个请求完成都重新生成新的密钥对和更换请求解析逻辑,这样用户如果想要逆向就必须在会话有效期内完成二进制逆向工程
    你可以连带鼠标和键盘消息事件相应和图像绘制都由你下发的二进制指令来完成
    XiLingHost
        21
    XiLingHost  
       2021-12-07 01:48:43 +08:00
    实际上你可以理解为 vm over http
    miaoge520
        22
    miaoge520  
       2021-12-07 01:53:46 +08:00 via Android
    这个 cf 应该能解决的
    binux
        23
    binux  
       2021-12-07 01:54:36 +08:00
    如果你不能控制客户端,则不能,因为你以为后端服务是和前端通信的,其实不是,前端是在指导浏览器和后端服务通信的。如果你无法控制用户使用的浏览器,任何人都可以使用对应的浏览器进行爬虫行为。
    liuidetmks
        24
    liuidetmks  
       2021-12-07 08:45:28 +08:00
    @3dwelcome
    @eason1874 浏览器是开源的,把这块 SSL 伪造的一样应该可以实现.
    可以尝试使用 activeX npapi 对接口进行验签。

    看你权衡了
    eason1874
        25
    eason1874  
       2021-12-07 09:13:56 +08:00
    @liuidetmks #24 是的,只是增加难度。用无头浏览器跑爬虫,在设备环境上可以模拟得跟真实用户一模一样了,防它们只能靠行为风控意思意思
    zxcslove
        26
    zxcslove  
       2021-12-07 09:14:06 +08:00   ❤️ 1
    非游戏体验类的软件搞这一套真是.................
    Juszoe
        27
    Juszoe  
       2021-12-07 09:35:59 +08:00   ❤️ 2
    反爬和爬虫是成本战,没有绝对防御,如果爬虫的成本大于数据本身的价值,自然就不会有什么爬虫了
    Te11UA
        28
    Te11UA  
       2021-12-07 09:46:21 +08:00
    一般根据 cookies 做限速即可,没办法限制的
    dxxzst
        29
    dxxzst  
       2021-12-07 10:04:36 +08:00
    禁止接口跨域访问( Access-Control-Allow-Origin )可以避免接口任意被调用,但是如果直接以浏览网页的形式爬取(比如 puppeteer ),那基本无解。
    wu67
        30
    wu67  
       2021-12-07 10:09:14 +08:00
    上面已经说的很清楚了, 基本无解. 限定必须登录, 并且带 token 访问才正常返回资源就行了.
    robinlovemaggie
        31
    robinlovemaggie  
       2021-12-07 10:12:24 +08:00
    最成熟的办法就是关闭 web 的流量,只接受 APP 请求,因为脱壳的难度和爬虫的难度不是一个数量级。
    AyaseEri
        32
    AyaseEri  
       2021-12-07 10:23:38 +08:00
    Headless Chrome: 猜猜我是谁
    teem
        34
    teem  
       2021-12-07 10:27:18 +08:00
    做过微信支付吗?看看微信如何防止伪装请求的。
    loveyou1
        35
    loveyou1  
    OP
       2021-12-07 10:28:29 +08:00
    看了大家的回复,总结就是基本无解,只能控制。
    loveyou1
        36
    loveyou1  
    OP
       2021-12-07 10:29:38 +08:00
    @teem 客户端不一样吧,他们自己搞了个浏览器,无头浏览器是不行的,其他方式也是能轻松拦截的。
    teem
        37
    teem  
       2021-12-07 10:38:06 +08:00
    @loveyou1 拦截是可以...不是讨论怎么防止伪装请求吗?
    loveyou1
        38
    loveyou1  
    OP
       2021-12-07 10:39:04 +08:00
    @teem 那我也不可能写一个浏览器出来呀 v__v, 常规的,大家都能搞的。
    teem
        39
    teem  
       2021-12-07 10:49:33 +08:00
    @loveyou1 可能聊岔了,微信除了自己调起收银台等内部请求可能是基于微信浏览器内核搞的,大部分都是可以通过 SDK/HTTPS 请求的,包括支付回调(微信主动请求你的服务器)都是暴露出来的。大体逻辑就是生签&验签,可以具体看看: https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay4_0.shtml
    Itoktsnhc
        40
    Itoktsnhc  
       2021-12-07 10:57:21 +08:00
    反爬是个持久战,就是攻防双方看谁的成本高。
    1. 先把限速什么的常规方法加上看下效果
    2. 再然后触发条件的时候可以考虑返回随机生成的脏数据;
    3. 复杂一点可以参考大众点评猫眼类的字体反爬。
    loveyou1
        41
    loveyou1  
    OP
       2021-12-07 10:59:29 +08:00
    @teem 聊岔了,聊岔了...。 你说的是防止伪装请求,安全问题。 我问的是如何只响应当前站点的请求,爬虫类问题。看了文档,文档是解决安全的问题,并不能防止通过其他方式这个实现这个过程。
    loveyou1
        42
    loveyou1  
    OP
       2021-12-07 11:01:55 +08:00
    @liuidetmks 看起来双方都无解,都看成本。
    loveyou1
        43
    loveyou1  
    OP
       2021-12-07 11:02:30 +08:00
    shyangs
        44
    shyangs  
       2021-12-07 12:42:15 +08:00
    用 chrome 插件寫的爬蟲,要怎麼防?
    2i2Re2PLMaDnghL
        45
    2i2Re2PLMaDnghL  
       2021-12-07 12:55:35 +08:00
    终极命题:如何防止人工爬虫?就是雇用一百个廉价小时工,不断地访问你的网站并把信息抄录下来
    次终极命题:如何防止小叽访问你的网站?
    yaphets666
        46
    yaphets666  
       2021-12-07 13:44:24 +08:00
    @loveyou1 频繁的请求某个接口就人机验证,都是这么干的
    fisherman0459
        47
    fisherman0459  
       2021-12-07 14:01:32 +08:00
    可以考虑字体混淆(随机字体生成+随机映射+随机字体扭曲)+定期更新随机策略.
    不过也是防不了人工和 OCR, Fingerprints + 限流 + 代理池检测可能有点帮助.
    如果只针对登录用户的数据请求, 以上策略绑定到用户再加上接口流量检测及时账号自动管控这样应该能防止大部分的异常请求吧.
    enrolls
        48
    enrolls  
       2021-12-07 14:03:23 +08:00
    参考友商做法,淘宝是如何做到的?
    人类和爬虫之间有何差异,时间间隔(频率)?
    投毒?友军定时访问瞄点? Referer 有什么骚操作?
    浏览器与程序代码的访问差异? Chrome ,Firefox 的请求头是如何排序的?
    fisherman0459
        49
    fisherman0459  
       2021-12-07 14:09:29 +08:00
    觉得爬虫这件事如果从爬取事件本身入手可能会好一点.
    感觉数据都可以造,低成本数据像 headers 这种造起来成本很低, 防起来感觉意义不是特别大,
    但是如果数据本身的造假难度很高的话, 可能很容易会影响正常的用户使用体验.
    aino
        50
    aino  
       2021-12-07 14:10:47 +08:00
    借楼问一下吧,tls 指纹怎样绕过,伪造 tls 指纹啥的没过,不知道是不是我姿势有问题,某云盾
    fisherman0459
        51
    fisherman0459  
       2021-12-07 14:12:36 +08:00
    @aino #33
    aino
        52
    aino  
       2021-12-07 14:13:25 +08:00
    @fisherman0459 #51 已经沾染过了,没过,不知道是不是我姿势问题,还是说目前某云盾升级了策略
    Kinnice
        53
    Kinnice  
       2021-12-07 15:10:41 +08:00
    web 远程桌面
    打开你的 url 是一个远程桌面,远程桌面里面开着你的网页,不可切换不可退出。
    loveyou1
        54
    loveyou1  
    OP
       2021-12-07 15:24:23 +08:00
    @aino 你在爬什么,发出来我们研究研究 👀,看看能判几年😂。
    loveyou1
        55
    loveyou1  
    OP
       2021-12-07 15:25:05 +08:00
    @Kinnice 那这还是给客户用的吗😂,程序员用都要骂爹。
    loveyou1
        56
    loveyou1  
    OP
       2021-12-07 15:26:35 +08:00
    @Kinnice 在说,我知道这个远程桌面的的网页地址,本地是不是也可以打开?
    loveyou1
        57
    loveyou1  
    OP
       2021-12-07 15:28:29 +08:00
    @enrolls
    人类和爬虫之间有何差异,时间间隔(频率)?
    现在都在搞 AI 了,这个时间间隔,基本可以模拟出像人的操作吧。
    投毒?友军定时访问瞄点? Referer 有什么骚操作?
    不懂:友军定时访问瞄点
    不懂:Referer 有什么骚操作? 是指?
    浏览器与程序代码的访问差异?
    现在基本没啥区别吧
    Chrome ,Firefox 的请求头是如何排序的?
    Kinnice
        58
    Kinnice  
       2021-12-07 15:29:32 +08:00
    @loveyou1 不能,相当于部署在这个远程桌面所在机器的内网。 有部分业务还真是这样。拦截了常见的各种快捷键,也别想什么调试。甚至连 url 栏都不让你看见。
    aino
        59
    aino  
       2021-12-07 15:33:39 +08:00
    @loveyou1 #54 你是不是觉得你很幽默?别动不动抖机灵好嘛
    vacuitym
        60
    vacuitym  
       2021-12-07 15:33:58 +08:00
    rsa 加密
    loveyou1
        61
    loveyou1  
    OP
       2021-12-07 15:46:03 +08:00
    @aino 无趣
    loveyou1
        62
    loveyou1  
    OP
       2021-12-07 15:46:47 +08:00
    @Kinnice 这业务,银行内部系统都没到这个程度吧😄
    Kinnice
        63
    Kinnice  
       2021-12-07 15:50:48 +08:00
    @loveyou1 想一下 ATM 机
    指定的输入手段
    不知道 url
    无法调试
    无法抓包(或者是抓包与真实业务无关)
    无法反编译
    loveyou1
        64
    loveyou1  
    OP
       2021-12-07 15:51:41 +08:00
    @yaphets666 我一直对于人机验证存在质疑,人机验证的过程需要调接口或者前端创建,人机验证的结果是去调接口,我为啥不能直接绕过这一步。
    比如:
    数字验证码,如果是前端生成的,那一点意义没有,我直接就可以绕过,如果后端返回的,我从接口里面也可以拿到,然后绕过去。
    滑块验证码,人机验证码,不是类似吗
    我觉得有用的是,后台直接返回一个图片,前端可能难一点的需要通图像识别去做,或者短信是最靠谱的,但是有成本。
    yaphets666
        65
    yaphets666  
       2021-12-07 15:55:36 +08:00
    @loveyou1 验证码当然不是前端生成的,是后端返的,而且验证码确实是图片.
    上面大佬们说的很清楚的,什么方法都有破解的办法,只是增加成本.
    比如说你说的图像识别,我可以给图片加干扰项,并且的各种各样的干扰每隔一段时间就换一种,你就得一直修改程序.
    但是我作为官方,比如说淘宝,我可承受的成本是比你大的多的.所以你爬不了淘宝的东西.
    lakehylia
        66
    lakehylia  
       2021-12-07 16:04:11 +08:00
    @2i2Re2PLMaDnghL 验证码搞个高数题或者微积分题,你总不能雇几百个数学很好的大学生吧
    0o0o0o0
        67
    0o0o0o0  
       2021-12-07 16:22:55 +08:00
    @loveyou1
    验证码就是人机验证的一种啊。。。
    前端生成或者后端返回基本没人这么做吧。。。
    都是要把结果返回到后端进行验证。
    loveyou1
        68
    loveyou1  
    OP
       2021-12-07 16:30:43 +08:00
    @0o0o0o0 对啊,这个返回结果这个过程是透明的呀,
    nekoneko
        69
    nekoneko  
       2021-12-07 16:45:02 +08:00
    @dxxzst #29 跨域这玩意儿只是浏览器帮你检查,写服务,脚本直接调你 api 跨域一点用都没有
    agui2200
        70
    agui2200  
       2021-12-07 17:42:48 +08:00
    fingerprintjs 可以识别一丢丢
    pkoukk
        71
    pkoukk  
       2021-12-07 17:54:04 +08:00
    如果是小网站,想一个别人都没用过的奇葩手段,增加反爬成本就行了。
    上面猫眼那个 css 加密想法就不错,
    之前站里有个老哥弄过图片加密,好像是把 js 文件伪装成图片放到 cdn 上,收到图片之后再重新解析回 js 加载。
    搞点这种类似的东西,只要你没有特别大的价值,就没人闲的没事爬你了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2861 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 12:46 · PVG 20:46 · LAX 04:46 · JFK 07:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.