2010-08-23 77 views
2

我试图建立一些JavaScript的“防病毒”,试图捕捉特定的函数调用。是否可以判断某个javascript代码是否调用特定的函数?

因此,让我说我有一些随机的JavaScript文件,我可以检查它是否在任何地方使用功能jQuery.trim()(只是为了例子)?

它看起来很复杂,另外还有eval和基本编码,可以将任何代码转换为一堆字符。

是否有可能在PHP中写这样的东西?有什么图书馆和工具可以帮助吗?

+0

这是暂停问题。 – BCS 2010-08-23 04:34:04

回答

2

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

考虑这个例子,它通过将一个Array的pop方法作为一个断开的字符串引用来间接调用它。

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

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

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

简而言之,这个决心根本不能做成静态的。即使是动态的,你也必须修补很多事情,以确保某个特定的功能永远不会被调用。

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

谢谢,但我想做一些有点不同的事情 - 不是阻止脚本使用函数,而是回答一个问题 - 是否调用这个函数。 – serg 2010-08-23 02:11:12

+0

这样做的缺点是,这会禁用所有脚本的功能,而不仅仅是他禁止它们的功能。这听起来像他想接受用户创建的脚本并禁止某些功能,但不是全局的(包括用于他自己的脚本)。 – 2010-08-23 02:12:36

+0

@serg,那么一旦你确定了这些信息,你会怎么做?无论如何都允许它执行? – JAL 2010-08-23 02:34:59

0

有一个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引擎运行代码并监视任何恶意函数调用。但即使这样也不能抓住所有东西(例如来自远程服务器的数据)。

+0

谢谢。唯一的问题是它不处理eval。我通过打包器运行他们的示例代码,它无法提取函数名称。 – serg 2010-08-23 02:22:17

+0

@serg:你能发布缩小的代码吗?您可以将其添加到某种类型的Pastebin中,或将其编辑到您的文章中。 – 2010-08-23 02:27:37

3

不可以。通常只需检查代码就无法做出这个决定。

即使您忽略eval(说起来容易做起来难 - 隐藏函数调用的方法很多),它仍然不可判定。

例如:

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

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

相关问题