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
- Developer portal: hardsoftcode.com