Segurança não costuma ser a parte empolgante de administrar um OTServer, mas um incidente mal resolvido — vazamento de senhas, invasão de painel — pode acabar com a confiança da comunidade de uma vez só. Aqui vão os erros mais comuns (e as correções).
Guardar senhas em texto puro no banco de dados é o pior erro possível — qualquer vazamento expõe literalmente todas as contas. O mínimo aceitável hoje é usar funções de hash modernas, como password_hash() em PHP (que já aplica bcrypt por padrão) pros painéis web, e os mecanismos de hash já embutidos na própria engine pro login do jogo.
Qualquer formulário ou comando que recebe texto do jogador e monta uma query SQL concatenando strings diretamente é uma porta aberta pra SQL injection. A solução é sempre usar prepared statements:
// Errado: concatenação direta
$sql = "SELECT * FROM users WHERE email = '" . $email . "'";
// Certo: prepared statement
$stmt = $conn->prepare("SELECT * FROM users WHERE email = ?");
$stmt->bind_param("s", $email);
Deixar o painel de admin acessível por qualquer pessoa que descubra a URL, sem autenticação forte, é um convite a problemas. Garanta senha forte, autenticação de dois fatores quando possível, e — se o painel não precisa ser público — restrinja o acesso por IP.
Senha do banco de dados, chaves de API de pagamento, tokens de bot do Discord: nada disso pode ir parar num repositório público (ou até privado, se mal configurado). Veja nosso artigo sobre controle de versão pra aprender a usar .gitignore corretamente.
Sem limite de tentativas de login, sua conta (e as dos jogadores) fica exposta a ataques de força bruta. Limitar tentativas por IP e por conta num período curto de tempo é uma defesa simples e eficaz.
Segurança não é um projeto que termina — é uma rotina. Revisar essa lista periodicamente, especialmente depois de qualquer mudança grande no sistema de contas ou pagamentos, evita que um descuido pontual vire um incidente real.