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.