【发布时间】:2019-03-29 19:10:10
【问题描述】:
我目前正在开发一款完全基于浏览器的游戏(例如Cookie Clicker),并且我正在努力将用户利用可见 JavaScript 欺骗他们的游戏存档的可能性降到最低。为了便于解释,我们来看一个假设函数;
let user = {
money: 0
};
function addMoney(amount) {
user.money += amount;
}
如果这在我的游戏中是一个真正的功能,那么任何用户都可以简单地打开开发者控制台,输入addMoney(1e100),然后立即破坏我潜在玩家群之间竞争的可能性。
我想知道是否有任何方法可以禁用外部 JavaScript 输入(无论是通过开发者控制台还是通过在地址栏中使用 javascript:() 注入),如果不存在这样的事情,是至少有可能检测外部 JavaScript,而不是由网站本身在内部执行的 JavaScript?
【问题讨论】:
-
总是希望用户更改您的 js,并为服务器编写代码以防止这种情况发生。
-
我认为不可能完全按照您的要求进行操作,但是如果您将逻辑基于用户输入(例如“点击”事件),您可以在事件处理程序中编写匿名函数和检查事件的
isTrusted值。 -
如果游戏完全基于浏览器,你最好的选择可能是混淆,使用
window,并确保你的代码在一个模块中,所以没有什么是全局的。如果你有服务器,处理所有重要的游戏逻辑,这样他们就不会作弊 -
让我看看我是否明白。您的游戏不与服务器交互?你将如何保存你的球员的进步?你会相信前端所说的吗?如果是这种情况,是什么阻止用户使用邮递员或 curl 请求将任何数据保存在您的服务器中。如果您没有将用户的数据保存在服务器中,您如何比较他们的高分?用户会为自己作弊吗?
-
将它全部包装在一个闭包中,从内部订阅 dom 方法以从外部访问。这样,用户就不能直接调用您的方法。但是,仍然可以设置断点并以这种方式深入研究范围,但我怀疑隐藏全局 ref 会大大减少作弊。您还可以使用 WebWorkers 来“隐藏”全局变量,并对传入消息进行某种校验和/身份验证/完整性检查。基本上,JS 的安全模型是引用库,所以你必须删除引用。您无法阻止用户 JS,甚至不必费心尝试。其他选项是全部在服务器端完成。
标签: javascript browser console developer-console