我正在尝试构建某种类型的javascript“防病毒”,它会尝试捕获特定的函数调用。
所以我想说我有一些随机的javascript文件,我可以检查它是否在任何地方都没有使用函数jQuery.trim()
(仅作为例子)?
这似乎是非常复杂的任务,加上eval
和基本编码可以将任何代码转换为一堆字符。
是否可以在PHP中编写类似的内容?是否有任何图书馆和工具可以提供帮助?
答案 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
和类似的功能(例如,Function
,setTimeout
等),编码内容应该不是问题,因为执行代码需要eval。
http://web.2point1.com/2009/11/14/jparser-and-jtokenizer-released/
解析树示例:http://timwhitlock.info/plug/examples/JavaScript/JParser.php
编辑:没关系,即使这样也不会遇到一些边缘情况。我能想到的唯一另一件事就是通过Javascript引擎运行代码并监视任何恶意函数调用。但即使这样也无法捕获所有内容(来自远程服务器的数据就是一个例子)。