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

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

  •  
  •   yitd · 2019-09-05 08:30:49 +08:00 via iPhone · 5783 次点击
    这是一个创建于 1915 天前的主题,其中的信息可能已经有所发展或是发生改变。
    目前解决方案是进入页面用 js 设置 cookie 后刷新
    PHP 判断没有 cookie 就不允许访问
    想了一晚上总感觉不完美,有没有别的解决方案?
    效果要达到不支持 js 就不允许访问
    第 1 条附言  ·  2019-09-05 09:25:26 +08:00
    不是需要友好显示给用户的问题,是需要不支持 js 就不返回任何内容给浏览器,包括源码
    第 2 条附言  ·  2019-09-07 23:43:30 +08:00
    今天已经想到不用 cookie 的方法,PHP 判断 post 数据存在就返回正常页面!不存在就输出表单,js 自动提交 post 表单 exit
    48 条回复    2019-09-07 23:49:18 +08:00
    RV0n
        1
    RV0n  
       2019-09-05 08:43:02 +08:00
    可以看一下 <noscript> 这个标签
    yitd
        2
    yitd  
    OP
       2019-09-05 08:52:44 +08:00 via iPhone
    @RV0n 这个不行 不是想要的效果 需要判断不支持 js 就不返回任何内容给浏览器
    kyuuseiryuu
        3
    kyuuseiryuu  
       2019-09-05 08:56:33 +08:00 via iPhone   ❤️ 1
    用随便一个 spa 框架写网站,不支持 js 打开自然就是一片空白。
    mengkun
        4
    mengkun  
       2019-09-05 09:05:18 +08:00
    你是想防爬虫?
    z939211863
        5
    z939211863  
       2019-09-05 09:06:01 +08:00
    有浏览器不支持 js 么?
    momocraft
        6
    momocraft  
       2019-09-05 09:08:08 +08:00   ❤️ 1
    X 问题是什么

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

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

    @asdjgfr 不过好像怎么判断的时候还是需要 cookie 来通信。。
    cmdOptionKana
        24
    cmdOptionKana  
       2019-09-05 09:40:52 +08:00
    可以用 js 加载内容( ajax ),如果用户禁用 js 当然无法加载内容啦,但只能对付普通用户。

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

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


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

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

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

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

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

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

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

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

    但是还是会返回一个 HTML 文本...(这个 HTML 内容就如#7 所写)
    killerv
        47
    killerv  
       2019-09-05 18:08:05 +08:00
    #46 说的不错,用 js 渲染页面应该就行了。
    yitd
        48
    yitd  
    OP
       2019-09-07 23:49:18 +08:00 via iPhone
    @imdong
    @passerbytiny
    @asdjgfr
    @laravel
    @jinliming2
    @optional
    @maomaomao001
    今天已经解决了,方法已补充 留给万一以后需求的人看
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1144 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 23:00 · PVG 07:00 · LAX 15:00 · JFK 18:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.