Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Deficiências do mysql_real_escape_string?


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.