Подтвердить что ты не робот

Как отключить вызовы функций JavaScript из консоли браузера?

Я работаю над веб-приложением в HTML/JavaScript, и я хочу, чтобы пользователи не вызывали функции в своей консоли браузера, чтобы избежать обмана. Все эти функции содержатся в уникальном файле с именем functions.js, который загружается в начало файла index.html.

После поиска в Интернете я нашел это решение, которое отлично работает в Google 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 }
});

Есть ли общий способ отключения вызова функций с консоли? Это зависит от браузера или это просто проблема обзора или, возможно, что-то еще, что я проигнорировал?

4b9b3361

Ответ 1

Есть ли общий способ отключения вызова функций с консоли?

Нет. Ты не можешь. Никогда. Хорошо, очевидно, что Facebook нашел способ в Google Chrome: Как отключить Facebook встроенные средства разработки браузера? - хотя я бы подумал об этом ошибка: -)

Возможно, это что-то еще, что я проигнорировал?

Да. JavaScript выполняется клиентами, а клиент имеет полную власть над ним. Он может выбрать, выполнять или не выполнять его, как его выполнять, и изменять его, как он хочет, перед его исполнением. Современные инструменты разработчика позволяют пользователю выполнять произвольные функции в произвольных областях при отладке script.

Вы можете усложнить возможность интроспекции и использования (вызова) вашего кода, избегая раскрытия ваших методов в глобальной области и путем запутывания (минимизации) источника. Однако никогда не доверяйте клиенту. Чтобы избежать обмана, вам придется выполнять всю важную задачу на сервере. И не ожидайте, что все запросы будут поступать из вашего кода JavaScript или из браузера; вам нужно будет обрабатывать произвольные запросы, которые могут быть выданы каким-то ботом.

Ответ 2

Вместо того, чтобы исключать доступ к консоли, просто скопируйте свой javascript, чтобы он не загрязнял глобальное пространство имен. Это сделает намного сложнее (или в простых случаях практически невозможно) для кода, выполняемого с консоли или адресной строки для выполнения вашего кода: fooobar.com/questions/86992/...

Также стоит отметить, что если у вас есть код, который вы хотите, чтобы пользователь не мог редактировать или выполнять, переместите его на серверный сервер и выставляйте результат клиенту. В настоящее время вы пытаетесь исправить плохой дизайн с неправильным решением для кодирования. Улучшите свой дизайн, и реализация позаботится о себе.

Ответ 3

Измените свой источник JavaScript, чтобы обмануть любое значение. Это не сделает невозможным обманывать, но очень трудно найти способы обмануть.

Ответ 4

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

Ответ 5

Если вы хотите избежать "обмана", вам потребуется проверка на стороне пользователя на входе пользователя. Клиент может только отправлять информацию о сервере в соответствии с протоколом, определенным на стороне сервера, и, таким образом, обман невозможен, если только ваш протокол не имеет утечек безопасности (и большинство протоколов, особенно новых протоколов).

Песочницы, такие как API Facebook, Google Caja и более того, вы можете произвольно применять любые ограничения путем "переписывания" языка (они запускают парсер и в основном повторно компилируют код, заданный пользователем, и делают все, что небезопасно безопасно). Это работает до тех пор, пока вы можете убедиться, что код пользователя может работать только в этих средах. Таким образом, код других пользователей не может взаимодействовать с вашим клиентом, но вы, конечно, можете по-прежнему работать со своим клиентом.