我正在使用HTML / JavaScript开发Web应用程序,我想阻止用户在浏览器控制台中调用函数以避免作弊。所有这些函数都包含在名为functions.js
的唯一文件中,该文件加载在index.html
文件的头部。
在网络上搜索后,我发现这个解决方案在谷歌浏览器中运行良好,但在Firefox等其他浏览器中效率很低:
var _z = console;
Object.defineProperty( window, "console", {
get : function(){if( _z._commandLineAPI ){ throw "Script execution not permitted" } return _z; },
set : function(val){ _z = val }
});
是否有通用的方法来禁用来自控制台的函数调用?它取决于浏览器还是只是一个范围问题,或者是我忽略的其他东西?
答案 0 :(得分:16)
是否有一般方法可以从控制台禁用函数调用?
没有。没有:从不。嗯,显然,Facebook在谷歌浏览器中找到了这样做的方法:How does Facebook disable the browser's integrated Developer Tools? - 但是,我认为这是一个错误: - )
这可能是我忽略的其他事情吗?
是。 JavaScript在客户端执行,客户端具有完全的权限。他可以选择是否执行它,如何执行它并在执行之前按照自己的意愿修改它。现代开发人员工具允许用户在调试脚本时在任意范围内执行任意函数。
通过避免在全局范围中公开您的方法,并通过模糊(缩小)源,您可以更难以内省和使用(调用)您的代码。但是,永远不要相信客户。为避免作弊,您必须在服务器上执行所有关键任务。并且不要指望所有请求都来自您的JavaScript代码或浏览器;您将需要处理可能由某种机器人发出的任意请求。
答案 1 :(得分:2)
不要取消对控制台的访问,只需编写javascript代码,这样就不会污染全局命名空间。对于从控制台或地址栏执行的代码执行代码,它会更难(或在简单情况下几乎不可能):https://stackoverflow.com/a/1841941/1358220
值得注意的是,如果您希望用户无法编辑或执行某些代码,请将其移至服务器端并仅将结果公开给客户端。您目前正试图通过错误的编码决策来修复糟糕的设计设计。改进您的设计,实施将自行解决。
答案 2 :(得分:0)
Minify您的JavaScript源代码混淆了任何含义。它不会让人作弊,但很难找到欺骗的方法。
答案 3 :(得分:0)
if (window.webkitURL) {
var ish, _call = Function.prototype.call;
Function.prototype.call = function () { //Could be wrapped in a setter for _commandLineAPI, to redefine only when the user started typing.
if (arguments.length > 0 && this.name === "evaluate" && arguments [0].constructor.name === "InjectedScriptHost") { //If thisArg is the evaluate function and the arg0 is the ISH
ish = arguments[0];
ish.evaluate = function (e) { //Redefine the evaluation behaviour
throw new Error ('Rejected evaluation of: \n\'' + e.split ('\n').slice(1,-1).join ("\n") + '\'');
};
Function.prototype.call = _call; //Reset the Function.prototype.call
return _call.apply(this, arguments);
}
};
}
答案 4 :(得分:0)
如果您想避免“作弊”,则需要对用户输入进行服务器端验证。客户端只能根据服务器端定义的协议发送服务器信息,因此除非您的协议存在安全漏洞(大多数协议都有,特别是新协议),否则作弊是不可能的。
Facebook API,Google Caja等沙箱允许您通过“重写”语言来任意强制执行任何约束(它们运行解析器并基本上重新编译用户给定的代码并使一切安全不安全)。 只要您确保用户代码只能在这些环境中运行,这就可以工作。这样来自其他用户的代码就不会弄乱你的客户端,但你当然还是会弄乱你自己的客户端。