Há duas coisas muito importantes que você deve fazer para evitar sérios problemas de segurança.
-
Você precisa escapar da entrada do usuário antes de colocá-la em sua consulta SQL. Escapar significa escapar de todos os caracteres especiais, como'
; felizmente, existe uma função que já faz isso automaticamente:mysql_real_escape_string .
Se você não escapar da entrada do usuário, coisas desagradáveis podem acontecer. Imagine que sua consulta sejaINSERT INTO userdata VALUES ('$user_data')
. Agora imagine que o usuário escreveu'; DROP DATABASE userdata;
.
Se você não escapar, sua consulta se tornará:INSERT INTO userdata VALUES (''; DROP DATABASE userdata;')
. Como você pode imaginar, isso não é bom:se você tiver várias instruções habilitadas, você pode dar adeus ao seu banco de dados. Isso é chamado de injeção de SQL ataque.
-
Quando você está enviando sua variável para o usuário, você também precisa substituir corretamente os caracteres especiais HTML por entidades HTML. Felizmente, existe uma função para fazer isso também:htmlspecialchars() . Ele transformará os caracteres HTML especiais, como<
para<
.
Este parece ser um problema que muitas vezes é subestimado, mas na realidade é muito sério. Imagine se$user_data
contém<script>SomeNastyScript()</script>
. Ele pode explorar vulnerabilidades existentes no navegador de seus usuários, ou pode enviar um cookie não HTTPOnly (que pode conter senhas salvas) para o invasor, ou pode enganar o usuário para escrever sua senha em um formulário gerado através da manipulação de o DOM (possível em javascript), ou muitas outras coisas ruins.
Isso é chamado de XSS (Cross-site scripting).
Versão curta
-
Chamemysql_real_escape_string
na string antes de inseri-la em sua consulta SQL (mas não quando vocêecho
isto).
-
Chamehtmlspecialchars
na string antes de exibi-la ao usuário (mas não quando você a coloca no banco de dados).