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

2021-12-06 22:23:19 +08:00
 loveyou1

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

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

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

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

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

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

所以当你从 Chrome Copy as cURL 去 Shell 发起请求的时候,你只是复制了一个完整的 HTTP 请求,并不包括 SSL 的部分,而不同软件的 SSL 支持是不一样的,于是乎你可以通过一些 SSL 信息判断出设备发生了变化,比如 $ssl_ciphers 和 $ssl_curves
XiLingHost
2021-12-07 01:48:01 +08:00
每次由服务器端编译并签名生成限时可用的二进制指令流发送到客户端执行,然后由它来负责解析用户的请求,每个请求完成都重新生成新的密钥对和更换请求解析逻辑,这样用户如果想要逆向就必须在会话有效期内完成二进制逆向工程
你可以连带鼠标和键盘消息事件相应和图像绘制都由你下发的二进制指令来完成

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

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

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

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

© 2021 V2EX