【问题标题】:Is it possible to use Javascript to search Javascript code for all URLs the code would attempt to access?是否可以使用 Javascript 搜索 Javascript 代码以查找代码将尝试访问的所有 URL?
【发布时间】:2013-04-03 14:26:46
【问题描述】:

假设我在一个字符串变量中有一个完整的 JS 脚本。与其执行整个脚本,我只想评估它的代码,以找出如果运行它会尝试检索(通过 Ajax)哪些 URL。

我可以将代码作为文本进行正则表达式搜索,但这不会找到故意使用 replace() 之类的内容进行混淆的 URL。

这需要使用 Javascript 来完成。

如果可能的话,任何人都可以提供至少一个关于这如何可能的提示吗?

编辑:就上下文而言,我的项目是构建一个greasemonkey 脚本,从userscripts.org 的脚本列表中过滤掉Facebook 垃圾邮件诈骗。我已经有一些东西可以对用于诈骗的常见 facebook ajax URL 进行简单的文本搜索,但诈骗作者已经在尝试寻找解决方法。我需要可靠地捕获所有 Ajax URL 以进行检查,无论它们如何被串在一起并使用字符串函数进行更改。如果有兴趣,请参阅http://userscripts.org/scripts/show/163038

【问题讨论】:

  • 您提到故意混淆上述 URL...“变量”是您在 javascript 附件中定义的长字符串吗?如果这样的话,在 javascript 级别上的混淆就无关紧要了,正则表达式确实可以工作
  • 假设“ajax”调用对您来说意味着使用ajax(url) 函数。您可以覆盖 ajax(url) 来存储您的 URL,而不是进行 ajax 调用。你怎么看?
  • @blint:这是一个有趣的想法,但我必须重新定义一些较低级别的东西来捕获所有各种 Ajax 函数/方法,比如 jQuery 的 $.ajax、$.get 等,等等否则存在。他们都使用一种特定的功能或方法吗?
  • @Mike:该变量将是 Ajax 检索 .js 页面的结果。如果该页面中的 Ajax 调用包含使用函数或多个连接字符串构建的 URL,我认为这对于正则表达式来说将是一个问题。除非我误会了?

标签: javascript ajax search


【解决方案1】:

本主题可能对您有所帮助:intercept all ajax calls?

确实,您可以重新定义 XHR 以使 ajax 调用按照您的意图进行,而不是依赖于 Javascript 框架:

var ajax_urls = new Array();
var XHR_backup = new Array();
XHR_backup.open = XMLHttpRequest.prototype.open;
XHR_backup.send = XMLHttpRequest.prototype.send;

// Customize XHR behaviour
(function(XHR, ajax_urls) {
    "use strict";

    var open = XHR.prototype.open;
    var send = XHR.prototype.send;

    XHR.prototype.open = function(method, url, async, user, pass) {
        ajax_urls.push(url);
    };

    XHR.prototype.send = function(data) {
    }
})(XMLHttpRequest, ajax_urls);

// Evaluate your script
eval(resultScript);

for (var i = 0; i < ajax_urls.length; i++) {
    alert('Hey, my super XHR fetched ' + ajax_urls[i] + ' !!');
}

// Restore initial XHR behaviour
XMLHttpRequest.prototype.open = XHR_backup.open;
XMLHttpRequest.prototype.send = XHR_backup.send;

编辑:我没有测试过这个 sn-p,所以我正在等待你的反馈。

Edit2:经过测试并且可以正常工作! http://jsfiddle.net/3qVUP/1/

【讨论】:

  • 如果我理解这一点,我应该把这个 sn-p 放在eval(retrievedScript) 上面,只注释掉建议的行,并且 URL 应该被推入 ajax_urls 数组?如何防止这干扰我使用 jQuery 的 $.ajax 对 JS 页面的初始检索?
  • 如果我提到的来源说得对,你可以在eval() 之前粘贴这个sn-p,而不用评论任何东西,你可以在调用它们时保存你的URL。如果您想恢复“默认”XHR 行为,我正在对此进行一些编辑。
  • 我发现这确实有效,但仅适用于某些脚本。使用alert(),我确定一切都趋于正常,直到eval() 语句,此时执行停止,对于我尝试使用它评估的大多数脚本。具有讽刺意味的是,当评估脚本对 Ajax 使用 xmlhttp 时,它似乎会中断,但当评估脚本使用 $.ajax 时它会工作(这只是基于我非常有限的测试,所以这实际上可能与哪些有效)。
  • 我想我碰壁了...我猜检索到的脚本中的很多东西可能会破坏eval(),所以这不是测试未知脚本的好方法。非常感谢这个建议,这是一个好主意!但我有一种感觉,我一直在叫错树。
  • 我已在我的问题中添加了详细信息,解释了这样做的用途,以防万一。
【解决方案2】:

你说整个事情都在一个变量中......我假设你的意思是一个字符串。使用任何内容的字符串表示形式,您可以将其解析为您想要的任何内容。棘手的部分是正确地做到这一点。在此处查看 RegEx(正则表达式):http://www.regular-expressions.info/tutorial.html

这是一个查找 URL 的正则表达式:

^http(s?)\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)([a-zA-Z0-9\-\.\?\,\'\/\\\+&amp;%\$#_]*)?$

回复:评论

您可以在 BuildString() 函数中连接所述字符串的所有可能实例,并返回一个带有结果的字符串,然后为您的 URL 正则表达式返回的变量。

IE:

function Concatenation() {
    var _strOutput = "<script>var x = 0; x += " + GetVariableIterator() + "; return x; </script>";
    return _strOutput;
}

function FinalResult() {
    var _strCombined = Concatenation();
    // Do Regex and work with URLs
}

【讨论】:

  • 是的,要解析的脚本代码在字符串变量中。我可以使用正则表达式来捕获简单定义为单个字符串的 URL,但这不会捕获由多个变量或方法/函数(如 replace() 等)构建的 URL。
  • 连接所有变量会捕获更多的 URL,但是仍然有简单的方法来解决这个问题(对于试图混淆 URL 的脚本作者),例如。如果 ajax url: 行本身包含连接的字符串或没有变量的函数。如果您有兴趣,我已在原始问题中添加了详细信息,解释了我的目标。
猜你喜欢
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
  • 2015-05-29
  • 1970-01-01
  • 2021-06-21
  • 2012-08-26
  • 1970-01-01
  • 2017-05-23
相关资源
最近更新 更多