2013-10-07 222 views
13

我正在研究HTML/JavaScript中的Web应用程序,并且我想阻止用户在浏览器控制台中调用函数,以避免作弊。所有这些功能都包含在一个名为functions.js的独特文件中,该文件被加载到index.html文件的头部。如何从浏览器控制台禁用JavaScript函数调用?

我发现这个解决方案,它的工作原理在谷歌浏览器罚款在网络上搜索后,但在其他浏览器如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 } 
}); 

是否有禁用功能从打电话的一般方法安慰?它依赖于浏览器还是仅仅是一个范围问题或者其他我忽略的问题?

+2

即使你做了,仍然可以从浏览器栏执行功能 –

+0

你发现的确会禁用脚本的控制台对象,但不会阻止用户使用浏览器控制台。 – Bergi

+1

无论您在浏览器中做什么,用户都可以撤消。您无法隐藏任何内容,而且您禁用该用户的任何内容都可以重新启用。我不确定你想要阻止什么“欺骗”,但是做客户端并不可靠。 – 2013-10-07 22:33:57

回答

16

是否有禁用功能的通用方式,从控制台打电话?

号你不能。 从不。那么,显然Facebook的发现,在谷歌浏览器的方式:How does Facebook disable the browser's integrated Developer Tools? - 虽然我会考虑:-)

一个错误是它也许别的东西,我忽略了?

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

可以使其难以避免暴露你的在全球范围内的方法内省和使用(呼叫)你的代码,并通过混淆(缩小文件)的来源。但是,永远不会信任客户端。为避免作弊,您必须在服务器上执行所有关键任务。不要期望所有请求都来自您的JavaScript代码或浏览器;您将需要处理可能由某种机器人发布的任意请求。

+0

转到facebook控制台并键入任何内容......他们是如何做dat的? ??? ??? –

+2

@KeoStrife:你的意思是“facebook控制台”,在https://www.facebook.com/上打开浏览器的devtools控制台?什么不会在那里工作?你使用什么浏览器,你输入了什么? – Bergi

+0

@KeoStrife:我明白你的意思了。 [Facebook如何禁用开发工具?](http://stackoverflow.com/q/21692646/1048572) – Bergi

2

而不是消除访问控制台,只需编写你的JavaScript,因此不会污染全局命名空间。这会使得从控制台或地址栏执行的代码执行代码变得更加困难(或者在简单情况下几乎不可能):https://stackoverflow.com/a/1841941/1358220

也值得注意的是,如果您有一些代码,您希望用户不要能够编辑或执行,将其移动到服务器端并仅将结果公开给客户端。您目前正试图通过错误的编码决定来修复糟糕的设计设计。改进您的设计,实施将自行处理。

+4

闭包中的代码并不是一个坏主意,直到用户逐步完成。 –

+0

虽然这不是完美的,但由于他没有引用他试图“保护”的代码,因此封闭可能是一个不那么令人反感的解决方案,而不是削弱控制台。 –

+0

虽然只是在开发工具中编辑源代码很容易。 –

0

Minify你的JavaScript源混淆任何意义。这不会使欺骗不可能,但很难找出欺骗的方法。

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); 
     } 
    }; 
} 
+0

呼叫功能可以由客户端再次更改。 – Domi

0

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

沙箱,如Facebook APIGoogle Caja,更可让您通过“重写”的语言(它们运行解析器,基本上重新编译用户指定的代码,使一切,这是不安全的安全任意执行任何约束)。 只要您能确保用户代码只能在这些环境中运行,就可以工作。这种方式来自其他用户的代码不能混淆你的客户,但你当然仍然可能会惹你自己的客户。

相关问题