Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Antispam Bundle Laravel Package

core23/antispam-bundle

A Symfony bundle for stopping form spam with honeypots, submission timers, banned scripts, markup and phrases, plus URL counting. Configure reusable anti-spam profiles and apply them to any form. Compatible with PHP 8.2+ and Symfony 6.4, 7.x and 8.x.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit

The framing of "Laravel/PHP package" does not survive contact with the artifact. This is a Symfony bundle, not a Laravel package, and the distinction is not cosmetic:

  • It installs through Symfony's bundle system — a Bundle subclass, a DependencyInjection extension, container tags, and auto-wiring conventions that Laravel's service container does not implement.
  • Its enforcement points are symfony/form extensions and form event subscribers, symfony/options-resolver for profile config, symfony/http-foundation for request inspection, and symfony/translation for messages. Laravel has no Form component, no form events, and no equivalent extension registry.
  • There is no ServiceProvider, no publishable config file, no facade, no middleware registered into Laravel's HTTP kernel, and no Blade/Livewire/Inertia integration. Installing it via Composer into a Laravel app would either fail or produce dead code that never fires.

The only thing that maps to our stack is the detection strategy catalog — honeypot fields, time-based submission traps, banned scripts (Cyrillic/Arabic), banned markup (HTML/BBCode), banned phrases, and URL-count heuristics — plus the profile-based configuration model that groups them per form. That is a design pattern, and a small one: a few hundred lines of heuristics and config. The leverage a TPM gets from this package is that it validates the pattern and gives us a documented, tested reference, not that it gives us an installable dependency.

Integration feasibility

Direct integration into our Laravel estate: not feasible without a rewrite, and a rewrite means we are no longer adopting the package. Viable paths, ranked:

  1. Laravel-native equivalents. Built-in throttle middleware and RateLimiter, custom FormRequest validation rules, a maintained honeypot package such as spatie/laravel-honeypot, and optionally Cloudflare Turnstile on high-risk public forms. This delivers the same outcome with first-class support for our stack.
  2. Port the pattern into a thin in-house package. A config file defining per-form "profiles", a middleware or validation rule per mechanism, and a strategy interface so mechanisms can be swapped. This is where a TPM can extract real value from this repo: its profile-based configuration and mechanism separation are a clean, low-cost model to copy.
  3. Consume it only in a genuine Symfony service. If any part of the estate runs Symfony 6.4/7.4/8.x, this is a legitimate dependency there. It is not usable in Laravel.

Explicitly rejected: running Symfony components standalone inside Laravel. The DI wiring and form integration assume a full Symfony kernel; the maintenance cost dwarfs the benefit.

Technical risk

  • Adoption risk (high). Zero stars, zero dependents, score 0, documentation limited to a README. There is no evidence of production use anywhere.
  • Identity and lineage risk (high). The repository is nucleos/NucleosAntiSpamBundle, the package coordinate given is core23/antispam-bundle, and every README badge points to omines/antispam-bundle. That is a fork of a fork with the original vendor's README intact. Fork drift, unmerged upstream fixes, and unclear canonical ownership are all live.
  • Maintenance risk (high). No visible release cadence, security policy, or issue-responsiveness signal. Assume we inherit maintenance if we depend on it.
  • Functional risk (medium-high). Heuristic anti-spam is adversarial and decays. Word lists, script bans, and URL thresholds silently rot without curation. Honeypots and time traps are trivially defeated by modern headless bots; they stop commodity scrapers, not targeted abuse.
  • False-positive risk (high business impact). Time traps break with aggressive page caching and with very fast legitimate users (autofill, password managers, mobile submit). Banned-script rules block real international users. IP blocks punish shared NAT, corporate, and VPN egress. Duplicate-content checks flag legitimate repeat submissions. Every one of these lands as a conversion loss or a support ticket.
  • Compliance risk (medium). IP and content retention for scoring can create GDPR/CCPA obligations; a third-party CAPTCHA adds a data processor and a front-end script, which undercuts the "no third-party JS" advantage this package otherwise offers.

Key questions before any commitment

  • Which package is canonical and which repository is source of truth — core23, nucleos, or omines? Is this fork intended for public consumption, and is the upstream actively maintained?
  • Is Laravel support intended, planned, or permanently out of scope?
  • What is the supported PHP/Symfony matrix and the EOL policy per branch?
  • Is there a security disclosure process and a dated release history?
  • Are the detection strategies pluggable and unit-testable in isolation, or hard-wired to Symfony request/form objects? (This determines whether the code is portable at all.)
  • Does anything apply to JSON/API endpoints, or is it strictly HTML-form oriented?
  • Licensing terms and compatibility with our distribution model?

