有可能判断一些javascript代码是否调用特定的函数?

时间:2010-08-23 01:39:09

标签: php javascript parsing static-analysis

我正在尝试构建某种类型的javascript“防病毒”,它会尝试捕获特定的函数调用。

所以我想说我有一些随机的javascript文件,我可以检查它是否在任何地方都没有使用函数jQuery.trim()(仅作为例子)?

这似乎是非常复杂的任务,加上eval和基本编码可以将任何代码转换为一堆字符。

是否可以在PHP中编写类似的内容?是否有任何图书馆和工具可以提供帮助?

4 个答案:

答案 0 :(得分:3)

没有。仅仅通过检查代码就无法做出这个决定。

即使你忽略了eval(说起来容易做起来 - 有很多方法可以隐藏函数调用),它仍然无法判断。

例如:

somestring[data_from_remote_server](...)
其中data_from_remote_server是“indexOf”。该代码可以调用indexOf。可能吗?谁知道。

即使没有远程服务器,也不难想象编写计算字符串“indexOf”的代码而不实际包含字符串“indexOf”。

答案 1 :(得分:2)

在任何脚本运行之前,您可以将您不想运行的每个函数设置为您自己的函数,例如可以记录脚本尝试运行此函数 假设您不希望脚本使用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);
}

修改 如果您想继续使用这些功能,您可以创建副本,然后在替换功能中执行它们,如下所示:

    var evalCopy = window.eval;
    window.eval = function () {
        console.log("Eval was called again");
        return evalCopy.apply(this,arguments);
    }

答案 2 :(得分:2)

JavaScript是一种动态语言,即使没有像eval这样的函数,也很难弄清楚脚本是否正在调用特定的函数。我能想到的最好的解决方案类似于@pixl coer来覆盖函数本身,并选择性地调用它而不是总是阻塞它。

考虑这个通过将数组称为断字符串间接调用数组上的pop方法的示例。

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

通过包装实际方法,您可以有选择地决定是让该方法通过还是在运行时阻止它。

然而,请注意,即使这不是万无一失的。每个iframe都有自己的方法副本,例如eval。有人可以创建一次性iframe,从那里获取eval方法,然后执行它。

简而言之,这种决定根本不可能是静态的。即使是动态的,你也必须修补很多东西,以确保永远不会调用特定的函数。

答案 3 :(得分:0)

有一个可能有用的PHP Javascript解析器和标记器。您可以通过解析树查看函数调用以及别名,以确保用户不将该函数指定给其他名称,然后使用该新名称。一旦您不允许eval和类似的功能(例如,FunctionsetTimeout等),编码内容应该不是问题,因为执行代码需要eval。

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

解析树示例:http://timwhitlock.info/plug/examples/JavaScript/JParser.php

编辑:没关系,即使这样也不会遇到一些边缘情况。我能想到的唯一另一件事就是通过Javascript引擎运行代码并监视任何恶意函数调用。但即使这样也无法捕获所有内容(来自远程服务器的数据就是一个例子)。