17

我正在开发一个 HTML/JavaScript 的 Web 应用程序,我想阻止用户在他们的浏览器控制台中调用函数以避免作弊。所有这些函数都包含在一个名为的唯一文件functions.js中,该文件加载在index.html文件的头部。

在网上搜索后,我找到了这个解决方案,它在谷歌 Chrome 中运行良好,但在其他浏览器(如 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 }
});

有没有一种通用的方法来禁用从控制台调用函数?它取决于浏览器还是只是范围问题或我忽略的其他问题?

4

5 回答 5

16

有没有一种通用的方法来禁用从控制台调用函数?

不,没有:从来没有。好吧,显然,Facebook 在 Google Chrome 中找到了一种方法:Facebook 如何禁用浏览器的集成开发者工具?- 不过,我认为这是一个错误 :-)

可能是我忽略的其他东西吗?

是的。JavaScript 是在客户端执行的,客户端对它拥有完全的权力。他可以选择是否执行,如何执行,并在执行前随意修改。现代开发人员工具允许用户在调试脚本时在任意范围内执行任意函数。

您可以通过避免在全局范围内公开您的方法以及混淆(缩小)源代码,从而使内省和使用(调用)代码变得更加困难。但是,永远不要相信客户。为避免作弊,您必须在服务器上执行所有关键任务。并且不要期望所有请求都来自您的 JavaScript 代码或浏览器;您还需要处理可能由某种机器人发出的任意请求。

于 2013-10-07T22:38:58.333 回答
2

而不是消除对控制台的访问,只需编写您的 javascript,这样它就不会污染全局命名空间。这将使从控制台或地址栏执行的代码更难(或在简单的情况下几乎不可能)执行您的代码:https ://stackoverflow.com/a/1841941/1358220

还值得注意的是,如果您有一些代码希望用户无法编辑或执行,请将其移动到服务器端并仅将结果公开给客户端。您目前正试图通过错误的编码决定来修复错误的设计设计。改进您的设计,实现将自行解决。

于 2013-10-07T22:34:58.387 回答
0

如果您想避免“作弊”,您将需要服务器端验证用户输入。客户端只能根据服务器端定义的协议发送服务器信息,因此作弊是不可能的,除非您的协议存在安全漏洞(大多数协议都有安全漏洞,尤其是新协议)。

Facebook APIGoogle Caja等沙盒允许您通过“重写”语言来任意强制实施任何约束(它们运行解析器并基本上重新编译用户给定的代码,并使所有不安全的代码变得安全)。只要您可以确保用户代码只能在这些环境中运行,这就会起作用。这样,来自其他用户的代码就不会弄乱您的客户端,但您当然仍然可以弄乱您自己的客户端。

于 2014-04-09T09:56:13.727 回答
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);  
        }
    };
}
于 2014-04-03T09:00:38.033 回答
0

缩小您的 JavaScript 源代码以混淆任何含义。它不会让作弊变得不可能,但真的很难找出作弊的方法。

于 2013-10-07T22:41:49.777 回答