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

Um ataque de injeção que é bem-sucedido com mysql_query, mas falha com mysqli_query


Fui levado a acreditar que:
$selection = mysql_query($dblink, "SELECT * FROM table WHERE name='$idValue' ");

pode ser facilmente comprometido com valores para $idValue que fecham o ' e, em seguida, adicione comandos extras, como
$idValue = "z'; DELETE * FROM table WHERE name IS NOT NULL";

Embora eu perceba que você afirma que várias instruções estão desabilitadas, algo que não é tão horrível seria retornar dados não autorizados em vez de editar dados diretamente na tabela, como:
  $idValue = "z' OR name IS NOT NULL OR name = 'x";

Considerando que com MySQLi existe a possibilidade que a abordagem pode ser usada com prepared statements , o que impediria que a variável atuasse fora de seu status como apenas uma variável. Tal como:
mysqli->prepare("SELECT * FROM tables WHERE name = ? LIMIT 1");
mysqli->bind_param("s",$idValue);
mysqli->execute();

Minha compreensão de bind_param é que a variável teria todas as palavras-chave e caracteres-chave do MySQL escapados, evitando assim a violação de segurança e o retorno de linhas não autorizadas.

Esta é uma escolha que o MySQL não tem . Declarações preparadas ajudam a melhorar segurança de injeção, mas não impedirão ataques de injeção sozinhos, mas mais devem ser usados ​​como parte de uma estratégia mais ampla pelo programador.

Assim como usar armadura corporal não o tornará invencível, mas melhorará muito suas chances de sobrevivência. O MySQLi não é uma bala mágica, nem o PDO, mas melhorará os níveis de segurança em geral.

O MySQL também está obsoleto e, como afirma Christopher, não ser mais mantido significa que o número de falhas e problemas com ele só aumentará à medida que outras tecnologias continuarem a se desenvolver.

Resumo


Se você escrever MySQLi instruções da mesma maneira que você escreveu instruções MySQL, então você não terá proteção adicional contra injeções. No entanto, MySQLi oferece as Declarações Preparadas abordagem que aumenta significativamente a defesa contra injeção de SQL, mas a mudança da interface do banco de dados subjacente em si não oferece nenhum benefício ou proteção inerente a menos que você opte por codificá-los em você mesmo usando instruções preparadas .