我试图建立一些JavaScript的“防病毒”,试图捕捉特定的函数调用。是否可以判断某个javascript代码是否调用特定的函数?
因此,让我说我有一些随机的JavaScript文件,我可以检查它是否在任何地方使用功能jQuery.trim()
(只是为了例子)?
它看起来很复杂,另外还有eval
和基本编码,可以将任何代码转换为一堆字符。
是否有可能在PHP中写这样的东西?有什么图书馆和工具可以帮助吗?
我试图建立一些JavaScript的“防病毒”,试图捕捉特定的函数调用。是否可以判断某个javascript代码是否调用特定的函数?
因此,让我说我有一些随机的JavaScript文件,我可以检查它是否在任何地方使用功能jQuery.trim()
(只是为了例子)?
它看起来很复杂,另外还有eval
和基本编码,可以将任何代码转换为一堆字符。
是否有可能在PHP中写这样的东西?有什么图书馆和工具可以帮助吗?
JavaScript是一种动态语言,即使没有像eval这样的函数,也很难确定脚本是否正在调用特定函数。我能想到的最佳解决方案类似于@pixl coer's来覆盖函数本身,并选择性地调用它而不是始终阻止它。
考虑这个例子,它通过将一个Array的pop
方法作为一个断开的字符串引用来间接调用它。
var p = 'p';
var o = 'o'
[2,3,4][p + o + p]();
通过包装实际方法,您可以选择性地决定是让方法通过还是在运行时阻止它。
但是,请注意,即使这不是傻瓜证明。每个iframe都有自己的方法副本,如eval
。有人可以创建一次性iframe
,从那里获取eval
方法,然后执行它。
简而言之,这个决心根本不能做成静态的。即使是动态的,你也必须修补很多事情,以确保某个特定的功能永远不会被调用。
在任何脚本运行之前,您可以将您不想运行的每个函数设置为您自己的函数,例如可以记录脚本试图运行此函数 假设您不希望脚本使用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);
}
有一个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引擎运行代码并监视任何恶意函数调用。但即使这样也不能抓住所有东西(例如来自远程服务器的数据)。
谢谢。唯一的问题是它不处理eval。我通过打包器运行他们的示例代码,它无法提取函数名称。 – serg 2010-08-23 02:22:17
@serg:你能发布缩小的代码吗?您可以将其添加到某种类型的Pastebin中,或将其编辑到您的文章中。 – 2010-08-23 02:27:37
不可以。通常只需检查代码就无法做出这个决定。
即使您忽略eval(说起来容易做起来难 - 隐藏函数调用的方法很多),它仍然不可判定。
例如:
somestring[data_from_remote_server](...)
其中
data_from_remote_server
是“indexOf”。该代码
可以调用indexOf。有可能吗?谁知道。
即使没有远程服务器,也不难想象编写计算字符串“indexOf”而不实际包含字符串“indexOf”的代码。
这是暂停问题。 – BCS 2010-08-23 04:34:04