起因

在某次爬虫(科学获取网站资讯数据)的时候,我打开了该网站的控制台,通过Network 和Sources 两个Tab选项,我发现很容易就调试出了它的接口请求参数,当时就整个一洋洋得意。
但是我转念一想,如果是我自己的网站,我不希望别人也可以这样轻而易举地调试我的页面,我应该怎么防止呢?

预防手段

在开发过程中,我们通常会在页面上打很多断点用来调试,我突发奇想,如果有人打开页面的控制台,我让他一直处于debugger当中,这样不就让他没法进行下一步了吗?

这个简单,几行代码的事情

(() => {
  setInterval(() => {
    debugger;
  }, 100);
})();

这段代码的作用是:通过一直处于debugger状态来阻塞你程序的执行,没办法在Source Tab中对js进行加断点,没办法继续调试程序的执行逻辑。
但是
Sources Tab选项中,我们可以添加Ignore List来过滤掉我们加的debugger
image.png

这样设置,页面中的debugger就不生效了…

但是,只要思想不滑坡,困难总比方法多

(() => {
  setInterval(() => {
    Function("debugger")();
  }, 100);
})();

Function生成的debugger会在每一次执行的时候都开启一个临时的js文件,而你的Ignore List只能遇到一次加一次,永远落后我的脚步😛

说干就干

既然这样,我不如直接写个webpack插件,给每个.js文件都加上这段话,岂不是美滋滋~

核心代码:

const { ConcatSource } = require('webpack-sources')

class AddDbugJs {
  constructor () {}

  apply (compiler) {
    compiler.hooks.afterCompile.tapAsync({
      name: 'AddDbugJs',
    }, (compilation, callback) => {
      let assetNames = Object.keys(compilation.assets)
      for (const name of assetNames) {
        if (name.endsWith('.js')) {
          let dbug = `setInterval(() => {(function () {return false;}["constructor"]("debugger")["call"]());}, 100);`
          compilation.updateAsset(
            name,
            old => new ConcatSource(old, '\n', dbug),
          )
        }
      }
      callback()
    })
  }
}

module.exports = AddDbugJs

在项目中使用它:

const AddDbugJs = require('add-dbug-js')
module.exports = {
  devServer: {},
  configureWebpack: {
    plugins:
      process.env.NODE_ENV !== 'production'
        ? []
        : [new AddDbugJs()],
  },
}

这就成了 🥳