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

2019-09-05 08:30:49 +08:00
 yitd
目前解决方案是进入页面用 js 设置 cookie 后刷新
PHP 判断没有 cookie 就不允许访问
想了一晚上总感觉不完美,有没有别的解决方案?
效果要达到不支持 js 就不允许访问
5583 次点击
所在节点    程序员
48 条回复
jinliming2
2019-09-05 09:38:45 +08:00
逻辑很简单,如果浏览器是第一次访问这个网站,那么默认肯定是不会带是否开启 js 的信息的,所以后端就无法知道,为了避免将代码发给未开启 js 的用户,实际上就直接给个带 src 的 script 标签,不支持 js 的浏览器自然不会下载这个 js,也就避免了把代码发给浏览器。
这也是唯一的办法,因为后端无法知道是否启用了 js,所以只能一视同仁,不返回真实内容,楼主用的 cookie 也只是变通办法,相当于给开启了 js 的浏览器打“标记”。
yitd
2019-09-05 09:38:46 +08:00
@jinliming2 不过好像怎么判断的时候还是需要 cookie 来通信。。
yitd
2019-09-05 09:40:04 +08:00
楼上回复错了不好意思

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

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

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


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

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

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

可以在 js 里面埋暗桩(更新勤快些),同一个客户端(如何识别?)多次访问,但没有触发暗桩中的行为(如 某些请求、某些变化的数据),直接 block 此客户端(如 ip )
yitd
2019-09-05 12:45:08 +08:00
@nnnToTnnn 没说是防爬虫吧
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

检查完在跳正式网站

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/598066

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX