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

时间:2018-10-12 06:53:30

标签: javascript

有什么办法可以阻止用户运行控制台中文件中的js函数?我在这里有这个class ParamBag { public: add(int paramId, shared_ptr<IParam> param); bool contains(int paramId); std::shared_ptr<IParam> get(paramId); private: int mask; std::map<int, std::shared_ptr<IParam>> params; }; 函数:

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>';

但这不会运行getReward函数,不会发生任何错误。

1 个答案:

答案 0 :(得分:4)

只需将整个脚本包装在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";
  }
})();

在IIFE中包装脚本不仅对安全性(不是良好安全性,而且比 open-console-and-type-function 不安全性更好)有用,而且同样是为了避免污染全局名称空间,在可能的情况下最好避免这种情况。