javascript 如何防止用户在控制台中执行js函数

bweufnob  于 2023-05-27  发布在  Java
关注(0)|答案(2)|浏览(223)

我能做些什么来阻止用户从控制台运行文件中的js函数吗?下面是getReward函数:

function getReward(){

    $('.reward-button').remove();
    $('#rewardBtn').remove();

    document.getElementById("fightInfo").innerHTML = 

    '<strong>You</strong> won the fight.<br><strong>Reward:</strong><br>Gold: ' +gold+' <img src="/img/gold.png" style="margin-top: -1%"><br>EXP: '+exp+'<br>'
    +
    '<br>'
    +
    '<button style="font-size: 24px;" class="btn btn-danger" onclick="backToArena();">⚔️<br>Back To Arena</button>';

    socket.emit('win-fight', {
        gold: gold,
        exp: exp,
        username: userName,
        enemyname: enemyName
    });   

}

    function backToArena(){
        window.location.href = "/arena";
    }

问题是,用户只需在控制台输入getReward();,他就会自动获得奖励,因为套接字工作,它从客户端转到服务器端。有什么办法可以防止这种情况发生吗?
更新

document.getElementById("rewardBtn").innerHTML = 
    '<button style="background-color: blue; font-size: 24px;" class="btn btn-primary" id="reward-button">Get reward 🏆</button>';

然后我这样做:

document.querySelector('#reward-button').addEventListener('click', getReward);

但这并没有运行getReward函数,什么都没有发生,没有错误。

py49o6xq

py49o6xq1#

只需将整个脚本 Package 在IIFE(立即调用的函数表达式)中,这样getReward(以及所有其他函数)就不会位于顶层。顶层的函数(和其他变量)会自动分配给window,因此只需在控制台中输入函数名即可调用。但是,如果一个函数被声明为 * 在另一个函数中 *,则内部函数不会被分配给全局对象。

(() => {
  function getReward(){

    $('.reward-button').remove();
    $('#rewardBtn').remove();

    document.getElementById("fightInfo").innerHTML = 

      '<strong>You</strong> won the fight.<br><strong>Reward:</strong><br>Gold: ' +gold+' <img src="/img/gold.png" style="margin-top: -1%"><br>EXP: '+exp+'<br>'
      +
      '<br>'
      +
      '<button style="font-size: 24px;" class="btn btn-danger" onclick="backToArena();">⚔️<br>Back To Arena</button>';

    socket.emit('win-fight', {
      gold: gold,
      exp: exp,
      username: userName,
      enemyname: enemyName
    });   

  }

  function backToArena(){
    window.location.href = "/arena";
  }
})();

将脚本 Package 在IIFE中不仅对安全性有用(不是 * 好 * 安全性,但优于 open-console-and-type-function 不安全性),而且还可以避免全局命名空间的污染,这是最好避免的。

jhkqcmku

jhkqcmku2#

这是魔法

"use strict";
!function() {
  function detectDevTool(allow) {
    if(isNaN(+allow)) allow = 100;
    var start = +new Date();
    debugger;
    var end = +new Date();
    if(isNaN(start) || isNaN(end) || end - start > allow) {
      consoleCheck();
    }
  }
  if(window.attachEvent)
  {
    if (document.readyState === "complete" || document.readyState === "interactive")
    {
      detectDevTool();
      window.attachEvent('onresize', detectDevTool);
      window.attachEvent('onmousemove', detectDevTool);
      window.attachEvent('onfocus', detectDevTool);
      window.attachEvent('onblur', detectDevTool);
    }
    else
    {
      setTimeout(argument.callee, 0);
    }
  }
  else
  {
    window.addEventListener('load', detectDevTool);
    window.addEventListener('resize', detectDevTool);
    window.addEventListener('mousemove', detectDevTool);
    window.addEventListener('focus', detectDevTool);
    window.addEventListener('blur', detectDevTool);
  }
}();

function consoleCheck()
{
  document.querySelector('body').innerHTML = 'We strongly support to not using console for extra actions!';
}

只要将此脚本添加到您的项目中,它肯定会停止检查。

相关问题