没搞懂 HTTP 请求的安全验证,求指导!

2022-06-02 17:02:24 +08:00
 Eyon

比如请求 https://abc.com/api ,服务器那边可能需要一个验证,比如要求 headers.Authorization === "abcdefg",

那么,也就是说我在请求是,必须在 headers 中添加 Authorization = 'abcdefg'就可以成功请求,这个逻辑没错吧?

问题是:

比如自己做个网站,浏览器打开首页,就需要从服务器提供的 API 中获取一些数据以供后续服务,API 那边定义是要求 headers.Authorization === 'abcdefg',所以前端写 axios 请求的时候,就加上了 authorization="abcdefg"这个请求,正常工作没有问题。可是,由于在浏览器中的请求标头中可以看到 Authorization:abcdefg 这个明文信息,任何人都可以看到,那不就是任何人都可以通过其他任何方式(比如 postman)来请求这个数据了吗?

当然,你可能会说加密。即便吧 abcdefg 加密成任何形式的密钥,但始终能在请求标头中看到加密后的密钥,用这个密钥发送请求依然可以成功,意义何在呢?

当然,这个问题一定是我自己哪里逻辑没搞清楚。求解答!

4096 次点击
所在节点    问与答
81 条回复
Eyon
2022-06-02 17:42:33 +08:00
@huxins 那么,你是不是可以非常非常非常非常轻松的获取到 V2EX 的帖子列表 JSON 数据?
Eyon
2022-06-02 17:43:45 +08:00
@leo108 比如我服务器要求 token=abcdefg ,但是怎么让客户端知道我服务器要求 token=abcdefg ,让它能够用这个 abcdefg 来请求数据呢?
iyear
2022-06-02 17:45:40 +08:00
@Eyon #19 用户电脑上的浏览器发请求和 postman 发请求本质就是一样的啊,最终都是调 socket 发起 TCP 连接。极端一点的比喻,你的服务器能判断用户电脑用的水电还是核电吗
iyear
2022-06-02 17:46:41 +08:00
你的方向应该在反爬虫上,而不是鉴权机制上
Eyon
2022-06-02 17:47:36 +08:00
@iyear 那么,你是不是可以非常非常非常非常轻松的获取到 V2EX 的帖子列表 JSON 数据?
foolnius
2022-06-02 17:48:09 +08:00
Authorization 是拿来鉴权的,不是给你反 postman 的
如果你不想要用户拿这个 Authorization 就可以任意请求接口,要加其他辅助手段,来保证你这个请求参数用了一次就不能再用第二次。比方说浏览器 Web 端加一个混淆过代码的生成签名函数,每次请求对参数特征进行签名,服务端校验签名合法性就好了。当然,不存在绝对安全,只是提高逆向签名函数过程的难度而已,简单的如楼上所说加验证码也行,根据接口数据的重要性,权衡消耗资源,针对选择不同的方法就好。
FanError
2022-06-02 17:48:11 +08:00
看半天楼主原来想要的是反爬,且只能让用户在浏览器中访问。
huxins
2022-06-02 17:48:28 +08:00
@Eyon 本就如此,权限只是限制特定用户(比如:张三),而不是特定用户的特定方式(比如:张三的 Postman )
iyear
2022-06-02 17:48:38 +08:00
@Eyon #25 一大堆 V2EX 的第三方客户端,有些官方不提供的 api 不都是抓包抓下来的吗
foolnius
2022-06-02 17:52:51 +08:00
@Eyon #19
“比如,我做个图书网站,里面有 10000 本书。”
你觉得这 10000 本书数据重要吗?如果你觉得重要,你就可以上很高级别的反爬虫策略。
@Eyon #25
“是不是可以非常非常非常非常轻松的获取到 V2EX 的帖子列表 JSON 数据?”
本来就是很轻松获取的啊,站长甚至提供了 API 文档 /help/api
你要理解数据的重要程度,有没有必要让你花费资源(客户端资源、服务器资源)去做这些反爬虫策略
Eyon
2022-06-02 17:54:23 +08:00
@iyear 我的意思不是抓包那么复杂。

而是,用户既然看得到这个 Authorization: Basic xxxxxxxx 这一串,可以直接在 Postman 中请求得到 json 格式的帖子列表,而用不着抓包,这个不是很尴尬吗?
iyear
2022-06-02 17:56:44 +08:00
@Eyon #31 你要看到 Au 这一行不就是抓包吗? f12 就是浏览器抓包呀。。就是这么轻松简单
Pastsong
2022-06-02 17:58:41 +08:00
@Eyon 你刚刚描述了抓包的过程....
你要真的你的前端代码是明文跑在用户机器上的,用户想怎么跑就能怎么跑,你客户端能拿到的数据用户也能用其他方式拿到。想反抓包反爬有别的手段,和 HTTP 无关
Eyon
2022-06-02 18:01:58 +08:00
@iyear
@Pastsong

为什么我看 V2EX 的请求头中没有 Authorization 这一行,看不到这一行是不是代表站长一定没有用 Authorization 这个参数来鉴权获取本帖的评论列表?
iyear
2022-06-02 18:04:11 +08:00
@Eyon 那也可以用 cookie 呀。。具体放什么头里自己定的嘛
otakustay
2022-06-02 18:04:29 +08:00
@Eyon #14 这属于权限管理,他当然可以拿着去用,就算你改成 cookie 他也能拿着 cookie 去用。他 postman 发的请求也代表他的操作,有权限的自然让他成功,没权限的自然要拦下来,并没有什么特别
Angdo
2022-06-02 18:07:26 +08:00
blackeeper
2022-06-02 18:13:45 +08:00
我猜楼主应该是写前端的。
请求一个接口 https://abc.com/api ,需要做一个简单的认证,那么最简单的办法是只要有人 headers 中添加 Authorization = xx 或者 yy ,就可以表示这个是谁,并且认证通过后是一个合法请求。
那么不管你是用浏览器,还是用 postman 只要带了正确的 Authorization 头部那么这就是一个合法请求,跟用什么客户端没有任何关系。
另,https 协议别人是看不到请求的 url ,header 和 body ,只能看到域名 abc.com 。所以不存在其他人能看到一说,只有你自己看见
crab
2022-06-02 18:18:23 +08:00
Authorization 带上时间戳签名
Akitora
2022-06-02 18:22:16 +08:00
只要这个数据是给人看的,绝对的反爬就是不存在的
只是成本问题+1

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

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

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

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

© 2021 V2EX