Можно ли определить, вызывает ли какой-либо код javascript определенную функцию? - PullRequest
2 голосов
/ 23 августа 2010

Я пытаюсь создать своего рода «антивирус» javascript, который будет пытаться перехватывать вызовы определенных функций.

Итак, допустим, у меня есть какой-то случайный файл javascript, могу ли я проверить, не использует ли он функцию jQuery.trim() (просто для примера) где-нибудь?

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

Можно ли написать что-то подобное на PHP? Существуют ли какие-либо библиотеки и инструменты, которые могут помочь?

Ответы [ 4 ]

3 голосов
/ 23 августа 2010

Нет. Вы не можете сделать это определение в целом, просто проверяя код.

Даже если вы игнорируете eval (легче сказать, чем сделать - есть много способов скрыть вызов функции), это все равно не разрешимо.

Например: somestring[data_from_remote_server](...), где data_from_remote_server это "indexOf". Этот код может вызвать indexOf. Это вероятно? Кто знает.

Даже без удаленного сервера несложно представить код, который вычисляет строку «indexOf», фактически не содержащую строку «indexOf».

2 голосов
/ 23 августа 2010

JavaScript - это динамический язык, и даже без таких функций, как eval, становится очень трудно определить, вызывает ли скрипт определенную функцию. Наилучшее решение, которое я могу придумать, - это аналог @pixl coer для переопределения самой функции и выборочного вызова ее вместо ее постоянной блокировки.

Рассмотрим этот пример, который косвенно вызывает метод pop для массива, называя его прерывистой строкой.

var p = 'p';
var o = 'o'
[2,3,4][p + o + p]();

Оборачивая фактический метод, вы можете выборочно решить, пропустить ли метод или заблокировать его во время выполнения.

Однако учтите, что даже это не является надежным. Каждый iframe получает свою собственную копию методов, таких как eval. Кто-то может просто создать одноразовый iframe, получить оттуда метод eval и затем выполнить его.

Короче говоря, это определение не может быть сделано статически вообще. Даже динамически вам придется исправлять множество вещей, чтобы гарантировать, что определенная функция никогда не будет вызвана.

2 голосов
/ 23 августа 2010

Перед запуском любого скрипта вы можете установить каждую из функций, которую вы не хотите запускать, в свою собственную функцию, которая, например, может регистрировать, что скрипт пытался запустить эту функцию Скажем, вы не хотите, чтобы скрипт использовал eval:

window.eval = function(){
     console.log("The script tried to call eval");  
};

или если вы не хотите, чтобы он вызывал indexOf для строк

String.prototype.indexOf = function(){
     console.log("The script tried to call indexOf on the string" + this);
}

Edit: Если вы хотите продолжить использовать функции, вы можете создавать копии, а затем выполнять их внутри своей функции замены следующим образом:

    var evalCopy = window.eval;
    window.eval = function () {
        console.log("Eval was called again");
        return evalCopy.apply(this,arguments);
    }
0 голосов
/ 23 августа 2010

Есть PHP-анализатор Javascript и токенизатор, которые могут помочь.Вы можете просмотреть дерево разбора для вызовов функций, а также псевдонимов, чтобы убедиться, что пользователи не назначают функцию другому имени, а затем используют это новое имя.Когда вы запрещаете eval и аналогичные функции (например, Function, setTimeout и т. Д.), Закодированное содержимое не должно быть проблемой, поскольку для выполнения кода требуется eval.

http://web.2point1.com/2009/11/14/jparser-and-jtokenizer-released/

Пример дерева разбора: http://timwhitlock.info/plug/examples/JavaScript/JParser.php

РЕДАКТИРОВАТЬ : Неважно, даже это не уловит некоторые крайние случаи.Единственное, о чем я мог подумать, это запустить код через движок Javascript и отслеживать любые злые вызовы функций.Но даже это не поймало бы все (данные с удаленного сервера - один из примеров).

...