V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iawes
V2EX  ›  程序员

请教大神们如和根据 http header 判断来的请求是是不浏览器?

  •  
  •   iawes · 2020-06-23 10:13:15 +08:00 · 4358 次点击
    这是一个创建于 781 天前的主题,其中的信息可能已经有所发展或是发生改变。

    只重定向来自浏览器的请求,而不重定向其他应用或者系统层的 80 请求?

    第 1 条附言  ·  2020-06-23 15:53:50 +08:00
    经 @also24 的建议,我还是描述下原始需求比较好:

    原始动机:
    对连接在路由器上的手机、PC,手机、PC HTTP:80 请求,如何在路由器上对监听到的 HTTP 报文判断是否来自浏览器?

    可能还不清晰,最原始需求:
    当手机、PC 第一次打开浏览器访问网站时,路由器对其拦截进行返回 302 重定向到指定网址?
    48 条回复    2020-06-28 13:58:32 +08:00
    MerlinShieh
        1
    MerlinShieh  
       2020-06-23 10:15:34 +08:00
    user-agent ?
    sayitagain
        2
    sayitagain  
       2020-06-23 10:19:50 +08:00
    不考虑伪造,user-agent 就行咯
    iawes
        3
    iawes  
    OP
       2020-06-23 10:35:09 +08:00
    @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
    belin520
        4
    belin520  
       2020-06-23 10:37:19 +08:00
    @iawes #3 Android 的判断条件是判断是否有 'andr' 字符串。你这个 UA 里面不是标准的 Android 客户端的 UA
    imn1
        5
    imn1  
       2020-06-23 10:49:57 +08:00
    除非有设备判断,不然单靠 header 只有 UA 、cookies 相关
    iawes
        6
    iawes  
    OP
       2020-06-23 10:56:14 +08:00
    @belin520 这个 UA 是魅族手机连接 wifi 时候发出来的。
    大神的意思是用 Mozilla + Android/Windows NT/Apple 这样判断?
    icy37785
        7
    icy37785  
       2020-06-23 10:58:23 +08:00 via iPhone
    这是没办法判断的。
    MerlinShieh
        8
    MerlinShieh  
       2020-06-23 10:58:41 +08:00
    @iawes 移动设备,我记得好像可以判断设备端的,就像你用手机访问 web 和用 pc 访问 web,手机端的会跳到手机版网页的,pc 端的就是默认网页
    MerlinShieh
        9
    MerlinShieh  
       2020-06-23 11:03:08 +08:00
    @MerlinShieh
    @iawes
    request.headers['User-Agent'] 可以返回 User-Agent 的字符串
    识别是否为手机客户端的只要识别 User-Agent 中是否有"Mobile"字段即可

    这个不知道符不符合你的需求
    hronro
        10
    hronro  
       2020-06-23 11:08:46 +08:00   ❤️ 3
    你要知道不仅仅是 Header,整个 HTTP 都是纯文本的,而这些文本是 HTTP 请求的发送方可以完全自定义的。所以你想要准却判断所有 HTTP 请求的 Client 类型,这个从原理上讲就是不可能做到的,只能粗略判断遵守规范,带有准确的 User-Agent 的请求。

    你之前提到的魅族手机连上 WiFi 时的请求,应该就不属于能准确判断的范围。
    crella
        11
    crella  
       2020-06-23 12:33:43 +08:00 via Android
    我想问问有没有一些反爬措施会检查 header 里的 accept:gzip,deflate 语句?因为绝大多数浏览器都支持这个,但是爬虫教程一般不写这个语句。哪怕实际上不使用压缩模式传送数据,也可以要求 web 客户端支持 gzip 模式。
    crella
        12
    crella  
       2020-06-23 12:34:22 +08:00 via Android
    楼主可以看看 header 里面的 set-cookie
    beastk
        13
    beastk  
       2020-06-23 12:53:12 +08:00 via iPhone
    上面不是有 x11 嘛,你可以做一个 agent 数据集,实在不行加上 js 获取分辨率等其他要素综合判断。
    sayitagain
        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 里的关键字对应什么.
    kop1989
        15
    kop1989  
       2020-06-23 12:54:23 +08:00
    从正途上来说:不严谨的判断,就像楼上们说的 user agent 。
    但还有一些方法属于侧面判断,比如关键字:浏览器指纹
    iawes
        16
    iawes  
    OP
       2020-06-23 15:12:44 +08:00
    @kop1989 不需要那么复杂的。。只有判断是不是浏览器就行
    iawes
        17
    iawes  
    OP
       2020-06-23 15:13:15 +08:00
    @MerlinShieh 不是判断是否手机,就是判断是否浏览器即可
    kop1989
        18
    kop1989  
       2020-06-23 15:15:11 +08:00
    @iawes #16 嗯,这个看你需求而定。关键就是不复杂的判断方法是不准确的。上面也都说了,所有常规的浏览器特征都可以轻易伪造。如果你对准确性有很高要求,就需要我说的那些了。
    iawes
        19
    iawes  
    OP
       2020-06-23 15:17:28 +08:00
    @crella 不是为了防爬虫呢
    不过这是一种思路,只有浏览器才会 accept gzip 格式?如果是操作系统或 app 自己的 80 端口传输数据不会有这个对吗?
    iawes
        20
    iawes  
    OP
       2020-06-23 15:32:57 +08:00
    @kop1989 嗯,我这里不考虑伪造不考虑爬虫。80%的的能区分出来是否是浏览器就行了,简单一些的。
    also24
        21
    also24  
       2020-06-23 15:38:16 +08:00
    直觉上又是个 X-Y Problem,建议楼主直描述一下原始需求。

    https://coolshell.cn/articles/10804.html
    iawes
        22
    iawes  
    OP
       2020-06-23 15:48:08 +08:00
    @also24 对我还是描述下原始需求比较好
    iawes
        23
    iawes  
    OP
       2020-06-23 15:55:12 +08:00
    @also24 感谢,X-Y Problem 也适合在搜索引擎上找答案
    also24
        24
    also24  
       2020-06-23 16:13:13 +08:00
    楼主你补充的其实仍然不是原始需求。

    一般需要做类似实现的,其实就是为了做 Portal 认证。
    目前常见的操作系统都会自动发送相应的请求来检测是否需要进行 Portal 认证。

    但是从你的描述来看,你似乎认为系统自动检测 Portal 认证的请求会干扰你的实现。
    所以需要你说明一下更原始的需求,来判断为什么会产生这种想法。
    iawes
        25
    iawes  
    OP
       2020-06-23 16:29:30 +08:00
    @also24 确实你说的这个地方有影响,但是不是向你说的那样。iOS/Android 在连接 WiFi 时都会进行 portal 认证来判断当前网络是否正常,但是这个认证也是 HTTP 请求,而我是不想拦截这类请求。
    我只想拦截从浏览器发出的 HTTP 请求。
    包括在抖音播放视频时也会先发 HTTP 请求,对于这类由 APP 发出的我也不要拦截。
    also24
        26
    also24  
       2020-06-23 16:46:11 +08:00
    @iawes #25
    所以我才说你还是没有讲你的原始目的……

    因为一般拦截这些请求的目的就是做 Portal 认证,我需要搞清楚你和这种情况的目的差异在什么方面。
    iyaozhen
        27
    iyaozhen  
       2020-06-23 17:05:40 +08:00
    你主要是想区分浏览器和 app native 的请求吧

    这个感觉不好区分,要不然你判断是 html 啥的再 302 呗
    iawes
        28
    iawes  
    OP
       2020-06-23 17:06:56 +08:00
    @also24 只有在用户在手机 /PC 打开浏览器浏览网页的时候,才在路由器上拦截 HTTP 重定向
    also24
        29
    also24  
       2020-06-23 17:23:08 +08:00   ❤️ 1
    @iawes #28
    我放弃了……
    felixlong
        30
    felixlong  
       2020-06-23 20:19:43 +08:00
    其实你反过来想想。把市面上所有浏览器的 User-Agent 收集一下,标识出来就行.
    supermoonie
        31
    supermoonie  
       2020-06-23 20:41:59 +08:00 via iPhone
    @kop1989 跨浏览器指纹🤪
    opengps
        32
    opengps  
       2020-06-23 20:47:26 +08:00
    在我这个博客页面右侧搜索 ua :https://www.opengps.cn/Blog/Index.aspx
    xiangyuecn
        33
    xiangyuecn  
       2020-06-23 21:02:27 +08:00
    wifi dog ?需要刷路由器固件,任何没有授权访问的设备的 http 请求都会被重定向到认证页面,不过 https 就歇菜了
    Xusually
        34
    Xusually  
       2020-06-23 21:14:46 +08:00
    看下来有点同情#29 @also24
    你确实没有描述清楚原始需求,那么根据你目前的描述,quick answer:
    只凭借 http header,不能。
    hallDrawnel
        35
    hallDrawnel  
       2020-06-23 21:24:57 +08:00
    你还是没有描述清楚你要干什么。如果要做认证,那就用 Portal 认证的方式。
    kernelpanic
        36
    kernelpanic  
       2020-06-23 21:28:27 +08:00
    yousabuk
        37
    yousabuk  
       2020-06-24 02:12:18 +08:00 via iPhone
    幸亏 User-Agent 可以修改,要不然 macOS Safari 用 中国银行 的网银还必须安装密码控件。

    话说:密码控件的意义何在?
    Rxianbei
        38
    Rxianbei  
       2020-06-24 10:18:45 +08:00 via Android
    不可能的,http 请求头都是可以改的
    iawes
        39
    iawes  
    OP
       2020-06-24 11:32:31 +08:00
    @also24 我感觉我讲的挺清楚了,可能是我的表达能力不好。。
    反正就是路由器上判断 HTTP 包是哪里来的
    iawes
        40
    iawes  
    OP
       2020-06-24 11:33:51 +08:00
    @felixlong 太多了。。 我找到一个网站,专门做这个统计的,结果吓死人的,光 IE 的 UA 就要 100 多万个。https://developers.whatismybrowser.com/useragents/
    also24
        41
    also24  
       2020-06-24 11:41:29 +08:00
    @iawes #39
    你给出的已经是一种『实现方式』,并不是『原始需求』。

    X-Y Problem 之所以会产生沟通问题,就是因为提问者自己猜测了一种实现方式,然后基于这种实现方式进行提问。
    这会导致解决问题的可行方案范围缩窄,或者第三方对问题的错误理解。


    这样说,你想要用这个判断来完成什么动作?你 302 到的页面希望展示什么信息?
    为什么对于 APP 、系统的 API 请求可以考虑放过?是因为它们无法展示信息嘛?

    这涉及到你更根源的需求,是希望做登录鉴权?行为管理?欢迎页面?
    或者仅仅是为了传达一个信息给首次使用的人?
    iawes
        42
    iawes  
    OP
       2020-06-24 12:33:58 +08:00
    @xiangyuecn wifidog 是连接 wifi 时候实现重定向,这个不难。
    iawes
        43
    iawes  
    OP
       2020-06-24 12:35:28 +08:00
    @hallDrawnel 不是认证,认证的话倒简单多了。
    用户第一次打开 浏览器(重点) 的时候跳转,其他情况不跳转。
    felixlong
        44
    felixlong  
       2020-06-24 13:50:01 +08:00
    @iawes 你确定? IE 只需要检查是否包含 MSIE 不就好了?
    hugedata
        45
    hugedata  
       2020-06-24 14:01:24 +08:00
    我没做过,但是看看这个思路是否可以:
    对每个 http 的 80 端口连接都进行 mac 过滤,如果已知列表里没有,则直接返回 302,否则,什么都不做。你把这个已知 mac 放 ram 里。应该比源站响应要快。
    iawes
        46
    iawes  
    OP
       2020-06-24 14:59:44 +08:00
    @hugedata 对每个 http 的 80 端口

    重点不是每个 http 都是来自浏览器的 request
    iawes
        47
    iawes  
    OP
       2020-06-24 15:01:27 +08:00
    @felixlong 好像是 o,但是还有 chrome,firefix,QQ browser,360 browser 呢
    hugedata
        48
    hugedata  
       2020-06-28 13:58:32 +08:00
    只能 header 检查了。
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2487 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 45ms · UTC 09:44 · PVG 17:44 · LAX 02:44 · JFK 05:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.