backend-inferencer
SKILL.md
Backend Inferencer Skill
Purpose
Infer backend technologies by analyzing HTTP headers, cookies, error pages, DNS records, and repository data.
Input
Raw signals from Phase 2:
http_signals- Server headers, X-Powered-By, cookiesdns_signals- Service verification TXT recordsrepository_signals- Dependencies, Dockerfileshtml_signals- Generator meta tags, CMS patterns
Technology Categories
Web Servers
| Technology | Detection Signals | Weight |
|---|---|---|
| nginx | Server: nginx, nginx error pages | 35-40 |
| Apache | Server: Apache, Apache error pages | 35-40 |
| Microsoft IIS | Server: Microsoft-IIS | 40 |
| Caddy | Server: Caddy | 35 |
| LiteSpeed | Server: LiteSpeed | 35 |
Programming Languages
| Technology | Detection Signals | Weight |
|---|---|---|
| Node.js | X-Powered-By: Express, connect.sid cookie | 30-40 |
| Python | X-Powered-By: gunicorn/Werkzeug, django_session cookie | 30-40 |
| PHP | X-Powered-By: PHP, PHPSESSID cookie | 35-40 |
| Ruby | _rails_session cookie, X-Request-Id | 30-40 |
| Java | JSESSIONID cookie, X-Powered-By: Servlet | 35-40 |
| Go | Custom patterns, repo analysis | 25-35 |
| .NET | ASP.NET_SessionId cookie, X-AspNet-Version | 40 |
Backend Frameworks
| Technology | Detection Signals | Implies | Weight |
|---|---|---|---|
| Express.js | X-Powered-By: Express | Node.js | 40 |
| NestJS | Nest patterns, repo analysis | Node.js, TypeScript | 35 |
| Fastify | Fastify patterns | Node.js | 35 |
| Django | csrftoken/django_session cookies | Python | 40 |
| Flask | Werkzeug server | Python | 35 |
| FastAPI | uvicorn patterns | Python | 35 |
| Rails | _rails_session cookie | Ruby | 40 |
| Laravel | laravel_session cookie, XSRF-TOKEN | PHP | 40 |
| Symfony | symfony cookie patterns | PHP | 35 |
| Spring | JSESSIONID, X-Application-Context | Java | 35 |
| ASP.NET | ASP.NET_SessionId | .NET | 40 |
Content Management Systems
| Technology | Detection Signals | Weight |
|---|---|---|
| WordPress | /wp-content/, /wp-admin/, generator meta | 45 |
| Drupal | X-Drupal-Cache, /sites/default/ | 45 |
| Joomla | generator meta, /components/ | 40 |
| Magento | /skin/frontend/, Mage patterns | 40 |
| Shopify | myshopify.com, Shopify patterns | 45 |
| Contentful | Contentful API patterns | 35 |
| Strapi | Strapi patterns | 35 |
| Ghost | Ghost generator meta | 40 |
Databases (Indirect Signals)
| Technology | Detection Signals | Weight |
|---|---|---|
| PostgreSQL | pg dependency, Heroku Postgres | 25-30 |
| MySQL | mysql dependency, common patterns | 25-30 |
| MongoDB | mongoose dependency, MongoDB Atlas TXT | 30 |
| Redis | redis dependency, session patterns | 25-30 |
| Elasticsearch | elasticsearch dependency | 25-30 |
| DynamoDB | AWS SDK patterns, boto3 | 25-30 |
API Technologies
| Technology | Detection Signals | Weight |
|---|---|---|
| GraphQL | /graphql endpoint, schema patterns | 35 |
| REST | /api/v1, OpenAPI spec | 25 |
| gRPC | grpc patterns in repos | 30 |
| tRPC | tRPC patterns | 30 |
Inference Logic
def infer_backend_technologies(signals):
results = []
# Web Server Detection
server_header = signals.http_signals.get('Server', '')
for server in SERVER_PATTERNS:
if server.pattern.match(server_header):
results.append({
"name": server.name,
"category": "Web Server",
"version": extract_version(server_header, server.pattern),
"signals": [{"type": "http_header", "value": f"Server: {server_header}"}],
"total_weight": server.weight
})
# Language/Framework from X-Powered-By
powered_by = signals.http_signals.get('X-Powered-By', '')
for framework in POWERED_BY_PATTERNS:
if framework.pattern in powered_by:
results.append({
"name": framework.name,
"category": framework.category,
"implies": framework.implies,
"signals": [{"type": "http_header", "value": f"X-Powered-By: {powered_by}"}],
"total_weight": framework.weight
})
# Cookie-based Detection
for cookie in signals.http_signals.cookies:
for pattern in COOKIE_PATTERNS:
if pattern.name in cookie:
results.append({
"name": pattern.tech,
"category": pattern.category,
"implies": pattern.implies,
"signals": [{"type": "cookie", "value": f"Cookie: {cookie}"}],
"total_weight": pattern.weight
})
# CMS Detection from HTML
for cms in CMS_PATTERNS:
score = 0
evidence = []
if cms.generator_pattern in signals.html_signals.generators:
score += 40
evidence.append("Generator meta tag")
for url_pattern in cms.url_patterns:
if url_pattern in signals.html_signals.script_urls:
score += 20
evidence.append(f"URL pattern: {url_pattern}")
if score > 0:
results.append({
"name": cms.name,
"category": "CMS",
"signals": evidence,
"total_weight": score
})
# Repository-based Detection
if signals.repository_signals:
for dep_file, deps in signals.repository_signals.dependencies.items():
for dep in deps:
if dep.name in DEPENDENCY_PATTERNS:
pattern = DEPENDENCY_PATTERNS[dep.name]
results.append({
"name": pattern.tech,
"category": pattern.category,
"version": dep.version,
"signals": [{"type": "dependency", "value": f"{dep.name}@{dep.version}"}],
"total_weight": pattern.weight
})
return results
Output
{
"skill": "backend_inferencer",
"results": {
"technologies": [
{
"name": "nginx",
"category": "Web Server",
"version": "1.18.0",
"signals": [
{
"type": "http_header",
"value": "Server: nginx/1.18.0",
"source": "https://example.com",
"weight": 40
}
],
"total_weight": 40
},
{
"name": "Express.js",
"category": "Backend Framework",
"signals": [
{
"type": "http_header",
"value": "X-Powered-By: Express",
"source": "https://api.example.com",
"weight": 40
},
{
"type": "cookie",
"value": "connect.sid session cookie",
"source": "https://example.com",
"weight": 30
}
],
"total_weight": 70,
"implies": ["Node.js"]
},
{
"name": "Node.js",
"category": "Runtime",
"signals": [
{
"type": "implied",
"value": "Implied by Express.js detection",
"weight": 0
},
{
"type": "dependency",
"value": "node version in package.json",
"source": "github.com/example/repo",
"weight": 35
}
],
"total_weight": 35
},
{
"name": "PostgreSQL",
"category": "Database",
"signals": [
{
"type": "dependency",
"value": "pg@8.11.0 in package.json",
"source": "github.com/example/repo",
"weight": 30
}
],
"total_weight": 30
}
],
"implied_technologies": [
{
"name": "Node.js",
"implied_by": ["Express.js"],
"confidence": "High"
}
],
"summary": {
"web_server": "nginx",
"runtime": "Node.js",
"framework": "Express.js",
"database": "PostgreSQL",
"cms": null
}
}
}
Version Detection
From Headers
Server: nginx/1.18.0 → nginx 1.18.0
X-Powered-By: PHP/8.1.0 → PHP 8.1.0
X-AspNet-Version: 4.0.30319 → ASP.NET 4.x
From Dependencies
// package.json
"express": "^4.18.2" → Express.js 4.18.x
// requirements.txt
Django==4.2.1 → Django 4.2.1
// Gemfile
gem 'rails', '~> 7.0' → Rails 7.0.x
Error Handling
- Missing headers: Continue with other signals
- Ambiguous cookies: Include all possibilities
- Conflicting signals: Report both, flag for correlation phase
Weekly Installs
4
Repository
transilienceai/…itytoolsGitHub Stars
67
First Seen
7 days ago
Security Audits
Installed on
opencode4
claude-code4
github-copilot4
codex4
amp4
cline4