事情是这样的
今天老板走过来,拍了拍我的肩膀:"咱们的网站代码不能让人随便看,你想个办法,谁要是敢打开控制台,就让他见识见识社会的险恶。"
我寻思着,这不就是防君子不防小人吗?但老板发话了,咱得整活啊!
方案一:无限debugger,卡到你怀疑人生
setInterval(function() {
check()
}, 1000);
var check = function() {
function doCheck(a) {
if (("" + a / a)["length"] !== 1 || a % 20 === 0) {
(function() {}["constructor"]("debugger")())
} else {
(function() {}["constructor"]("debugger")())
}
doCheck(++a)
}
try {
doCheck(0)
} catch (err) {}
};
check();原理是啥呢?
简单说就是:这代码跟个熊孩子似的,一直在那"debugger!debugger!debugger!"地喊。你要是开了控制台,它就在那不停地暂停、暂停、暂停,就像你打游戏的时候你妈一直在旁边喊"吃饭了"一样烦人。
但是! 这玩意儿有个致命缺点——它自己也会把自己累死。因为一直在递归调用,CPU占用蹭蹭往上涨,用户电脑风扇转得跟要起飞似的。而且人家高手来了,右键点个"永不在此暂停",这招就废了。
方案二:日志陷阱,钓鱼执法
function toDevtools(){
let num = 0;
let devtools = new Date();
devtools.toString = function() {
num++;
if (num > 1) {
window.location.href = "http://www.fly63.com" // 直接送你去鬼屋
}
}
console.log('', devtools);
}
toDevtools();这招妙在哪呢?
你想啊,正常人谁会没事干打开控制台看日志?但凡打开控制台的,十有八九是来"参观学习"的。这代码就像在门口放了个陷阱:你没开门(没开控制台),啥事没有;你一开门,直接给你传送走,跳到别的网站去。
原理贼简单:console.log 打印对象的时候,如果控制台关着,它就不干活;一旦控制台打开,它就得把对象显示出来,这时候就会调用 toString 方法。我们就在这个方法里做手脚,发现有人来了立马跑路。
但缺点也很明显:有些人就是手贱,开了控制台又关了,再开一次,第二次触发就直接gg了。而且万一用户清空了控制台或者浏览器抽风,这招就失效了。
方案三:加密通话,看不懂就对了
if(window.location.href.indexOf('#debug')==-1){
setInterval(function(){
(function (a) {return (function (a) {return (Function('Function(arguments[0]+"' + a + '")()'))})(a)})('bugger')('de', 0, 0, (0, 0));
}, 1000);
}看到这代码,我第一反应是:"这写的什么玩意儿?"
第二反应是:"嗯,就是要这个效果!"
原理:其实就是把 debugger 拆开了揉碎了,用字符串拼接、函数嵌套、Function 构造器各种花里胡哨的方式重新组装。你一眼看过去根本不知道它在干嘛,但是一运行,控制台就炸了。
这招的精华在于:代码写得越乱,别人越难改。就像一个学霸故意把字写得跟鬼画符似的,你抄都抄不明白。
但是:这玩意儿容易把自己玩死。如果没控制好频率,浏览器直接卡死,用户只能强制关掉页面,然后骂一句"什么垃圾网站"。
说了这么多,到底该用哪个?
讲真,以上所有方法,都只能防住小学生,防不住大学生。
真正的高手,打开控制台的第一件事就是禁用所有 debugger 语句,或者直接用无痕模式、用 curl 抓数据,你这些招数在人家眼里就跟小孩子过家家一样。
所以我的建议是:
千万别用无限循环那一套,太耗性能了,用户还没被防住呢,自己先被用户投诉了。
用方案二(日志陷阱),性能开销小,不会影响正常用户。
配合一点小技巧,比如检测到控制台打开就清空
console.log的内容,或者在控制台输出个"哥们别看了,真没啥好看的"。
最后说点掏心窝子的话
前端安全,永远都是魔高一尺道高一丈。你写再牛逼的反调试,人家开个无痕模式、装个插件,分分钟给你破了解。
真正应该做的:
敏感逻辑放后端
重要的接口加签名
核心算法混淆但别过度
至于检测开发者工具这玩意儿,就当个乐子玩玩得了。别把时间花在跟"黑客"较劲上,多写点业务代码,早点下班才是正事!
评论