Technische Dokumentation

Detaillierte Beschreibung aller Tests und Prüfungen, die der Enjyn Crawler durchführt. Für Entwickler und technisch Interessierte.

Für Entwickler

System-Architektur

Technologie-Stack

Python 3.11+
Flask Web Framework
httpx (HTTP Client)
BeautifulSoup4 (HTML Parser)
lxml (XML/HTML Parser)
Lingua (Spracherkennung)
SQLite Datenbank
Gunicorn WSGI Server

Scan-Ablauf

URL Eingabe
HTML Abruf
Sprache prüfen
Tests ausführen
Score berechnen
Report

Sicherheits-Tests

SSL/HTTPS Zertifikat

15 Punkte (eTrust) Kritisch

Prüft ob die Website über HTTPS erreichbar ist und ob das SSL-Zertifikat gültig ist.

Technische Umsetzung

  • Verbindung über Port 443 mit ssl.create_default_context()
  • Auslesen des Zertifikats mit ssock.getpeercert()
  • Prüfung des notAfter Datums für Ablaufwarnung
  • Warnung bei < 30 Tagen, kritisch bei < 14 Tagen
with socket.create_connection((domain, 443)) as sock: with context.wrap_socket(sock) as ssock: cert = ssock.getpeercert() not_after = cert['notAfter']

HSTS Header

Sicherheits-Bonus Mittel

HTTP Strict Transport Security zwingt Browser, nur HTTPS zu verwenden.

Technische Umsetzung

  • Prüfung auf Strict-Transport-Security Header
  • Nur relevant wenn Seite über HTTPS geladen wurde
  • Verhindert Downgrade-Angriffe auf HTTP
if 'strict-transport-security' not in headers: # HSTS fehlt - Browser können HTTP verwenden issue = 'missing_hsts'

Content Security Policy

Sicherheits-Bonus Mittel

CSP schützt vor XSS-Angriffen durch Whitelist für erlaubte Ressourcen.

Technische Umsetzung

  • Prüfung auf Content-Security-Policy Header
  • Alternativ: Content-Security-Policy-Report-Only
  • Alternativ: <meta http-equiv="CSP"> Tag
# Prüft Header und Meta-Tag has_csp = 'content-security-policy' in headers meta_csp = soup.find('meta', {'http-equiv': 'CSP'})

Clickjacking-Schutz

Sicherheits-Bonus Mittel

Verhindert dass die Seite in fremden iFrames eingebettet wird (Clickjacking).

Technische Umsetzung

  • Prüfung auf X-Frame-Options Header
  • Alternativ: CSP frame-ancestors Direktive
  • Nur kritisch bei Seiten mit Login-Formularen

Mixed Content

Sicherheits-Abzug Mittel

Erkennt unsichere HTTP-Ressourcen auf HTTPS-Seiten (Bilder, Scripts, Styles).

Technische Umsetzung

  • Scan aller <script>, <link>, <img>, <iframe> Tags
  • Prüfung ob src oder href mit http:// beginnt
  • Zählung der unsicheren Ressourcen
for tag in soup.find_all(['script', 'img', 'link']): src = tag.get('src') or tag.get('href') if src.startswith('http://'): http_resources.append(src)

Veraltete Bibliotheken

Sicherheits-Abzug Mittel

Erkennt bekannte verwundbare JavaScript-Bibliotheken (jQuery, Angular, Bootstrap, Lodash).

Technische Umsetzung

  • Regex-Pattern für Versions-Erkennung in Script-Pfaden
  • Abgleich mit bekannten verwundbaren Versionen
  • z.B. jQuery < 3.5.0 hat XSS-Schwachstellen
vulnerable_libs = { 'jquery': { 'pattern': r'jquery[.-]?([\d.]+)\.js', 'vulnerable': ['1.', '2.', '3.0'-'3.4.1'] } }

Exponierte Informationen

Sicherheits-Abzug Niedrig-Mittel

Erkennt sensible Daten in HTML-Kommentaren, Debug-Modi und Server-Pfade.

