nodejs axios拦截器取消 拦截js请求_js请求结果拦截机器


前言

任何网页开发者出于对自己网页的保护,都不想自己的前端代码被他人窃取或者抄袭。虽然我们平时都在忙着往代码里面写BUG,但是依然阻止他人对你代码的觊觎。

别人知道你代码的逻辑,就可以有很多的钻空子机会。于是有了下面常见的操作:

  • 爬虫程序
  • 拦截网页请求和伪造请求
  • 秒杀、抢票、刷票等等

我们知道这些操作的前提,就是深刻分析你网页的逻辑。没有这个基础,那么这些都无法正常完成,所以反调试是防御攻击的第一部分。也是最重要的护甲,脱了这层护甲,后果将不可设想。

接下来,我们一起聊一聊反调试的方式方法。

目录:

  1. 常见反调试方式及实现分析
  2. 其他反调试方式及实现分析

常见反调试方式及实现分析

我们印象中常见的反调试,有如下几种方式:

  • 代码混淆
  • 禁用网页代码审查
  • 页面关键数据动态生成

我们来分析下,这些基本方式的有效性及实现方式。

1. 禁用网页代码审查

最低级的方式,就是禁用网页代码审查,这中只能拦截掉那些刚入门的前端程序猿或者是稍微懂点web的普通用户。

具体实现方式:

  • 禁用 F12 按键
  • 禁用鼠标右键
  • 禁用组合快捷键
  • Windows: `Ctrl` + `Shift` + `i`
  • Mac: `⌥` + `⌘` + `i`

这种方式很常见,具体实现代码我就不进行展开了,大家网站上搜索下就有。

2. 页面关键数据动态生成

这种主要用于防范图片和内容被直接抓取,作为一名前端宅男程序猿,在现实生活中没有找到心中那一个她(不过现在已经找到了),只能靠爬虫征服网页上的漂亮小姐姐。

有很多有能力的选手,已经爬过某国外大型视频网站 `某Hub` 网, 国内某大型图片网站 `某蛋` 网,还有选手爬了`某音`所有发短视频的小姐姐等等,这些都可以在程序猿大型社交网站 `Github` 上找到最后结果和源码。

最有印象的就是`某蛋`网,之前都是将所有图片以 `<img src="xx" />` 的形式直接放在页面上,但是耗不住大量程序猿的热爱,疯狂开启爬虫程序,最后不得不改为这种动态方式。

具体实现方式:

  • 服务端渲染
  • 懒加载图片资源
  • 给对应的资源标签加上标识 ID
  • 之后通过 JS 进行延迟请求加载图片
  • 请求的图片存在对应的 ID 进行拼接
  • 页面只给出缩略图,只有用户点击后才可以看到清晰大图

上述方式的具体实现,我就不在累赘阐述了,大家可以自行搜索。这种方式页面比较低级的处理手段,实际上你可以通过 `NETWORK`

看到所有图片的请求地址:


nodejs axios拦截器取消 拦截js请求_代码混淆_02



插个题外话,我们可以以知乎图片地址举例,看看图片地址如何处理:

首页的内容缩略图片地址:<https://pic2.zhimg.com/50/v2-74c7e543e65043a9a8f9606c6d206583_400x224.jpg>

  • `https://pic2.zhimg.com`:为固定存在图片资源的仓库
  • `50`:表示需要图片大小尺寸
  • `v2-74c7e543e6503a9a8f9606c6d206583`:表示图片ID
  • `400x224`:表示图片的像素规格。大部分公司的图片都是支持裁图功能的,直接下载原图费时费力,而且大概率用不上。

再如广告位图片地址:<https://pic1.zhimg.com/70/v2-a417121cb82188d8d532f12aa86e7ab8.jpg>


3. 代码混淆

大部分情况下,我们都会进行代码混淆处理。只有部分网站不会做混淆,例如:`中国移动`,`旧版12306`等网站,体现出了自己的代码自信。

其中印象深刻的当属中国移动网站,为什么是它了?因为曾经我登陆该网站的时候,JS报错了。出于程序猿的本能,我就打开了调试工具。一调试我就发现了新大陆。我觉得中国移动代码写的特别好,好在那里?

  • 注释清晰,描述详细。
  • 代码特别亲民,人人都能看懂。
  • BUG 分配到人,都会写上自己的大名,以示负责。
  • 可维护强,无论是谁都能在原有基础上修复和新增功能。

不好的地方,有点吹毛求疵,就是没有代码格式化,我们来欣赏下吧。

代码加密解密方法:


nodejs axios拦截器取消 拦截js请求_js请求结果拦截机器_03


网站登陆状态码 API 回传:


nodejs axios拦截器取消 拦截js请求_nodejs axios拦截器取消_04


顺着这些注释,最后我成功的登陆了网页,报错也没了,更多代码欣赏可以去 `10086` 首页参考观摩。

顺带插一句:

  • 代码写出来不是给机器去执行的,而是给人看的。
  • 代码易于阅读,可维护性强,应该是我们作为程序猿的基本职业操守。

基本实现:

  • 通过 webpack 的打包处理分拆代码
  • 常用代码混淆 JS 库如:Javascript-obfuscator,UglifyJS等
  • 究极版代码加密:Encode any JavaScript program to Japanese style emoticons (^_^),JSF**K 等

当然也有反解密的啦! aadecode - Decode encode-as-aaencode JavaScript program. ['_']

最后,但是也是最重要的一点,这些混淆加密有好也有坏:

  • 不利于自己进行生产调试,可能需要对照源码进行处理
  • 会加重代码的体积,因为可能掺杂了大量的无用代码

当然有取必有舍,要看自己权衡啦!其他反调试操作,请听下回分解。

  1. 前端JS代码如何进行反调试操作?(上)
  2. 前端JS代码如何进行反调试操作?(下)