Consultas seguras: evitando SQL injection no Pawn
SQL injection acontece quando um texto digitado pelo jogador é colado direto numa consulta SQL e acaba sendo interpretado como comando. Em servidores de SA-MP e open.mp, isso já causou contas roubadas, bancos apagados e admins falsos.
Como acontece
// ERRADO: nunca faça isso
new query[256];
format(query, sizeof(query),
"SELECT * FROM contas WHERE nome = '%s'", inputtext);
mysql_tquery(Banco, query);
Se o jogador digitar algo com aspas e comandos SQL, a consulta deixa de fazer o que você pretendia.
Nomes de jogador, textos de diálogo, motivos de ban, descrições de casas: tudo que vem do jogador é não confiável.
A solução: mysql_format com %e
O plugin MySQL oferece mysql_format, com o especificador %e, que escapa o texto:
// CERTO
new query[256];
mysql_format(Banco, query, sizeof(query),
"SELECT * FROM contas WHERE nome = '%e' LIMIT 1", nome);
mysql_tquery(Banco, query, "OnContaCarregada", "i", playerid);
Regras:
- Textos: sempre
'%e'(entre aspas simples); - Números:
%dou%f. Como são convertidos de variáveis numéricas, não carregam SQL; - Nunca use
formatcom%spara montar SQL com dados do jogador.
Valide antes de consultar
O escape protege o banco, mas a regra de negócio é sua:
- Tamanho máximo (um nome de casa com 5.000 caracteres não faz sentido);
- Caracteres permitidos (por exemplo, só letras, números e espaço para nomes);
- Faixa de valores para números.
Permissões mínimas
O usuário do banco usado pelo servidor deve ter só o necessário (SELECT, INSERT, UPDATE, DELETE no banco do servidor). Assim, mesmo que algo escape, o estrago é limitado. Nunca use o usuário root.
Revise o código herdado
Gamemodes antigos e "vazados" costumam ter dezenas de format + %s montando SQL. Faça uma busca por format( perto de mysql_ e corrija todos.
Hospede seu servidor com a VittHost
Os planos OPENMP-BR da VittHost incluem MySQL, com servidores no Brasil, painel Pterodactyl, proteção DDoS, compatibilidade total com scripts SA-MP e teste grátis de 3 dias.