1
RV0n 2019-09-05 08:43:02 +08:00
可以看一下 <noscript> 这个标签
|
3
kyuuseiryuu 2019-09-05 08:56:33 +08:00 via iPhone 1
用随便一个 spa 框架写网站,不支持 js 打开自然就是一片空白。
|
4
mengkun 2019-09-05 09:05:18 +08:00
你是想防爬虫?
|
5
z939211863 2019-09-05 09:06:01 +08:00
有浏览器不支持 js 么?
|
6
momocraft 2019-09-05 09:08:08 +08:00 1
X 问题是什么
> #5 w3m 就支持 |
7
redbuck 2019-09-05 09:09:21 +08:00
进入页面用 JS 插入一个 iframe 引你得页面
|
8
redbuck 2019-09-05 09:09:39 +08:00
@z939211863 用户可以禁用
|
9
qiaobeier 2019-09-05 09:11:00 +08:00
没啥好办法,只能渲染时使用各种方法检查客户端是否禁用脚本,再存入 cookie。至于第一次,尝试使用 noscript 或者 css 去做些预处理。
|
10
lqzhgood 2019-09-05 09:18:24 +08:00
CSS 默认 display: none ~
只显示一个 <noscript> 告诉用户没有 JS 不能显示呗。 没有上下文 不知道 LZ 需求是啥~ 我感觉是一个 A B 问题。LZ 有 A 问题觉得 B 能解,问了半天 B 结果发现 C 才是最优解。 |
11
passerbytiny 2019-09-05 09:19:12 +08:00
很明显,楼主想要的是“不给 js 权限就不让用”,你们回答“怎么在浏览器不支持 js 的时候友好显示”,跑题了。
|
12
yitd OP @passerbytiny 你是明白人
|
13
GzhiYi 2019-09-05 09:23:05 +08:00
LZ 的意思是后端判断前端有没开启 js 支持吧?
|
16
asdjgfr 2019-09-05 09:29:24 +08:00 1
先返回一个静态页,里面用 js 获取客户端的相关信息 ua,时间戳之类的,然后调用接口,如果接口收到了就把真实的内容返回出去,否则就返回一个没权限的页面呗
|
17
jinliming2 2019-09-05 09:29:39 +08:00 via iPhone
@z939211863 可以禁用。一般为了严格安全的时候都是直接禁用 js 的。tor 默认禁用不安全 js。
|
18
kyuuseiryuu 2019-09-05 09:33:19 +08:00
JS 执行是在获取数据之后的事儿,除非浏览器能在请求的时候主动告诉你支不支持 JS 执行。
你这需求有点像:能不能知道刮刮卡有没有中奖,没中奖就不刮。 |
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> |
21
jinliming2 2019-09-05 09:38:45 +08:00 via iPhone
逻辑很简单,如果浏览器是第一次访问这个网站,那么默认肯定是不会带是否开启 js 的信息的,所以后端就无法知道,为了避免将代码发给未开启 js 的用户,实际上就直接给个带 src 的 script 标签,不支持 js 的浏览器自然不会下载这个 js,也就避免了把代码发给浏览器。
这也是唯一的办法,因为后端无法知道是否启用了 js,所以只能一视同仁,不返回真实内容,楼主用的 cookie 也只是变通办法,相当于给开启了 js 的浏览器打“标记”。 |
22
yitd OP @jinliming2 不过好像怎么判断的时候还是需要 cookie 来通信。。
|
24
cmdOptionKana 2019-09-05 09:40:52 +08:00
可以用 js 加载内容( ajax ),如果用户禁用 js 当然无法加载内容啦,但只能对付普通用户。
但是你防普通用户干嘛?要防也是防专门爬站的,但这就是另一个话题了,反爬说起来就太多东西了。 |
25
also24 2019-09-05 09:46:37 +08:00 1
我隐隐的感觉这是个 X-Y 问题。
所以虽然前面已经有人问过,还是想再确认一下: 楼主你是确实业务中希望对不支持 JS 或禁用了 JS 的用户区别对待,还是想反爬虫? 单纯的区别对待,可以做的方案其实非常多,但是如果是为了反爬虫,那么很多方案并不能带来更多的复杂度。 |
26
Kusoku 2019-09-05 09:48:30 +08:00
可以用客户端重定向,不支持 js 就没法定向到实际页面
|
27
optional 2019-09-05 09:50:24 +08:00
你想在代码还没到浏览器之前就判断浏览器,这不可能。
不过实现效果很简单,由先到浏览器的代码进行后续加载即可。 |
29
Kusoku 2019-09-05 09:51:33 +08:00
www.xxx.com 返回的是包含重定向 js 代码的空白页面,能执行就定向到 www.xxx.com/xxx 的实际页面
|
30
arrow8899 2019-09-05 09:51:56 +08:00
先返回一个空白页面+一段 js (直接重定向);如果不支持 js,那么就不会重定向;支持的话 就会到正常页面。
|
31
imdong 2019-09-05 09:52:38 +08:00 1
判断是否支持 JS 都需要客户端判断,所以刷新一下应该无法避免了...
方案一:访问页面,传递 cookies 到客户端,noscript 标签内放一个图片,服务器如果收到这个图片的请求就标记为不支持。 方案二:页面内 head 头一秒后跳转,如果支持 js 就把跳转地址改成另一个页面。 |
32
blankfire 2019-09-05 09:55:19 +08:00
黑产?很多小黄网关掉 JS 就无法显示出广告了
|
33
icebreaker12 2019-09-05 09:55:59 +08:00
重定向+1,搞个只有最简单判断逻辑的前置页,成功后重定向到网站。 类似知乎百度跳转外链前的统计页
|
34
nihiue 2019-09-05 09:56:34 +08:00 via Android
不支持 js 的浏览器是?
|
35
jugelizi 2019-09-05 09:56:36 +08:00
楼主就是单纯的想反爬
能不能好好问问题 |
36
nnnToTnnn 2019-09-05 10:02:24 +08:00
|
37
arrow8899 2019-09-05 10:06:33 +08:00
现在所有浏览器都支持 js 了吧,主动禁用 js 除外;如果是想反爬,你这么做没有任何作用。
所以楼主你最原始的需求是什么? |
38
xiangyuecn 2019-09-05 10:12:50 +08:00
在不支持 js 的地方,需要执行 js 告诉服务器这个地方不支持 js。抱歉,这是不是死循环 就是 断头路 😎
可以在 js 里面埋暗桩(更新勤快些),同一个客户端(如何识别?)多次访问,但没有触发暗桩中的行为(如 某些请求、某些变化的数据),直接 block 此客户端(如 ip ) |
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 检查完在跳正式网站 |
41
podel 2019-09-05 14:23:08 +08:00
话说 你直接弄一段 html。然后 js 自动加载的时候 移除。没有移除的 就是 不支持 js 了呗。
|
42
littiefish 2019-09-05 17:13:02 +08:00 via iPhone
装了 noscript
|
43
maomaomao001 2019-09-05 17:14:30 +08:00
@kyuuseiryuu 这个想法已经落后了,写完 spa 后 , 加上 ssr, 没 js 照样能看到渲染内容
|
44
maomaomao001 2019-09-05 17:17:55 +08:00
@yitd 你这个,从原理都不通吧,
就像无论用浏览器发请求 还是你自己在 terminal 里 curl 这个地址一样 都是会返回( html )内容的, 你能做到的,只有根据 cookie,ua,用户 ip 等信息来特殊处理了 无论如何,你都不可能拿到用户禁用的 js (除非你给用户终端装病毒?) |
45
kyuuseiryuu 2019-09-05 17:19:21 +08:00
@maomaomao001 #43 本来就想让不能执行 JS 的情况不可见,为什么还要去做 SSR ?
|
46
Aruforce 2019-09-05 17:44:41 +08:00
所有的内容都由 JS 渲染加载啊....
不执行 JS 肯定获取不到其他内容... 但是还是会返回一个 HTML 文本...(这个 HTML 内容就如#7 所写) |
47
killerv 2019-09-05 18:08:05 +08:00
#46 说的不错,用 js 渲染页面应该就行了。
|
48
yitd OP @imdong
@passerbytiny @asdjgfr @laravel @jinliming2 @optional @maomaomao001 今天已经解决了,方法已补充 留给万一以后需求的人看 |