Multicharacter
Security
How SC Multicharacter protects your server from abuse.
On this page2 sections
Every network event is a function a player can call directly, skipping the UI. That is why everything is checked on the server.
One gate for every event
Every network event passes a gate before it reaches the logic:
| Check | What it does |
|---|---|
| Stage | Listing, creating, deleting, and selecting work only during select. The stage comes from the server session, not from the client. |
| Rate | Per player and per event limit, separate from cooldowns. Protects the database and the Discord API from loops. |
| Argument shape | Declared argument types, text length limits, and table width and depth limits. Bad payloads are rejected before they reach the database. |
Rejections are counted. Too many in a short time print a console warning, send a security log, and kick the player when Config.Security.violations.kick is on.
Other protections
- Ownership. Every select and delete checks that the character belongs to the player's license.
- Cooldowns and limits for create, delete, and select in
Config.Security. - Identity validation on the server: age, name length and characters, nationality from the list, height and weight ranges.
- Spawn from a key. The client only sends a location key, the server resolves coordinates. A fake key ends at the default spawn.
- Character locks checked on the server, not just hidden in the UI.
- Private world during select. Nobody can attack the player, and the character is invulnerable and cannot shoot.
- Parameterized queries across the whole resource.
- Discord secrets only on the server, in a file the client never receives.
- Admin permissions checked on the server, also for client-side commands.