Article

Drupal, TYPO3, MODX, ProcessWire, and Sulu with CPalius CMF: A Comparison of Performance and Security

Single-request response times were measured using cp:perf:probe on a database with 100k users, 20k topics, 200k posts, and 100k bookings. Concurrent load testing (k6/ab) was not performed.

· ZemoCA · 3 min read
Drupal, TYPO3, MODX, ProcessWire, and Sulu with CPalius CMF: A Comparison of Performance and Security
  • Measurements exist for CPalius. Single-request response times were measured using cp:perf:probe on a database with 100k users, 20k topics, 200k posts, and 100k bookings. Concurrent load testing (k6/ab) was not performed.
  • No measurements for competitors. We did not set up competitor systems to run with identical data. Competitor information in this document is based on source code inspection and makes no performance claims. "Present / None" reflects what was observed in the source; adding a capability via an extension or plugin is also possible.
  • Sulu: The skeleton repository lacks a vendor directory. Core code was not analyzed—only security.yaml and the package list were inspected; Sulu cells are therefore marked as "partial."
  • MODX and ProcessWire: Only relevant sections of security code (password hashing, access policies, session, CSRF, login throttling, file validation) were examined; the complete codebase was not audited.
  • Verification level: Most Drupal and TYPO3 security cells (RequestSanitizer, CSRF token, RequestToken, CSP, MFA, filename validation, hash factory) were directly verified in source code. Competitor cells in the performance table, as well as certain cells for MODX, ProcessWire, and Sulu, rely on general domain knowledge and were not individually cross-checked in source; verify before publishing.
  • This is not a security audit; vulnerabilities were not hunted, mechanisms were compared.

Performance mechanisms

FeatureCPalius 2.2.68Drupal 11TYPO3 14MODX 3ProcessWireSulu
Guest page served directly as a static file by web server (without PHP)Present (Apache, including gzip copy)Internal page cache executes PHPPage cache executes PHPElement cachePlugin (ProCache)HTTP cache (FOSHttpCache/Varnish)
Tag-based invalidationPresent (push-based index, ~3 ms/page)Present (checksum on delivery)PresentLimitedLimitedPresent
Stale-while-revalidate (serve stale, refresh in background)PresentNone (single request waits)NoneNoneNoneDepends on proxy
Render cache / BigPipe for uncacheable fragmentsNonePresentPartialElement cacheModule cacheNone
Per-page cost metrics in admin panelPresentModule (Web Profiler/Devel)Admin panel tool availableNoneDebug modeProfiler
Query count guardrail (N+1)Present (in development mode)NoneNoneNoneNoneNone
Server posture audit (OPcache, MySQL buffers, compression)Present (cp:doctor)Status report (partial)Environment page (partial)NoneNoneNone

Security mechanisms

FeatureCPalius 2.2.68Drupal 11TYPO3 14MODX 3ProcessWireSulu
CSRF tokenPresent (session-bound)Present (session seed + value-bound)Present (scoped, time-limited, signed JWT)PresentPresent (single-use option)Symfony
Re-authentication for sensitive actionsPresent (new)NoneMFA enforcement available, none per actionNoneNoneNone
Key rotationPresent (new)No hash_salt rotationInvalidated when encryption key changesNoneNoneNone
Password hashing and re-hashingbcrypt cost 13, upgraded on loginPhpassHashedPassword/PHPArgon2id/bcrypt/PBKDF2 factoryPHP native, PBKDF2bcryptSymfony auto
Two-factor authenticationTOTP, email code, recovery codesModuleTOTP, recovery codesExtra / PluginModulescheb 2FA
Login throttlingPresent (IP + account, captcha, banning)Flood serviceLockoutLimitedSessionLoginThrottleSymfony limiter
CSPPresent (nonce, report collector, recommendation tool)None in corePresent (comprehensive, generates recommendations)NoneNoneNone
File upload: actual MIME, double extension, execution preventionPresent; SVG cannot be uploadedDangerous extension regexFilename denylist + SVG sanitizerDenylistDenylist + file validator modulesMedia bundle
SVG allowed (with sanitizer)None (intentionally disallowed)NonePresentNoneNoneNone
Input structure sanitization (# keys, external destination)Unnecessary (Symfony returns 400, redirects filtered)Present (RequestSanitizer)PresentPatternsSanitizerSymfony
Granular permissionsRole + user-based overrides, ownershipRole + "restrict access" flagPermission setsContext / resource group / policy (highly granular)Role / permissionWebspace / collection matrix
Restricted permission flagPresent (new)PresentNoneNoneNoneNone
Extension/plugin security advisoriesPresent (new, signed directory)Present (update module)Present (official advisories)NoneNoneComposer audit
Trusted hostPresent (AACP setting)EnforcedPresentNonehttpHostsSymfony
WAF and IP banningPresentModuleExtensionNoneNoneNone
Security posture auditPresent (SecurityAuditor, cp:doctor)Status reportEnvironment / Install toolNoneNoneNone

Key takeaways from this table

  1. Where CPalius stands out: Server-side guest cache served as static files, stale-while-revalidate model, re-authentication for sensitive operations, key rotation, built-in WAF and posture checks, and N+1 query guardrails.
  2. Where CPalius falls behind: Fragmented caching such as render cache / BigPipe (Drupal), ultra-granular ACL (MODX context/resource groups, Sulu webspace matrix), safe acceptance of SVGs (TYPO3), full-text search indexing (currently LIKE + caching + rate limiting), and concurrent load testing.
  3. Features intentionally omitted from competitors: Accepting SVGs via sanitization (disallowed for now, safer), RequestSanitizer (Symfony inherently returns 400), and FULLTEXT indexing (avoiding dependency on ngram for MariaDB compatibility).

Next steps

  • Portable full-text index for search (functional across both MySQL and MariaDB).
  • Fragment caching on authenticated pages (factoring in staleness risks for user-specific data).
  • k6/ab load testing on a live server under production settings.
  • Individual audit of object-level authorization (access to other users' records) and SSRF endpoints.

Comments (0)

No comments yet. Be the first to write one.

Leave a comment

Your comment will appear after it is reviewed.

Related Posts