请教大神们如和根据 http header 判断来的请求是是不浏览器? - V2EX
请不要在回答技术问题时复制粘贴 AI 生成的内容
iawes

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

  •  
  •   iawes Jun 23, 2020 6313 views
    This topic created in 2154 days ago, the information mentioned may be changed or developed.

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

    Supplement 1    Jun 23, 2020
    经 @also24 的建议,我还是描述下原始需求比较好:

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

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

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

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

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

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

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

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

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

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

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


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

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

    重点不是每个 http 都是来自浏览器的 request
    iawes
        47
    iawes  
    OP
       Jun 24, 2020
    @felixlong 好像是 o,但是还有 chrome,firefix,QQ browser,360 browser 呢
    hugedata
        48
    hugedata  
       Jun 28, 2020
    只能 header 检查了。
    About     Help     Advertise     Blog     API     FAQ     Solana     942 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 123ms UTC 22:42 PVG 06:42 LAX 15:42 JFK 18:42
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86