只重定向来自浏览器的请求,而不重定向其他应用或者系统层的 80 请求?
1
MerlinShieh 2020-06-23 10:15:34 +08:00
user-agent ?
|
2
sayitagain 2020-06-23 10:19:50 +08:00
不考虑伪造,user-agent 就行咯
|
3
iawes OP @sayitagain
@MerlinShieh 但是比如魅族手机连上 WiFi 时,会做 WiFiportal 认证判断 wifi 是否能访问网络,访问一个 mwzu 的网址,UA 里根本区分不出来吧? Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.32 Safari/537.36 会被认定为是 chrome |
4
belin520 2020-06-23 10:37:19 +08:00
@iawes #3 Android 的判断条件是判断是否有 'andr' 字符串。你这个 UA 里面不是标准的 Android 客户端的 UA
|
5
imn1 2020-06-23 10:49:57 +08:00
除非有设备判断,不然单靠 header 只有 UA 、cookies 相关
|
6
iawes OP @belin520 这个 UA 是魅族手机连接 wifi 时候发出来的。
大神的意思是用 Mozilla + Android/Windows NT/Apple 这样判断? |
7
icy37785 2020-06-23 10:58:23 +08:00 via iPhone
这是没办法判断的。
|
8
MerlinShieh 2020-06-23 10:58:41 +08:00
@iawes 移动设备,我记得好像可以判断设备端的,就像你用手机访问 web 和用 pc 访问 web,手机端的会跳到手机版网页的,pc 端的就是默认网页
|
9
MerlinShieh 2020-06-23 11:03:08 +08:00
@MerlinShieh
@iawes request.headers['User-Agent'] 可以返回 User-Agent 的字符串 识别是否为手机客户端的只要识别 User-Agent 中是否有"Mobile"字段即可 这个不知道符不符合你的需求 |
10
hronro 2020-06-23 11:08:46 +08:00 3
你要知道不仅仅是 Header,整个 HTTP 都是纯文本的,而这些文本是 HTTP 请求的发送方可以完全自定义的。所以你想要准却判断所有 HTTP 请求的 Client 类型,这个从原理上讲就是不可能做到的,只能粗略判断遵守规范,带有准确的 User-Agent 的请求。
你之前提到的魅族手机连上 WiFi 时的请求,应该就不属于能准确判断的范围。 |
11
crella 2020-06-23 12:33:43 +08:00 via Android
我想问问有没有一些反爬措施会检查 header 里的 accept:gzip,deflate 语句?因为绝大多数浏览器都支持这个,但是爬虫教程一般不写这个语句。哪怕实际上不使用压缩模式传送数据,也可以要求 web 客户端支持 gzip 模式。
|
12
crella 2020-06-23 12:34:22 +08:00 via Android
楼主可以看看 header 里面的 set-cookie
|
13
beastk 2020-06-23 12:53:12 +08:00 via iPhone
上面不是有 x11 嘛,你可以做一个 agent 数据集,实在不行加上 js 获取分辨率等其他要素综合判断。
|
14
sayitagain 2020-06-23 12:53:29 +08:00
@iawes 得看你拿到的是否是标准的 ua
附我手机的 ua 这是自带浏览器的 ua Mozilla/5.0 (Linux; Android 10; SAMSUNG SM-N9760) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/11.2 Chrome/75.0.3770.143 Mobile Safari/537.36 这是微信内嵌浏览器的 ua Mozilla/5.0 (Linux; Android 10; SM-N9760 Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045227 Mobile Safari/537.36 MMWEBID/8989 MicroMessenger/7.0.15.1680(0x27000FB3) Process/tools We 但 ua 这东西伪造门槛太低了...不考虑伪造,你要做的就是尽量多的收集 ua 里的关键字对应什么. |
15
kop1989 2020-06-23 12:54:23 +08:00
从正途上来说:不严谨的判断,就像楼上们说的 user agent 。
但还有一些方法属于侧面判断,比如关键字:浏览器指纹 |
17
iawes OP @MerlinShieh 不是判断是否手机,就是判断是否浏览器即可
|
18
kop1989 2020-06-23 15:15:11 +08:00
@iawes #16 嗯,这个看你需求而定。关键就是不复杂的判断方法是不准确的。上面也都说了,所有常规的浏览器特征都可以轻易伪造。如果你对准确性有很高要求,就需要我说的那些了。
|
19
iawes OP @crella 不是为了防爬虫呢
不过这是一种思路,只有浏览器才会 accept gzip 格式?如果是操作系统或 app 自己的 80 端口传输数据不会有这个对吗? |
21
also24 2020-06-23 15:38:16 +08:00
|
24
also24 2020-06-23 16:13:13 +08:00
楼主你补充的其实仍然不是原始需求。
一般需要做类似实现的,其实就是为了做 Portal 认证。 目前常见的操作系统都会自动发送相应的请求来检测是否需要进行 Portal 认证。 但是从你的描述来看,你似乎认为系统自动检测 Portal 认证的请求会干扰你的实现。 所以需要你说明一下更原始的需求,来判断为什么会产生这种想法。 |
25
iawes OP @also24 确实你说的这个地方有影响,但是不是向你说的那样。iOS/Android 在连接 WiFi 时都会进行 portal 认证来判断当前网络是否正常,但是这个认证也是 HTTP 请求,而我是不想拦截这类请求。
我只想拦截从浏览器发出的 HTTP 请求。 包括在抖音播放视频时也会先发 HTTP 请求,对于这类由 APP 发出的我也不要拦截。 |
26
also24 2020-06-23 16:46:11 +08:00
|
27
iyaozhen 2020-06-23 17:05:40 +08:00
你主要是想区分浏览器和 app native 的请求吧
这个感觉不好区分,要不然你判断是 html 啥的再 302 呗 |
30
felixlong 2020-06-23 20:19:43 +08:00
其实你反过来想想。把市面上所有浏览器的 User-Agent 收集一下,标识出来就行.
|
31
supermoonie 2020-06-23 20:41:59 +08:00 via iPhone
@kop1989 跨浏览器指纹🤪
|
32
opengps 2020-06-23 20:47:26 +08:00
在我这个博客页面右侧搜索 ua :https://www.opengps.cn/Blog/Index.aspx
|
33
xiangyuecn 2020-06-23 21:02:27 +08:00
wifi dog ?需要刷路由器固件,任何没有授权访问的设备的 http 请求都会被重定向到认证页面,不过 https 就歇菜了
|
34
Xusually 2020-06-23 21:14:46 +08:00
|
35
hallDrawnel 2020-06-23 21:24:57 +08:00
你还是没有描述清楚你要干什么。如果要做认证,那就用 Portal 认证的方式。
|
36
kernelpanic 2020-06-23 21:28:27 +08:00
|
37
yousabuk 2020-06-24 02:12:18 +08:00 via iPhone
幸亏 User-Agent 可以修改,要不然 macOS Safari 用 中国银行 的网银还必须安装密码控件。
话说:密码控件的意义何在? |
38
Rxianbei 2020-06-24 10:18:45 +08:00 via Android
不可能的,http 请求头都是可以改的
|
40
iawes OP @felixlong 太多了。。 我找到一个网站,专门做这个统计的,结果吓死人的,光 IE 的 UA 就要 100 多万个。https://developers.whatismybrowser.com/useragents/
|
41
also24 2020-06-24 11:41:29 +08:00
@iawes #39
你给出的已经是一种『实现方式』,并不是『原始需求』。 X-Y Problem 之所以会产生沟通问题,就是因为提问者自己猜测了一种实现方式,然后基于这种实现方式进行提问。 这会导致解决问题的可行方案范围缩窄,或者第三方对问题的错误理解。 这样说,你想要用这个判断来完成什么动作?你 302 到的页面希望展示什么信息? 为什么对于 APP 、系统的 API 请求可以考虑放过?是因为它们无法展示信息嘛? 这涉及到你更根源的需求,是希望做登录鉴权?行为管理?欢迎页面? 或者仅仅是为了传达一个信息给首次使用的人? |
42
iawes OP @xiangyuecn wifidog 是连接 wifi 时候实现重定向,这个不难。
|
43
iawes OP @hallDrawnel 不是认证,认证的话倒简单多了。
用户第一次打开 浏览器(重点) 的时候跳转,其他情况不跳转。 |
45
hugedata 2020-06-24 14:01:24 +08:00
我没做过,但是看看这个思路是否可以:
对每个 http 的 80 端口连接都进行 mac 过滤,如果已知列表里没有,则直接返回 302,否则,什么都不做。你把这个已知 mac 放 ram 里。应该比源站响应要快。 |
47
iawes OP @felixlong 好像是 o,但是还有 chrome,firefix,QQ browser,360 browser 呢
|
48
hugedata 2020-06-28 13:58:32 +08:00
只能 header 检查了。
|