我能做些什么来阻止用户从控制台运行文件中的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函数,什么都没有发生,没有错误。
2条答案
按热度按时间py49o6xq1#
只需将整个脚本 Package 在IIFE(立即调用的函数表达式)中,这样
getReward
(以及所有其他函数)就不会位于顶层。顶层的函数(和其他变量)会自动分配给window
,因此只需在控制台中输入函数名即可调用。但是,如果一个函数被声明为 * 在另一个函数中 *,则内部函数不会被分配给全局对象。将脚本 Package 在IIFE中不仅对安全性有用(不是 * 好 * 安全性,但优于 open-console-and-type-function 不安全性),而且还可以避免全局命名空间的污染,这是最好避免的。
jhkqcmku2#
这是魔法
只要将此脚本添加到您的项目中,它肯定会停止检查。