【问题标题】:Telling if a requested file is Javascript判断请求的文件是否为 Javascript
【发布时间】:2019-01-07 00:00:47
【问题描述】:

我有一个程序记录页面加载过程中网站发出的每个GET/POST 请求。我想把这些请求一个一个地处理一遍,执行,然后判断返回的文件是不是Javascript。鉴于它不会有 .js 结尾(因为像这样的脚本,一分钟前从 google.com 拉出),我如何解析从请求中获取的文件并识别它是否是 Javascript 文件?

谢谢!

编辑: 得到假阳性比得到假阴性更好。也就是说,我宁愿将一些非JS 包含在JS 列表中,也不愿从列表中删除一些真正的JS

【问题讨论】:

  • & 你尝试过什么?
  • 检查内容类型
  • 这很难,因为 javascript 内部没有特定的模式。如果您将扩展名更改为js,则可以将包含'hey!'; 的文件视为javascript。基本上,它是一个带有js 扩展名的纯文本文件。
  • 我试图找到类似于<!DOCTYPE html> 的东西,但它似乎没有标准化。我还考虑过像解析 JS 一样解析所有代码,然后当抛出异常时(例如,无法正确读取来自 img 的二进制文件)将文件标记为不是 JS。这对我来说似乎有点危险,因为它可能在 JS 列表中有一些非 JS 代码,我需要避免。
  • @FastSnail 是否必须为所有 GET/POST 请求提供内容类型?

标签: javascript


【解决方案1】:

最简单的方法是检查是否有任何通过 URI 识别 javascript 文件的内容,因为替代方案要重得多。但既然你说这不是一个选项,你总是可以使用一些启发式工具检查每个文件内容的语法。您还可以检查响应标头的内容类型。

【讨论】:

  • 你指的是什么启发式工具?
  • 无特定工具。首先,我会确定您是否可以有误报或误报。如果是这样,您可以简单地检查文件是否有有效的 javascript 语法。这可能就像在节点上运行脚本以查看它是否返回错误代码一样简单。
  • 我也不能真正拥有,但是误报(即剪切真正的 Javscript)可能比保留非 JS 文件更糟糕。谢谢!
  • 在实践中,您可以在域名xjs/_/js/k=xjs 后的前 14 个字符中将链接的 URI 识别为 Javascript 3 次。
  • 是的,但并非所有域名都包含 JS。此外,当 URL 不是 JS 文件时,存在一些不良站点布局的风险(我也在检查它!)
【解决方案2】:

您引用的 javascript 链接没有内容类型,也没有 js 扩展名。 如果可以执行任何文本文件,则可以将其视为 javascript,这会使从头开始的检测变得非常困难。想到了两种方法。

  1. 对文件内容运行 linter。如果错误是语法错误或解析错误,则不是 javascript。如果没有语法错误或解析错误,则应认为是javascript

  2. 解析文件内容的 AST(抽象语法树)。一个 javascript 文件将被解析而没有错误。应该有许多可用的 AST 库。我没有使用过 JS AST,所以不能推荐其中任何一个,但快速搜索应该会给你一些选择。

我不确定,但可能 linter 在进行语法检查之前也会运行 AST。在这种情况下,运行 AST 似乎是一个更轻松的选择。

【讨论】:

  • 示例 AST:github.com/benjamn/recast 在此处了解有关 AST 的更多信息:stackoverflow.com/questions/16127985/…
  • 我现在正在运行一些测试,以查看 google 链接包含的响应标头是否具有内容类型,但这似乎是一个很好的故障保护。我有大量的站点数据,我将对其进行测试以确定内容类型是否有效。谢谢!
猜你喜欢
  • 2017-12-12
  • 1970-01-01
  • 2015-05-03
  • 1970-01-01
  • 2014-12-24
  • 2011-10-12
  • 2013-02-21
  • 2010-10-15
  • 1970-01-01
相关资源
最近更新 更多