Technische Umsetzung

  • Suche nach Schlüsselwörtern: password, api_key, secret, token
  • Erkennung von Debug-Indikatoren: debug=true, localhost
  • Server-Pfade: /var/www/, C:\\, /home/user/

Unsichere Formulare

Sicherheits-Abzug Hoch

Prüft Formulare auf HTTP-Action, fehlenden CSRF-Schutz und GET bei sensiblen Daten.

Technische Umsetzung

  • Prüfung action="http://..." (unverschlüsselt)
  • Suche nach CSRF-Token in Hidden-Fields
  • GET-Methode bei Passwort/Email-Feldern = unsicher

SEO-Tests

Title-Tag

SEO-Faktor Wichtig

Prüft Vorhandensein, Länge (10-70 Zeichen) und Qualität des Title-Tags.

Technische Umsetzung

  • soup.find('title') - Title-Tag finden
  • Längenkontrolle: 10-70 Zeichen optimal
  • Erkennung generischer Titles: "Home", "Willkommen", "Untitled"
title = soup.find('title') if len(title.string) < 10: issue = 'short_title' elif len(title.string) > 70: issue = 'long_title'

Meta-Description

SEO-Faktor Wichtig

Prüft Vorhandensein und optimale Länge (50-160 Zeichen) der Meta-Description.

Technische Umsetzung

  • soup.find('meta', {'name': 'description'})
  • Optimal: 50-160 Zeichen für Suchergebnisse
  • Zu kurz: verschenktes Potential
  • Zu lang: wird in SERPs abgeschnitten

H1-Überschrift

SEO-Faktor Mittel

Prüft ob genau eine H1-Überschrift vorhanden ist und diese Inhalt hat.

Technische Umsetzung

  • soup.find_all('h1') - Alle H1s zählen
  • Optimal: Genau 1 H1 pro Seite
  • Mehrere H1s oder keine = SEO-Problem

Bild Alt-Texte

SEO + Barrierefreiheit Mittel

Prüft ob Bilder Alt-Attribute haben (wichtig für SEO und Screenreader).

Technische Umsetzung

  • Alle <img> Tags sammeln
  • Prüfung auf alt Attribut
  • Dekorative Bilder (Icons) werden übersprungen
  • Warnung bei > 20% fehlenden Alt-Tags
images = soup.find_all('img') missing_alt = [img for img in images if not img.get('alt')]

Canonical URL

SEO-Faktor Niedrig

Prüft ob eine kanonische URL definiert ist (verhindert Duplicate Content).

Technische Umsetzung

  • soup.find('link', {'rel': 'canonical'})
  • Prüfung ob href-Attribut vorhanden
  • Wichtig bei mehreren URL-Varianten (www/non-www)

Strukturierte Daten

SEO-Bonus Niedrig

Erkennt Schema.org JSON-LD und Microdata für Rich Snippets.

Technische Umsetzung

  • Suche nach <script type="application/ld+json">
  • Erkennung von Microdata: itemscope, itemprop
  • Schema-Typen: Organization, LocalBusiness, Product

Mobile-Tests

Viewport Meta-Tag

Mobile-Pflicht Kritisch

Prüft ob der Viewport korrekt konfiguriert ist für responsive Darstellung.

Technische Umsetzung

  • Suche nach <meta name="viewport">
  • Prüfung auf width=device-width
  • Warnung bei fester Breite (z.B. width=1024)
  • Warnung bei user-scalable=no (Barrierefreiheit)
viewport = soup.find('meta', {'name': 'viewport'}) if 'width=device-width' not in content: # Viewport nicht responsive if 'user-scalable=no' in content: # Zoom deaktiviert - schlecht für a11y

Responsive Design

Mobile-Faktor Mittel

Prüft ob Media Queries oder Responsive Frameworks verwendet werden.

Technische Umsetzung

  • Suche nach @media Rules im CSS
  • Erkennung von Frameworks: Bootstrap, Tailwind, Foundation
  • Responsive Klassen: col-, grid, flex, d-none

Feste Breiten

Mobile-Problem Mittel

Erkennt feste Pixel-Breiten > 400px die horizontales Scrollen verursachen.

