wappalyzer
1.0.0
这是此存储库私有化时的一个分叉 - 有一个项目正在尝试在这里继续,而您可能想要
Wappalyzer 识别网站上的技术,例如 CMS、Web 框架、电子商务平台、JavaScript 库、分析工具等。
git clone https://github.com/wappalyzer/wappalyzer.git
cd wappalyzer
yarn install
about:extensions
src
about:debugging#/runtime/this-firefox
src/manifest.json
一长串正则表达式用于识别网页上的技术。 Wappalyzer 检查 HTML 代码以及 JavaScript 变量、响应标头等。
模式(正则表达式)保存在src/technologies/
中。以下是应用程序指纹的示例。
"Example" : {
"description" : " A short description of the technology. " ,
"cats" : [
" 1 "
],
"cookies" : {
"cookie_name" : " Example "
},
"dom" : {
"#example-id" : {
"exists" : " " ,
"attributes" : {
"class" : " example-class "
},
"properties" : {
"example-property" : " "
},
"text" : " Example text content "
}
},
"dns" : {
"MX" : [
" example \ .com "
]
},
"js" : {
"Example.method" : " "
},
"excludes" : " Example " ,
"headers" : {
"X-Powered-By" : " Example "
},
"text" : " b example b " ,
"css" : " \ .example-class " ,
"robots" : " Disallow: /unique-path/ " ,
"implies" : " PHP \ ;confidence:50 " ,
"requires" : " WordPress " ,
"requiresCategory" : " Ecommerce " ,
"meta" : {
"generator" : " (?:Example|Another Example) "
},
"probe" : {
"/path" : " "
},
"scriptSrc" : " example-([0-9.]+) \ .js \ ;confidence:50 \ ;version: \ 1 " ,
"scripts" : " function webpackJsonpCallback \ (data \ ) { " ,
"url" : " example \ .com " ,
"xhr" : " example \ .com " ,
"oss" : true ,
"saas" : true ,
"pricing" : [ " mid " , " freemium " , " recurring " ],
"website" : " https://example.com " ,
}
在schema.json
中找到 JSON 架构。
场地 | 类型 | 描述 | 例子 |
---|---|---|---|
cats | 大批 | 一个或多个类别 ID。 | [1, 6] |
website | 细绳 | 应用程序网站的 URL。 | "https://example.com" |
场地 | 类型 | 描述 | 例子 |
---|---|---|---|
description | 细绳 | 用英式英语对该技术进行简短描述(最多 250 个字符)。以中立、真实的语气写作;不像广告。 | "A short description." |
icon | 细绳 | 应用程序图标文件名。 | "WordPress.svg" |
cpe | 细绳 | CPE 是一种结构化的技术命名方案。要检查 CPE 是否有效且存在(使用 v2.3),请使用搜索)。 | "cpe:2.3:a:apache:http_server :*:*:*:*:*:*:*:*" |
saas | 布尔值 | 该技术以软件即服务(SaaS)的形式提供,即托管或基于云。 | true |
oss | 布尔值 | 该技术拥有开源许可证。 | true |
pricing | 大批 | 成本指标(基于典型计划或平均每月价格)和可用的定价模型。仅适用于付费产品。 之一:
再加上以下任意一项:
| ["low", "freemium"] |
场地 | 类型 | 描述 | 例子 |
---|---|---|---|
implies | 字符串|大批 | 一个应用程序的存在可能意味着另一个应用程序的存在,例如 WordPress 意味着 PHP 也在使用。 | "PHP" |
requires | 字符串|大批 | 与暗示类似,但检测仅在已识别所需技术的情况下运行。对于特定 CMS 的主题很有用。 | "WordPress" |
requiresCategory | 字符串|大批 | 与要求类似;仅当已识别出所需类别中的技术时,才会运行检测。 | "Ecommerce" |
excludes | 字符串|大批 | 与暗示相反。一个应用程序的存在可以排除另一个应用程序的存在。 | "Apache" |
场地 | 类型 | 描述 | 例子 |
---|---|---|---|
cookies | 目的 | 曲奇饼。 | { "cookie_name": "Cookie value" } |
dom | 字符串|数组 |目的 | 使用查询选择器检查元素属性、属性和文本内容。 | { "#example-id": { "property": { "example-prop": "" } } } |
dns | 目的 | DNS记录:支持MX、TXT、SOA和NS。 | { "MX": "example\.com" } |
js | 目的 | JavaScript 属性(区分大小写)。避免使用短属性名称,以防止匹配缩小的代码。 | { "jQuery.fn.jquery": "" } |
headers | 目的 | HTTP 响应标头。 | { "X-Powered-By": "^WordPress$" } |
text | 字符串|大批 | 匹配纯文本。仅应在无法使用其他方法的非常特殊的情况下使用。 | bexampleb |
css | 字符串|大批 | CSS 规则。当网站强制执行同源策略时不可用。出于性能原因,仅使用部分可用 CSS 规则来查找匹配项。 | "\.example-class" |
probe | 目的 | 请求 URL 以测试其存在或匹配文本内容。 | { "/path": "Example text" } |
robots | 字符串|大批 | Robots.txt 内容。 | "Disallow: /unique-path/" |
url | 字符串|大批 | 页面的完整 URL。 | "^https?//.+\.wordpress\.com" |
xhr | 字符串|大批 | XHR 请求的主机名。 | "cdn\.netlify\.com" |
meta | 目的 | HTML 元标记,例如生成器。 | { "generator": "^WordPress$" } |
scriptSrc | 字符串|大批 | 页面中包含的 JavaScript 文件的 URL。 | "jquery\.js" |
scripts | 字符串|大批 | JavaScript 源代码。检查内联和外部脚本。出于性能原因,请尽可能避免使用scripts 并使用js 。 | "function webpackJsonpCallback\(data\) {" |
html (已弃用) | 字符串|大批 | HTML 源代码。模式必须包含 HTML 开始标记以避免匹配纯文本。出于性能原因,请尽可能避免使用html 并使用dom 。 | "<a [^>]*href="index.html" |
模式本质上是写为字符串的 JavaScript 正则表达式,但还添加了一些内容。
\.
) 等特殊字符时,必须对转义字符本身进行转义。双引号只能转义一次 ( "
)。斜杠不需要转义 ( /
)。()
) 用于版本检测。在其他情况下,请使用非捕获组 ( (?:)
)。^
和$
)以获得最佳性能。标签(非标准语法)可以附加到模式(并暗示和排除,用\;
分隔)以存储附加信息。
标签 | 描述 | 例子 |
---|---|---|
confidence | 指示不太可靠的模式,可能会导致误报。目标是实现 100% 的综合置信度。如果未指定,则默认为 100%。 | "js": { "Mage": "\;confidence:50" } |
version | 使用特殊语法从模式匹配中获取版本号。 | "scriptSrc": "jquery-([0-9.]+).js\;version:\1" |
可以使用捕获组从模式中获取应用程序版本信息。可以使用三元运算符 ( ?:
:) 来评估条件。
例子 | 描述 |
---|---|
\1 | 返回第一个匹配项。 |
\1?a: | 如果第一个匹配项包含值,则返回 a,否则不返回。 |
\1?a:b | 如果第一个匹配项包含值,则返回 a,否则返回 b。 |
\1?:b | 如果第一个匹配项包含值,则不返回任何内容,否则返回 b。 |
foo\1 | 返回 foo 并附加第一个匹配项。 |