• 请不要在回答技术问题时复制粘贴 AI 生成的内容
yitd
V2EX  ›  程序员

有没有什么方法判断浏览器是否支持 js

  •  
  •   yitd · Sep 5, 2019 via iPhone · 6696 views
    This topic created in 2466 days ago, the information mentioned may be changed or developed.
    目前解决方案是进入页面用 js 设置 cookie 后刷新
    PHP 判断没有 cookie 就不允许访问
    想了一晚上总感觉不完美,有没有别的解决方案?
    效果要达到不支持 js 就不允许访问
    Supplement 1  ·  Sep 5, 2019
    不是需要友好显示给用户的问题,是需要不支持 js 就不返回任何内容给浏览器,包括源码
    Supplement 2  ·  Sep 7, 2019
    今天已经想到不用 cookie 的方法,PHP 判断 post 数据存在就返回正常页面!不存在就输出表单,js 自动提交 post 表单 exit
    48 replies    2019-09-07 23:49:18 +08:00
    RV0n
        1
    RV0n  
       Sep 5, 2019
    可以看一下 <noscript> 这个标签
    yitd
        2
    yitd  
    OP
       Sep 5, 2019 via iPhone
    @RV0n 这个不行 不是想要的效果 需要判断不支持 js 就不返回任何内容给浏览器
    Chemist
        3
    Chemist  
       Sep 5, 2019 via iPhone   ❤️ 1
    用随便一个 spa 框架写网站,不支持 js 打开自然就是一片空白。
    mengkun
        4
    mengkun  
       Sep 5, 2019
    你是想防爬虫?
    z939211863
        5
    z939211863  
       Sep 5, 2019
    有浏览器不支持 js 么?
    momocraft
        6
    momocraft  
       Sep 5, 2019   ❤️ 1
    X 问题是什么

    > #5
    w3m 就支持
    redbuck
        7
    redbuck  
       Sep 5, 2019
    进入页面用 JS 插入一个 iframe 引你得页面
    redbuck
        8
    redbuck  
       Sep 5, 2019
    @z939211863 用户可以禁用
    qiaobeier
        9
    qiaobeier  
       Sep 5, 2019
    没啥好办法,只能渲染时使用各种方法检查客户端是否禁用脚本,再存入 cookie。至于第一次,尝试使用 noscript 或者 css 去做些预处理。
    lqzhgood
        10
    lqzhgood  
       Sep 5, 2019
    CSS 默认 display: none ~
    只显示一个 <noscript> 告诉用户没有 JS 不能显示呗。

    没有上下文 不知道 LZ 需求是啥~
    我感觉是一个 A B 问题。LZ 有 A 问题觉得 B 能解,问了半天 B 结果发现 C 才是最优解。
    passerbytiny
        11
    passerbytiny  
       Sep 5, 2019
    很明显,楼主想要的是“不给 js 权限就不让用”,你们回答“怎么在浏览器不支持 js 的时候友好显示”,跑题了。
    yitd
        12
    yitd  
    OP
       Sep 5, 2019 via iPhone
    @passerbytiny 你是明白人
    GzhiYi
        13
    GzhiYi  
       Sep 5, 2019
    LZ 的意思是后端判断前端有没开启 js 支持吧?
    yitd
        14
    yitd  
    OP
       Sep 5, 2019 via iPhone
    @lqzhgood 不是显示问题,noscript 实际上网页全部内容还是给浏览器了
    yitd
        15
    yitd  
    OP
       Sep 5, 2019 via iPhone
    @GzhiYi 差不多 不支持就返回空白内容 包括源码
    asdjgfr
        16
    asdjgfr  
       Sep 5, 2019   ❤️ 1
    先返回一个静态页,里面用 js 获取客户端的相关信息 ua,时间戳之类的,然后调用接口,如果接口收到了就把真实的内容返回出去,否则就返回一个没权限的页面呗
    jinliming2
        17
    jinliming2  
       Sep 5, 2019 via iPhone
    @z939211863 可以禁用。一般为了严格安全的时候都是直接禁用 js 的。tor 默认禁用不安全 js。
    Chemist
        18
    Chemist  
       Sep 5, 2019
    JS 执行是在获取数据之后的事儿,除非浏览器能在请求的时候主动告诉你支不支持 JS 执行。
    你这需求有点像:能不能知道刮刮卡有没有中奖,没中奖就不刮。
    yitd
        19
    yitd  
    OP
       Sep 5, 2019 via iPhone
    @asdjgfr 不错,这个方法比 cookie 好一点
    laravel
        20
    laravel  
       Sep 5, 2019
    <noscript>
    <img src="https://www.liulangmao.org" alt="">
    <iframe src="https://www.liulangmao.org" frameborder="0"></iframe>
    </noscript>
    jinliming2
        21
    jinliming2  
       Sep 5, 2019 via iPhone
    逻辑很简单,如果浏览器是第一次访问这个网站,那么默认肯定是不会带是否开启 js 的信息的,所以后端就无法知道,为了避免将代码发给未开启 js 的用户,实际上就直接给个带 src 的 script 标签,不支持 js 的浏览器自然不会下载这个 js,也就避免了把代码发给浏览器。
    这也是唯一的办法,因为后端无法知道是否启用了 js,所以只能一视同仁,不返回真实内容,楼主用的 cookie 也只是变通办法,相当于给开启了 js 的浏览器打“标记”。
    yitd
        22
    yitd  
    OP
       Sep 5, 2019 via iPhone
    @jinliming2 不过好像怎么判断的时候还是需要 cookie 来通信。。
    yitd
        23
    yitd  
    OP
       Sep 5, 2019 via iPhone
    楼上回复错了不好意思

    @asdjgfr 不过好像怎么判断的时候还是需要 cookie 来通信。。
    QingXuJiaZhi
        24
    QingXuJiaZhi  
       Sep 5, 2019
    可以用 js 加载内容( ajax ),如果用户禁用 js 当然无法加载内容啦,但只能对付普通用户。

    但是你防普通用户干嘛?要防也是防专门爬站的,但这就是另一个话题了,反爬说起来就太多东西了。
    also24
        25
    also24  
       Sep 5, 2019   ❤️ 1
    我隐隐的感觉这是个 X-Y 问题。

    所以虽然前面已经有人问过,还是想再确认一下:
    楼主你是确实业务中希望对不支持 JS 或禁用了 JS 的用户区别对待,还是想反爬虫?


    单纯的区别对待,可以做的方案其实非常多,但是如果是为了反爬虫,那么很多方案并不能带来更多的复杂度。
    Kusoku
        26
    Kusoku  
       Sep 5, 2019
    可以用客户端重定向,不支持 js 就没法定向到实际页面
    optional
        27
    optional  
       Sep 5, 2019
    你想在代码还没到浏览器之前就判断浏览器,这不可能。
    不过实现效果很简单,由先到浏览器的代码进行后续加载即可。
    dfourc
        28
    dfourc  
       Sep 5, 2019
    @laravel #20 跑题了兄弟
    Kusoku
        29
    Kusoku  
       Sep 5, 2019
    www.xxx.com 返回的是包含重定向 js 代码的空白页面,能执行就定向到 www.xxx.com/xxx 的实际页面
    arrow8899
        30
    arrow8899  
       Sep 5, 2019
    先返回一个空白页面+一段 js (直接重定向);如果不支持 js,那么就不会重定向;支持的话 就会到正常页面。
    imdong
        31
    imdong  
       Sep 5, 2019   ❤️ 1
    判断是否支持 JS 都需要客户端判断,所以刷新一下应该无法避免了...

    方案一:访问页面,传递 cookies 到客户端,noscript 标签内放一个图片,服务器如果收到这个图片的请求就标记为不支持。
    方案二:页面内 head 头一秒后跳转,如果支持 js 就把跳转地址改成另一个页面。
    blankfire
        32
    blankfire  
       Sep 5, 2019
    黑产?很多小黄网关掉 JS 就无法显示出广告了
    icebreaker12
        33
    icebreaker12  
       Sep 5, 2019
    重定向+1,搞个只有最简单判断逻辑的前置页,成功后重定向到网站。 类似知乎百度跳转外链前的统计页
    nihiue
        34
    nihiue  
       Sep 5, 2019 via Android
    不支持 js 的浏览器是?
    jugelizi
        35
    jugelizi  
       Sep 5, 2019
    楼主就是单纯的想反爬
    能不能好好问问题
    nnnToTnnn
        36
    nnnToTnnn  
       Sep 5, 2019
    @asdjgfr
    @yitd

    请了解下 selenium && PhantomJS,居然有人告诉可以利用判断是否支持 js 来反爬虫,估计爬虫的人要乐了 =。=
    arrow8899
        37
    arrow8899  
       Sep 5, 2019
    现在所有浏览器都支持 js 了吧,主动禁用 js 除外;如果是想反爬,你这么做没有任何作用。
    所以楼主你最原始的需求是什么?
    xiangyuecn
        38
    xiangyuecn  
       Sep 5, 2019
    在不支持 js 的地方,需要执行 js 告诉服务器这个地方不支持 js。抱歉,这是不是死循环 就是 断头路 😎

    可以在 js 里面埋暗桩(更新勤快些),同一个客户端(如何识别?)多次访问,但没有触发暗桩中的行为(如 某些请求、某些变化的数据),直接 block 此客户端(如 ip )
    yitd
        39
    yitd  
    OP
       Sep 5, 2019
    @nnnToTnnn 没说是防爬虫吧
    auin
        40
    auin  
       Sep 5, 2019
    加个登陆页,和 cloudflare 防 ddos 原理一样

    https://www.a2hosting.com/images/uploads/knowledgebase_images/kb-cloudflare-under-attack-interstitial-page.png

    检查完在跳正式网站
    podel
        41
    podel  
       Sep 5, 2019
    话说 你直接弄一段 html。然后 js 自动加载的时候 移除。没有移除的 就是 不支持 js 了呗。
    littiefish
        42
    littiefish  
       Sep 5, 2019 via iPhone
    装了 noscript
    maomaomao001
        43
    maomaomao001  
       Sep 5, 2019
    @kyuuseiryuu 这个想法已经落后了,写完 spa 后 , 加上 ssr, 没 js 照样能看到渲染内容
    maomaomao001
        44
    maomaomao001  
       Sep 5, 2019
    @yitd 你这个,从原理都不通吧,
    就像无论用浏览器发请求
    还是你自己在 terminal 里 curl 这个地址一样
    都是会返回( html )内容的,

    你能做到的,只有根据 cookie,ua,用户 ip 等信息来特殊处理了
    无论如何,你都不可能拿到用户禁用的 js (除非你给用户终端装病毒?)
    Chemist
        45
    Chemist  
       Sep 5, 2019
    @maomaomao001 #43 本来就想让不能执行 JS 的情况不可见,为什么还要去做 SSR ?
    Aruforce
        46
    Aruforce  
       Sep 5, 2019
    所有的内容都由 JS 渲染加载啊....

    不执行 JS 肯定获取不到其他内容...

    但是还是会返回一个 HTML 文本...(这个 HTML 内容就如#7 所写)
    killerv
        47
    killerv  
       Sep 5, 2019
    #46 说的不错,用 js 渲染页面应该就行了。
    yitd
        48
    yitd  
    OP
       Sep 7, 2019 via iPhone
    @imdong
    @passerbytiny
    @asdjgfr
    @laravel
    @jinliming2
    @optional
    @maomaomao001
    今天已经解决了,方法已补充 留给万一以后需求的人看
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2964 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 89ms · UTC 04:15 · PVG 12:15 · LAX 21:15 · JFK 00:15
    ♥ Do have faith in what you're doing.