Technische Umsetzung

  • Regex: width:\s*(\d{4,})px
  • Prüfung von inline Styles und CSS
  • width-Attribute auf div, table, section

Touch-Targets

Usability Niedrig

Erkennt zu kleine Klickziele (< 30px) die auf Touch-Geräten schwer zu treffen sind.

Technische Umsetzung

  • Prüfung von Links, Buttons, Inputs
  • Analyse von height/width in inline Styles
  • Empfohlen: Mindestens 44x44px (Apple HIG)

Schriftgrößen

Lesbarkeit Niedrig

Erkennt zu kleine Schriftgrößen (< 12px) die auf Mobile schwer lesbar sind.

Technische Umsetzung

  • Regex: font-size:\s*(\d+)(px|pt)
  • pt zu px Konvertierung (×1.33)
  • Warnung bei mehreren < 12px Definitionen

Flash/Silverlight

Kompatibilität Kritisch

Erkennt veraltete Plugin-Inhalte die auf Mobilgeräten nicht funktionieren.

Technische Umsetzung

  • Suche nach <object> und <embed>
  • Prüfung auf type="application/x-shockwave-flash"
  • Erkennung von .swf Dateien

Vertrauens-Tests (eTrust)

Kontaktinformationen

10 Punkte Mittel

Prüft ob E-Mail, Telefon oder Kontaktformular vorhanden sind.

Technische Umsetzung

  • E-Mail-Regex: [a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}
  • Priorität: info@, kontakt@, contact@, mail@
  • Filter: Keine Bild-URLs, keine Platzhalter
EMAIL_PATTERN = re.compile( r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' ) PRIORITY_PREFIXES = ['info@', 'kontakt@', 'contact@']

Malware-Indikatoren

10 Punkte Kritisch

Erkennt verdächtige Scripts, Cryptominer und Phishing-Elemente.

Technische Umsetzung

  • Bekannte Miner: CoinHive, JSEcoin, CryptoLoot
  • Obfuskierter Code: eval(atob(...)), document.write(unescape(...))
  • Redirect-Ketten, versteckte iFrames

Professionelles Erscheinungsbild

8 Punkte Niedrig

Prüft auf Favicon, Lorem Ipsum, Platzhalter-Bilder und "Coming Soon".

Technische Umsetzung

  • Favicon: <link rel="icon"> oder /favicon.ico
  • Lorem Ipsum Erkennung im Text
  • Platzhalter: placeholder.com, via.placeholder.com

Länder-Erkennung

Kontext Info

Ermittelt das Land anhand von Postleitzahlen, Telefonnummern und USt-IdNr.

Technische Umsetzung

  • DE: 5-stellige PLZ, +49, DE + 9 Ziffern (USt-IdNr)
  • AT: 4-stellige PLZ + Wien/Graz, +43, ATU + 8 Ziffern
  • CH: 4-stellige PLZ + Zürich/Bern, +41, CHE-Format
# Deutsche USt-IdNr if re.search(r'\bDE\s*\d{9}\b', text): scores['Deutschland'] += 3 # Österreichische UID if re.search(r'\bATU\s*\d{8}\b', text): scores['Österreich'] += 3

CMS-Erkennung

Info Info

Erkennt das verwendete CMS oder Website-Builder System.

Technische Umsetzung

  • WordPress: /wp-content/, meta generator, wp-json
  • Wix: wix.com, x-wix Header
  • Shopify: cdn.shopify.com, x-shopify Header
  • +15 weitere: Joomla, Drupal, TYPO3, Squarespace, Webflow...
# WordPress Detection if '/wp-content/' in html: wp_indicators += 2 if soup.find('meta', {'name': 'generator', 'content': re.compile('wordpress')}): wp_indicators += 2

Sprach-Erkennung

Filter Info

Erkennt die Sprache der Website (nur deutschsprachige Seiten werden vollständig gescannt).

Technische Umsetzung

  • Priorität 1: HTML lang-Attribut (lang="de")
  • Priorität 2: Lingua Library (AI-basiert, 95%+ Genauigkeit)
  • Priorität 3: langdetect (statistisch)
  • Fallback: Deutsche Keywords (Impressum, Datenschutz, etc.)