Menu Managerfor WHMCS · Documentation
v2.0.0

Security & Support

How Menu Manager protects your WHMCS installation, what it owns, and where to get support.


Safe by default — with no stored rows the engine passes menus through untouched. Every live node lookup is guarded; unknown items are skipped, never fatal — the client area always renders.

Security summary

  • Never fatal — all hook, endpoint and cron code runs inside try/catch; an engine error leaves stock menus in place.
  • Escaped output — labels, links, colors and messages are escaped before rendering in the admin area and the log.
  • CSRF tokens — every state-changing admin action carries a WHMCS token (including the modal and clear-log forms).
  • Validated input — colors must be strict hex, icons/classes allow safe characters only, badge keys come from a fixed allowlist, template/audience/context values are whitelisted per page.
  • Contained writes — the module only ever writes its own storage/menus.json (locked, atomic writes) plus its two tables.
  • Click endpoint — the client area controller (index.php?m=menuManager&action=click) accepts POST only, validates the item name, resolves the audience from the session itself, and can only increment counters.

Data storage

Menu items (with embedded per-language labels, icons, badges and click counters) live in storage/menus.json inside the module folder: reads take a shared lock, writes are atomic (temporary file + rename) under an exclusive lock, and a corrupt file is quarantined aside instead of breaking pages. Settings live in the hsc_mm_settings table and the audit trail in hsc_mm_log. The storage/ directory ships with an .htaccess deny as defense in depth (menu labels and links are public storefront data in any case).

Support