本节项目源码可见learn-js-obfuscator。
1.Debugger
防止生产代码在控制台中被 debugger
调试。
TIP
注意,前端防止 debugger
,只是在一定程度上阻拦调试,并不能完全阻止。
譬如 chrome
浏览器能通过 sources => Override content
来覆盖。
- 基础形式
这种形式依然能够在代码中直接看到,而不是创建了 VM
。
js
(() => {
function ban () {
setInterval(() => {
debugger
}, 50)
}
try {
ban()
} catch (err) {}
})()
- 进阶1
利用 Function
创建 VM
。
js
(() => {
function ban () {
setInterval(() => {
// eslint-disable-next-line
Function('debugger')()
}, 50)
}
try {
ban()
} catch (err) {}
})()
- 进阶2
更改 Function('debugger'){}
的写法。
js
(() => {
function ban () {
setInterval(() => {
(function () {
return false
})
.constructor('debugger')
.call()
}, 50)
}
try {
ban()
} catch (err) {}
})()
有兴趣的话,可以研究一下disable-devtool。
上述库提供了更加细致的控制 devtool
方法。
①参考文档:
②禁止调试的第三方网站:
2.Obfuscator
混淆生产代码。
对于 Javascript
混淆,可以使用 webpack-obfuscator。
另外由于 webpack-obfuscator
依赖 javascript-obfuscator,所以我们在此处声明下各自在不同 webpack
版本下的版本:
webpack4
:
webpack5
:
Before obfuscator:
After obfuscator:
3.webpack-obfuscator
可以配置 plugins
(推荐):
js
const WebpackObfuscator = require('webpack-obfuscator')
module.exports = {
plugins: [
new WebpackObfuscator ({
rotateStringArray: true
}, ['excluded_bundle_name.js'])
]
}
也可以配置 rules
:
js
const WebpackObfuscator = require('webpack-obfuscator')
module.exports = {
module: {
rules: [
{
test: /\.js$/,
exclude: [
path.resolve(__dirname, 'excluded_file_name.js')
],
enforce: 'post',
use: {
loader: WebpackObfuscator.loader,
options: {
rotateStringArray: true
}
}
}
]
}
}