A principal falha do
mysql_real_escape_string
, ou da extensão mysql_ em geral, é que é mais difícil de aplicar corretamente do que outras APIs mais modernas, especialmente instruções preparadas. mysql_real_escape_string
deve ser usado exatamente em um caso:escapando o conteúdo de texto que é usado como um valor em uma instrução SQL entre aspas. Por exemplo.:$value = mysql_real_escape_string($value, $link);
$sql = "... `foo` = '$value' ...";
^^^^^^
mysql_real_escape_string
garante que o $value
no contexto acima não atrapalha a sintaxe SQL. Não funciona como você pode pensar aqui:$sql = "... `foo` = $value ...";
ou aqui:
$sql = "... `$value` ...";
ou aqui:
$sql = mysql_real_escape_string("... `foo` = '$value' ...");
Se aplicado a valores que são usados em qualquer contexto que não seja uma string entre aspas em uma instrução SQL, é aplicado incorretamente e pode ou não atrapalhar a sintaxe resultante e/ou permitir que alguém envie valores que possam permitir ataques de injeção de SQL. O caso de uso de
mysql_real_escape_string
é muito estreito, mas raramente é entendido corretamente. Outra maneira de entrar na água quente usando
mysql_real_escape_string
é quando você define a codificação de conexão do banco de dados usando o método errado. Você deve fazer isso:mysql_set_charset('utf8', $link);
Você pode também faça isso:
mysql_query("SET NAMES 'utf8'", $link);
O problema é que o último ignora a API mysql_, que ainda pensa que você está falando com o banco de dados usando
latin1
(ou outra coisa). Ao usar mysql_real_escape_string
agora, ele assumirá a codificação de caracteres errada e as strings de escape de forma diferente do que o banco de dados irá interpretá-los posteriormente. Ao executar o SET NAMES
query, você criou uma brecha entre como a API do cliente mysql_ está tratando as strings e como o banco de dados irá interpretar essas strings. Isso pode ser usado para ataques de injeção em determinadas situações de string multibyte. Não há vulnerabilidades de injeção fundamentais em
mysql_real_escape_string
que estou ciente se for aplicado corretamente. Novamente, porém, o principal problema é que é terrivelmente fácil aplicá-lo incorretamente, o que abre vulnerabilidades.