有什么办法可以阻止用户运行控制台中文件中的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函数,不会发生任何错误。
答案 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 不安全性更好)有用,而且同样是为了避免污染全局名称空间,在可能的情况下最好避免这种情况。