友链提交
请认真填写以下信息,谢谢!

博客信息

(请填写完整的网址,例如:https://www.example.com)
(贵站展示本站链接的页面地址,一般是友链页面,填写后将自动验证友链关系有效性)
(用于抓取文章)
(用于接收通知)

Post

老板让我防黑客,我反手写了个"自爆程序"

事情是这样的 今天老板走过来,拍了拍我的肩膀:"咱们的网站代码不能让人随便看,你想个办法,谁要是敢打开控制台,就让他见识见识社会的险恶。" 我寻思着,这不就是防君子不防小人吗?但老板发话了,咱得整活啊! 方案一:无限debugger,卡到你怀疑人生 setInterval(function()

编程技术 阅读 22 点赞 0 评论 1

事情是这样的

今天老板走过来,拍了拍我的肩膀:"咱们的网站代码不能让人随便看,你想个办法,谁要是敢打开控制台,就让他见识见识社会的险恶。"

我寻思着,这不就是防君子不防小人吗?但老板发话了,咱得整活啊!

方案一:无限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 抓数据,你这些招数在人家眼里就跟小孩子过家家一样。

所以我的建议是:

  1. 千万别用无限循环那一套,太耗性能了,用户还没被防住呢,自己先被用户投诉了。

  2. 用方案二(日志陷阱),性能开销小,不会影响正常用户。

  3. 配合一点小技巧,比如检测到控制台打开就清空 console.log 的内容,或者在控制台输出个"哥们别看了,真没啥好看的"。

最后说点掏心窝子的话

前端安全,永远都是魔高一尺道高一丈。你写再牛逼的反调试,人家开个无痕模式、装个插件,分分钟给你破了解。

真正应该做的

  • 敏感逻辑放后端

  • 重要的接口加签名

  • 核心算法混淆但别过度

至于检测开发者工具这玩意儿,就当个乐子玩玩得了。别把时间花在跟"黑客"较劲上,多写点业务代码,早点下班才是正事!

继续阅读

全部归档

评论