PHPackages                             con2net/contao-anti-spam-form-bundle - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Security](/categories/security)
4. /
5. con2net/contao-anti-spam-form-bundle

ActiveContao-bundle[Security](/categories/security)

con2net/contao-anti-spam-form-bundle
====================================

Umfassendes Anti-SPAM Bundle für Contao Formulare mit ALTCHA Captcha, IP-Blacklist, Content-Analyse und Multi-Layer-Schutz

1.1(2mo ago)5633↑120%[1 issues](https://github.com/con2net/contao-anti-spam-form-bundle/issues)MITPHPPHP ^8.2

Since Nov 27Pushed 2mo ago2 watchersCompare

[ Source](https://github.com/con2net/contao-anti-spam-form-bundle)[ Packagist](https://packagist.org/packages/con2net/contao-anti-spam-form-bundle)[ RSS](/packages/con2net-contao-anti-spam-form-bundle/feed)WikiDiscussions master Synced 2d ago

READMEChangelogDependencies (6)Versions (7)Used By (0)

Contao Anti-SPAM Form Bundle
============================

[](#contao-anti-spam-form-bundle)

Ein umfassendes Anti-SPAM Bundle für Contao Formulare mit Multi-Layer-Schutz.

---

Wichtiger Hinweis / Disclaimer
------------------------------

[](#wichtiger-hinweis--disclaimer)

Dieses Bundle bietet umfangreiche SPAM-Schutz-Mechanismen, kann aber **keine 100%ige SPAM-Erkennung garantieren**.

**Bitte beachte:**

- **False-Positives sind möglich:** Legitime Anfragen können fälschlicherweise als SPAM erkannt werden
- **SPAM-Bots entwickeln sich weiter:** Die Wirksamkeit einzelner Checks kann mit der Zeit abnehmen
- **Regelmäßige Anpassung nötig:** Schwellwerte und Filter sollten überwacht und ggf. nachjustiert werden
- **Kein Anspruch auf Fehlerfreiheit:** Das Bundle wird ohne Gewährleistung bereitgestellt
- **Keine Haftung:** Für entgangene Anfragen oder Datenverluste wird keine Haftung übernommen

**Empfehlung:** Teste das Bundle ausführlich in einer Staging-Umgebung, bevor du es produktiv einsetzt. Überwache die Logs regelmäßig und passe die Einstellungen an deine Bedürfnisse an.

---

Features
--------

[](#features)

### Multi-Layer SPAM-Schutz

[](#multi-layer-spam-schutz)

Das Bundle kombiniert **7 verschiedene Schutzebenen**, die einzeln aktiviert und konfiguriert werden können:

1. **ALTCHA Captcha** - Modernes, barrierefreies Captcha ohne Tracking
2. **IP-Blacklist** - Prüfung gegen StopForumSpam.com Datenbank
3. **E-Mail-Blacklist** - Erkennung bekannter SPAM-E-Mail-Adressen
4. **Content-Analyse** - 7 intelligente Pattern-Checks (URLs, Sonderzeichen, etc.)
5. **Honeypot-Felder** - Unsichtbare Fallen für Bots (3 Varianten)
6. **Zeit-basierte Validierung** - Erkennung zu schneller/langsamer Submits
7. **JavaScript-Token** - Überprüfung ob JavaScript aktiv ist

### Highlights

[](#highlights)

- **Feldbasierte Content-Analyse** - Wähle für jeden Test die zu prüfenden Felder aus
- **Score-basiertes System** - Konfigurierbare Schwellwerte für flexible SPAM-Erkennung
- **DSGVO-konform** - Keine externen Tracking-Skripte, Daten bleiben auf dem Server
- **Fehler-tolerant** - API-Ausfälle brechen Formular-Submits nicht ab
- **Debug-Modus** - Ausführliche Logs für Entwickler
- **Kompatibel** - Funktioniert mit Notification Center, Standard-Mails, mehrstufigen Formularen (mp\_forms) u.v.m.

---

Installation
------------

[](#installation)

### Via Contao Manager

[](#via-contao-manager)

1. Contao Manager öffnen
2. Nach "con2net/contao-anti-spam-form-bundle" suchen
3. Bundle installieren
4. Datenbank aktualisieren

### Alternativ auch via Composer

[](#alternativ-auch-via-composer)

```
composer require con2net/contao-anti-spam-form-bundle
```

Datenbank aktualisieren:

```
php vendor/bin/contao-console contao:migrate
```

Das war's. Das Bundle funktioniert direkt nach der Installation **ohne weitere Konfiguration**.

---

Konfiguration
-------------

[](#konfiguration)

### Zero-Config (empfohlen für die meisten Installationen)

[](#zero-config-empfohlen-für-die-meisten-installationen)

Nach der Installation und Datenbankaktualisierung ist das Bundle sofort einsatzbereit:

- **HMAC-Key wird automatisch generiert** und in der Datenbank gespeichert (Tabelle `tl_c2n_settings`). Kein manuelles Setzen erforderlich.
- **PBKDF2/SHA-256** wird als Standard-Algorithmus verwendet – sicher und ohne zusätzliche Abhängigkeiten.
- Alle anderen Einstellungen haben sinnvolle Standardwerte.

### Optionaler eigener HMAC-Key (.env.local)

[](#optionaler-eigener-hmac-key-envlocal)

Für Produktionsumgebungen, in denen du den HMAC-Key selbst verwalten möchtest (z.B. für Secrets Management oder manuelle Key-Rotation), kannst du ihn in der `.env.local` setzen:

```
###> con2net/contao-anti-spam-form-bundle ###
ALTCHA_HMAC_KEY="DEIN-GENERIERTER-KEY-HIER"
###< con2net/contao-anti-spam-form-bundle ###
```

**Key generieren (Linux/Mac):**

```
openssl rand -base64 32
```

**Key generieren (PHP, plattformunabhängig):**

```
php -r "echo bin2hex(random_bytes(32));"
```

**Key generieren (Windows PowerShell):**

```
$bytes = New-Object byte[] 32
[System.Security.Cryptography.RNGCryptoServiceProvider]::Create().GetBytes($bytes)
[Convert]::ToBase64String($bytes)
```

Ein manuell gesetzter Key hat immer Vorrang vor dem automatisch generierten.

> **Hinweis für Shared Hosting:** Die `.env.local` gehört ins Root-Verzeichnis deiner Contao-Installation – dort wo auch die `composer.json` liegt, **nicht** in den Webroot (`public/` oder `web/`). Beispiel: Webroot ist `./client_1234/public_html/public/`, dann gehört die `.env.local` nach `./client_1234/public_html/`. Falls noch keine .env vorhanden ist, lege zusätzlich eine leere .env Datei direkt daneben ins gleiche Verzeichnis.

> **Updater von v1.0.x:** Wenn du bisher `ALTCHA_HMAC_KEY` in der `.env.local` hattest und auf den automatisch generierten Key wechseln möchtest, kannst du die Zeile einfach auskommentieren oder entfernen. Das Bundle generiert dann beim nächsten Seitenaufruf automatisch einen neuen Key.

### Optionale ALTCHA-Konfiguration (config.yml)

[](#optionale-altcha-konfiguration-configyml)

Das Bundle funktioniert vollständig **ohne** Einträge in der `config.yml`. Falls du die Schwierigkeit oder den Algorithmus anpassen möchtest:

```
# config/config.yml
contao_anti_spam_form:
  altcha:
    # Challenge-Schwierigkeit (höher = schwerer für Bots, langsamer für User)
    # Easy: 10000, Normal: 50000, Medium: 100000, Hard: 250000, Very Hard: 500000
    max_number: 100000

    # Salt-Länge (8-32 Zeichen)
    # Hinweis: Wird nur bei Legacy-Algorithmen (SHA-256/384/512) verwendet.
    # Bei PBKDF2, Argon2id und Scrypt wird dieser Wert ignoriert.
    salt_length: 16

    # Algorithmus (siehe Tabelle unten)
    algorithm: 'pbkdf2'
```

> **Updater von v1.0.x:** Wenn du bisher `algorithm: 'SHA-256'` in deiner `config.yml` hattest, funktioniert das weiterhin ohne Änderungen. Du kannst den Eintrag aber entfernen, um den neuen PBKDF2-Standard zu nutzen – oder auf `pbkdf2-sha384` / `pbkdf2-sha512` upgraden für mehr Sicherheit.

#### Verfügbare Algorithmen

[](#verfügbare-algorithmen)

AlgorithmusInternes FormatSicherheitEmpfehlung`pbkdf2`PBKDF2/SHA-256★★★★☆**Standard für neue Installationen**`pbkdf2-sha384`PBKDF2/SHA-384★★★★★Erhöhte Sicherheit`pbkdf2-sha512`PBKDF2/SHA-512★★★★★Maximale PBKDF2-Sicherheit`SHA-256`SHA-256 (Legacy)★★☆☆☆Bestehende Installationen (Backwards-Compat)`SHA-384`SHA-384 (Legacy)★★★☆☆Bestehende Installationen`SHA-512`SHA-512 (Legacy)★★★☆☆Bestehende Installationen`argon2id`Argon2id★★★★★Vorbereitet – kommt in einer der nächsten Versionen`scrypt`Scrypt★★★★★Vorbereitet – kommt in einer der nächsten Versionen> **Hinweis zu Legacy-Algorithmen (SHA-256/384/512):** Diese nutzen das ältere V1 ALTCHA-Format und sind ausschließlich für Backwards-Kompatibilität mit bestehenden Installationen vorgesehen. Für neue Installationen sind PBKDF2-Varianten empfohlen.

#### Schwierigkeitsgrade (so in etwa ;-))

[](#schwierigkeitsgrade-so-in-etwa--)

max\_numberSchwierigkeitDurchschnittliche LösungszeitEmpfohlen für10.000Very Easy&lt; 1 SekundeTesting50.000Easy1-2 SekundenHoher Traffic / Mobile100.000Medium2-4 Sekunden**Standard-Websites**250.000Hard5-10 SekundenHochsichere Formulare500.000Very Hard10-20 SekundenMaximale Sicherheit> **Hinweis zu PBKDF2-SHA-384/512:** Bei stärkeren Algorithmen kann die Lösungszeit etwas länger sein. Ggf. `max_number` entsprechend anpassen.

### Optionale IP-Blacklist Konfiguration

[](#optionale-ip-blacklist-konfiguration)

```
contao_anti_spam_form:
  ip_blacklist:
    cache_lifetime: 86400   # 24h Cache für API-Anfragen
    api_timeout: 3          # 3s Timeout für StopForumSpam API
    whitelist:
      - '127.0.0.1'         # Localhost immer erlauben
      - '192.168.1.0/24'    # Lokales Netzwerk
      # - '10.0.0.0/8'      # Firmen-VPN (Beispiel)
```

---

Verwendung
----------

[](#verwendung)

### Formular erstellen

[](#formular-erstellen)

1. **Backend → Formulare → Neues Formular**
2. Füge deine Formularfelder hinzu (E-Mail, Name, Nachricht, etc.)
3. Aktiviere den Anti-SPAM Schutz

### Anti-SPAM aktivieren

[](#anti-spam-aktivieren)

**Backend → Formulare → \[Dein Formular\]**

Scrolle zur Sektion **"Anti-SPAM Schutz"** und aktiviere die gewünschten Features.

#### Basis-Einstellungen

[](#basis-einstellungen)

- **Anti-SPAM Schutz aktivieren** - Hauptschalter für alle Schutzfunktionen
- **Minimale Absende-Zeit** - Formulare schneller als X Sek. = SPAM (z.B. 10 Sek.)
- **Maximale Absende-Zeit** - Formulare langsamer als X Sek. = SPAM (z.B. 300 Sek. oder 0 für unbegrenzt)
- **SPAM-Markierung** - Text für `##form_spam_marker##` Variable (z.B. `*** SPAM *** `)
- **SPAM-Nachrichten nicht senden** - SPAM-E-Mails komplett blockieren (statt nur markieren)

#### Erweiterte Features

[](#erweiterte-features)

- **ALTCHA Captcha aktivieren** - Barrierefreies Captcha (benötigt ALTCHA-Formularfeld!)
- **IP-Blacklist Check aktivieren** - Prüfung gegen StopForumSpam.com
- **Debug-Modus aktivieren** - Ausführliche Logs (für Troubleshooting/Analyse)

### Content-Analyse konfigurieren

[](#content-analyse-konfigurieren)

**Backend → Formulare → \[Dein Formular\] → Content-Analyse**

Die Content-Analyse bietet **7 intelligente Tests**, die für jedes Formular-Feld einzeln aktiviert werden können:

#### 1. URLs im Text prüfen

[](#1-urls-im-text-prüfen)

Erkennt Links in Nachrichtenfeldern (sehr viel SPAM enthält URLs).

- **Score:** 50 Punkte (Standard)
- **Felder wählen:** Empfiehlt sich für Nachrichtenfelder o.ä.

#### 2. Nur Sonderzeichen prüfen

[](#2-nur-sonderzeichen-prüfen)

Erkennt Nachrichten wie `!!!###$$$`.

- **Score:** 40 Punkte
- **Felder wählen:** Name, Nachricht, Betreff

#### 3. Tempmail-Adressen prüfen

[](#3-tempmail-adressen-prüfen)

Erkennt Wegwerf-E-Mail-Adressen (10minutemail.com, etc.).

- **Score:** 30 Punkte
- **Domains:** Vordefinierte Liste (erweiterbar)

#### 4. Nachricht zu kurz prüfen

[](#4-nachricht-zu-kurz-prüfen)

Erkennt zu kurze Nachrichten wie "test", "hi".

- **Score:** 25 Punkte
- **Mindestlänge:** 10 Zeichen (Standard)
- **Felder wählen:** NUR große Textfelder (Textarea), Eher NICHT Vorname o.ä.!

#### 5. Repetitive Zeichen prüfen

[](#5-repetitive-zeichen-prüfen)

Erkennt Wiederholungen wie `aaaaaaa`, `!!!!!!`.

- **Score:** 20 Punkte
- **Felder wählen:** Alle Textfelder

#### 6. Großbuchstaben prüfen

[](#6-großbuchstaben-prüfen)

Erkennt übermäßig viele Großbuchstaben (`HELLO THIS IS IMPORTANT!!!`).

- **Score:** 15 Punkte
- **Max. Anteil:** 60% (Standard)
- **Felder wählen:** NICHT Länder-/Code-Felder (DE, ES, etc.)!

#### 7. SPAM-Keywords prüfen

[](#7-spam-keywords-prüfen)

Sucht nach typischen SPAM-Wörtern.

- **Score:** 10 Punkte pro Keyword (max. 30)
- **Keywords:** Anpassbar (Standard: viagra, casino, crypto, etc.)
- **ACHTUNG:** Kann zu False-Positives führen! Nur aktivieren wenn sorgfältig konfiguriert.

#### Score-System

[](#score-system)

- **SPAM-Schwellwert:** 50 Punkte (Standard)
- Jeder Test addiert Punkte
- Ab Schwellwert = SPAM erkannt
- **Empfehlung:** Beginne mit 50, passe nach Bedarf an (höher = weniger streng)

### Honeypot-Felder hinzufügen

[](#honeypot-felder-hinzufügen)

**Backend → Formulare → \[Dein Formular\] → Neues Formularfeld**

Wähle einen der 3 Honeypot-Typen:

1. **Honeypot (Text)** - Getarntes Textfeld
2. **Honeypot (Textarea)** - Getarntes Nachrichtenfeld
3. **Honeypot (Checkbox)** - Getarnte Checkbox

**Feldname:** Beliebig (z.B. `local_office_address`, `business_role`)

Empfehlenswert sind Feldnamen, die eine gewisse Verlockung auf Bots ausüben. Nicht zu "üblich" – AutoComplete-Mechanismen in Browsern könnten das Feld sonst bei echten Nutzern vorausfüllen.

**Empfohlene Labels (unauffällig):**

- "Position" / "Business Role"
- "Zusätzliche Informationen"
- "Newsletter abonnieren"

### ALTCHA-Feld hinzufügen

[](#altcha-feld-hinzufügen)

**Backend → Formulare → \[Dein Formular\] → Neues Formularfeld**

1. Feldtyp: **ALTCHA Anti-SPAM Widget**
2. Feldname: `captcha` (empfohlen)
3. Fertig! Das Widget konfiguriert sich automatisch.

### E-Mail-Benachrichtigung

[](#e-mail-benachrichtigung)

In deiner E-Mail-Benachrichtigung (Notification Center oder Contao Standard) steht das Token `##form_spam_marker##` zur Verfügung.

**Beispielhafte Verwendung im Betreff:**

```
##form_spam_marker##Neue Anfrage über Kontaktformular

```

**Ergebnis:**

- Normal: `Neue Anfrage über Kontaktformular`
- SPAM: `*** SPAM *** Neue Anfrage über Kontaktformular`

So kannst du SPAM-Nachrichten im Posteingang sofort erkennen und z.B. automatisch in einen Spam-Ordner verschieben lassen.

---

Logs &amp; Debugging
--------------------

[](#logs--debugging)

### System-Log

[](#system-log)

**Backend → System → System-Log**

Hier findest du alle Anti-SPAM Ereignisse:

- **Rot:** SPAM erkannt, Formular blockiert
- **Normal:** Prüfung erfolgreich, kein SPAM / Informationen

**Debug-Modus aktivieren** für detaillierte Logs:

- Zeit-Berechnungen
- Feldmappings
- Content-Analyse Scores
- API-Requests

---

Troubleshooting
---------------

[](#troubleshooting)

### .env.local wird nicht erkannt

[](#envlocal-wird-nicht-erkannt)

Die `.env.local` muss im Contao-Root-Verzeichnis liegen – dort wo die `composer.json` ist. Bei typischen Shared-Hosting-Setups liegt der Webroot in einem Unterordner (`public/` oder `web/`). Die `.env.local` gehört eine Ebene darüber, nicht in den Webroot. Nach dem Anlegen der Datei unbedingt den Cache leeren:

```
php vendor/bin/contao-console cache:clear
```

### ALTCHA wird nicht angezeigt

[](#altcha-wird-nicht-angezeigt)

1. ALTCHA-Formularfeld hinzugefügt?
2. Cache geleert? (`php vendor/bin/contao-console cache:clear`)
3. Browser-Console: JavaScript-Fehler?
4. Contao-Manager: Datenbank aktualisiert? (bzw.`contao:migrate`)

### Content-Analyse funktioniert nicht

[](#content-analyse-funktioniert-nicht)

1. Content-Analyse aktiviert?
2. Mindestens ein Test aktiviert?
3. Felder ausgewählt?
4. Debug-Modus: Logs prüfen

### Legitime Anfragen werden als SPAM erkannt

[](#legitime-anfragen-werden-als-spam-erkannt)

1. **Schwellwert erhöhen** (z.B. von 50 auf 70)
2. **Tests deaktivieren** die zu streng sind
3. **Felder anpassen** (z.B. "Website"-Feld vom URL-Check ausschließen)
4. **Debug-Modus** aktivieren und Scores analysieren

### SPAM kommt trotzdem durch

[](#spam-kommt-trotzdem-durch)

1. **Schwellwert senken** (z.B. von 50 auf 30)
2. **Mehr Tests aktivieren**
3. **IP-Blacklist aktivieren**
4. **ALTCHA aktivieren**
5. **Honeypot-Felder hinzufügen**

---

Technische Details
------------------

[](#technische-details)

### Systemanforderungen

[](#systemanforderungen)

- PHP 8.2 oder höher
- Contao 4.13 LTS oder Contao 5.3 LTS
- Symfony 5.4 / 6.x / 7.x

### Architektur

[](#architektur)

```
Services:
  - AltchaService         (Challenge-Erstellung + Validierung, V1/V2)
  - IpBlacklistService    (StopForumSpam.com API)
  - ContentAnalysisService(Pattern-Matching)
  - LoggingHelper         (Unified Logging)

Listener:
  - FormLoadListener      (Session-Timestamp)
  - AntiSpamFormListener  (Multi-Layer SPAM-Checks)
  - PageListener          (CSS/JS Assets)

Widgets:
  - AltchaFormField       (ALTCHA Captcha)
  - HoneypotField         (Text)
  - HoneypotTextareaField (Textarea)
  - HoneypotCheckboxField (Checkbox)

Datenbank:
  - tl_c2n_settings       (Gemeinsame Settings-Tabelle für con2net Bundles,
                            speichert den automatisch generierten HMAC-Key)

```

---

Changelog
---------

[](#changelog)

Siehe [CHANGELOG.md](CHANGELOG.md) für eine vollständige Versionshistorie.

---

Lizenz
------

[](#lizenz)

MIT License – siehe [LICENSE](LICENSE)

---

Credits
-------

[](#credits)

- **ALTCHA:**  /
- **StopForumSpam:**
- **Contao CMS:**

---

Support
-------

[](#support)

**Projekt:**
**Website:**

---

Entwickelt mit ❤️ in Norddeutschland von **connect2Net webServices** / Stefan Meise

###  Health Score

44

—

FairBetter than 90% of packages

Maintenance83

Actively maintained with recent releases

Popularity22

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity52

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~30 days

Recently: every ~37 days

Total

6

Last Release

65d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/ac0762d9bbef65a1c45415f29d26173d842821dcc779f4496d899b16fcdb98c3?d=identicon)[con2net](/maintainers/con2net)

---

Top Contributors

[![con2net](https://avatars.githubusercontent.com/u/13145836?v=4)](https://github.com/con2net "con2net (15 commits)")

---

Tags

spamcaptchacontaoFormsHoneypotblacklistprotectionALTCHA

### Embed Badge

![Health badge](/badges/con2net-contao-anti-spam-form-bundle/health.svg)

```
[![Health](https://phpackages.com/badges/con2net-contao-anti-spam-form-bundle/health.svg)](https://phpackages.com/packages/con2net-contao-anti-spam-form-bundle)
```

###  Alternatives

[msurguy/honeypot

Honeypot spam prevention

4371.3M13](/packages/msurguy-honeypot)[metamodels/core

MetaModels core

10156.4k68](/packages/metamodels-core)[rcsofttech/audit-trail-bundle

Enterprise-grade, high-performance Symfony audit trail bundle. Automatically track Doctrine entity changes with split-phase architecture, multiple transports (HTTP, Queue, Doctrine), and sensitive data masking.

1189.8k](/packages/rcsofttech-audit-trail-bundle)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