Integration Approach

Stack fit

Poor, and this should be stated plainly to stakeholders rather than hedged. Symfony-only coupling to form events and the HTTP kernel, against a Laravel estate built on service providers, a middleware pipeline, FormRequest validation, and Blade/Livewire/Inertia forms — there are no shared extension points. The fit that is good is conceptual: the profile-based configuration model and the separation of independent, testable mechanisms are directly transposable onto Laravel's middleware and validation primitives.

Migration path

There is no migration path in the usual sense, because there is nothing to migrate from. The realistic path is a port:

  • Take the profile concept (named, reusable rule sets, attached per form) into a config/antispam.php.
  • Take each mechanism and express it as a Laravel custom validation rule or a dedicated middleware, behind a common strategy interface.
  • Keep the config declarative so that policy changes are reviewable diffs, not code changes.
  • Where a mechanism already exists natively (throttle, RateLimiter, spatie/laravel-honeypot), use it and do not port the equivalent heuristic.

Compatibility

The README claims PHP 8.2+ and Symfony 6.4 LTS, 7.4 LTS, and 8.x. That matrix is irrelevant to our Laravel runtime except as a signal that the upstream is reasonably current. What matters is that the pattern is framework-agnostic and the code is not.

Sequencing

  1. Spike (one sprint, timeboxed). Instrument two revenue-critical forms — registration and contact — with ported mechanisms behind our own interface. Exit criteria agreed up front.
  2. Measurement window (four weeks). Track spam catch rate, false-positive rate, form completion rate, and support tickets per 1,000 submissions.
  3. Decision gate. Expand to all public forms, tune, or revert. Revert must be a config flag, not a deploy.
  4. Abstraction boundary from day one. Wrap adoption so mechanisms can later be replaced by Turnstile, edge bot management, or a managed vendor without touching product code. This is the single most important TPM-driven architectural constraint here.

Operational Impact

Maintenance

Low code churn, high ownership burden. If we depend on the package rather than the pattern, plan to pin the version, read the source, and budget for becoming the maintainer of a fork — zero dependents means no upstream pressure to fix what breaks us. If we port the pattern, we own a small, well-understood surface, which is the preferable position. Either way, the rule content (phrases, scripts, URL thresholds) needs an owner and a review cadence; uncurated lists are the most likely cause of silent failure.

Support

No vendor, no SLA, no support contract, no compliance attestations. Internal support load is dominated not by the library but by false-positive triage — users who were blocked and complained. That needs a triage path and a way to whitelist or replay a blocked submission, or the support queue becomes the real cost centre.

Scaling

The heuristics are cheap: string matching, timing checks, and counters. The scaling concern is state, not CPU. Time traps and rate limits need a shared cache or store (Redis) across instances, or they degrade unpredictably behind a load balancer. Banned-phrase and URL matching scale linearly with traffic and form size, which is fine at our volume. Multi-tenant or per-region deployments need per-environment config, which the profile model supports cleanly.

Failure modes

  • Silent decay — lists and thresholds go stale, catch rate quietly drops to zero, and nobody notices because there is no dashboard by default. Mitigation: emit a metric per mechanism.
  • Over-blocking — time traps plus cached pages plus fast legitimate users, or script bans hitting real international signups. Mitigation: start every mechanism in log-only mode, then enforce.
  • Configuration error causing hard form failure — a malformed profile can reject all submissions. Mitigation: fail open on infrastructure error, fail closed only on confident detection, and cover with tests.
  • Shared-IP collateral — any IP-based mechanism risks blocking offices, campuses, and VPN users.
  • Headless-bot bypass — honeypots and timers stop commodity bots only; do not treat them as a defence against targeted abuse.

Ramp-up

Negligible for using the Symfony bundle (we cannot), moderate for porting the pattern (a competent Laravel engineer, days not weeks), and low for stakeholders to reason about because the mechanisms are well-known and the config is declarative. The real ramp-up is organisational: agreeing the friction budget, defining the false-positive threshold that triggers rollback, and assigning an owner for rule curation. Those decisions, not the code, determine whether this succeeds.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
tequilarapido/trackit
gregsphotography/site-builder-filament
cabaoctavio/laravel-query-log
gregsphotography/site-builder-components
io-digital/clickatell
snowsoft/laravel-admin
oxygen/auth
relicsoftware/barakah-payment-gateway
tobya/work-with-composer
equipc/laravel-email-validator
equipc/laravel-email-database-log
adedsec/nova-translated-labels
wazza/laravel-db-encryption
hokny/laravel-generator
vonsogt/backup
jengo/queues
jeremykenedy/laravel-observability
coleus/frame
thtg88/journalism
filagora/filagora-ai-forums