【问题标题】:Detecting if a certain text is JavaScript检测某个文本是否是 JavaScript
【发布时间】:2021-06-02 03:21:48
【问题描述】:

我有一个文本文件。它的内容可能是纯文本或 JavaScript 源代码。我需要一种高效且高精度的方法来检测文本文件是否包含纯文本或 JavaScript 代码。

我的方法: 我试图为此提取特定于语法的关键字、标点符号、运算符、基于正则表达式的循环检测。我将所有值相加,然后除以文件的长度,得到一个特定的比率。假设比率大于 0.2,那么文件是 JavaScript,否则是纯文本。我遇到的问题是基于正则表达式的循环检测。文件大小 > 1 兆字节花费了太多时间,因此我放弃了这种方法。

任何资源或方法将不胜感激。谢谢。

【问题讨论】:

  • 这是一个非常高级的想法。您可以使用 nlp 方法(机器学习)。在一堆 javascript 语句/文档以及普通文本上训练模型。
  • 是的,这是我的备份选项。但问题是我的应用程序有很多内存限制。我一直在寻找一种更静态的方法。但无论如何感谢您的建议@QuantumDreamer
  • 假设 javascript 代码根本没有任何错误,我会尝试在一堆编程语言下运行代码,只有 javascript 会出现错误。但这可能有很多漏洞并且需要很长时间......只是一个想法
  • 使用 nlp 有什么特别的原因吗? Javacsript不是自然语言,所以有更好的选择。例如这是一个定义明确的语法,那么为什么不直接通过 Javascript 解析器呢?
  • 我也考虑过这一点,但我正在研究的 JavaScript 实际上是恶意软件。执行它会在我的本地 PC 上出现一些问题。我必须在特殊的沙箱环境中执行它,但这会产生很多开销。

标签: javascript python nlp


【解决方案1】:

您可以以稍微不同的方式使用 NLP — 读取整个 js 文件,对其进行标记并构建标记频率表;使用此数据来应用您概述的逻辑。我尝试在 6.6MB JS 文件 上使用wink-nlp 来执行此操作,它在英特尔 2.2GHz i7 macbook pro 上大约在 5 秒内生成了频率表。以下是 Node.js 代码供您参考:

const fs = require( 'fs' );
const winkNLP = require( 'wink-nlp' );
const model = require( 'wink-eng-lite-web-model' );
const its = require( 'wink-nlp/src/its.js' );
const as = require( 'wink-nlp/src/as.js' );

const rawJS = fs.readFileSync( '<your-js-file-with-path>', 'utf8' );

const nlp = winkNLP( model );

const doc = nlp.readDoc( rawJS );
// The const ft has the frequency table:
const ft = doc.tokens().out( its.normal, as.freqTable );

这是部分输出:

[ '\n', 160960 ],
[ '.', 125520 ],
[ '(', 108440 ],
[ '/', 106480 ],
[ '=', 95040 ],
[ ')', 74800 ],
[ ';', 64120 ],
.
.
[ '{', 16640 ],
[ '}', 16640 ],
[ 'const', 15920 ],
.
.

【讨论】:

  • 注意:使用的JS文件是未压缩的。
猜你喜欢
  • 2020-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-05
  • 2011-09-20
  • 1970-01-01
  • 2013-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多