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

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

  •  
  •   yitd · Sep 5, 2019 via iPhone · 7346 views
    This topic created in 2617 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
    RV0n
    Sep 5, 2019
    1
    可以看一下 <noscript> 这个标签
    yitd
    yitd
    OP
    Sep 5, 2019 via iPhone
    2
    @RV0n 这个不行 不是想要的效果 需要判断不支持 js 就不返回任何内容给浏览器
    Chemist
    Chemist
    Sep 5, 2019 via iPhone❤️1
    3
    用随便一个 spa 框架写网站,不支持 js 打开自然就是一片空白。
    mengkun
    mengkun
    Sep 5, 2019
    4
    你是想防爬虫?
    z939211863
    z939211863
    Sep 5, 2019
    5
    有浏览器不支持 js 么?
    momocraft
    momocraft
    Sep 5, 2019❤️1
    6
    X 问题是什么

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

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

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

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

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


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

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

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

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

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

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

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

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

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