PHP MySQLI Prevent SQL Injection

Eu criei um site que estará em andamento em breve e só terá algumas dúvidas sobre a prevenção da injeção SQL, eu entendo como usar mysqli_real_escape_string mas eu só estou querendo saber se eu tenho que usar isso em todas as variables ​​que eu estou recebendo para minha declaração SQL e eu tenho que usá-la quando estou fazendo declarações selecionadas também ou apenas na atualização e exclusão de inserção? Além disso, qual outra segurança você me recomendaria implementar antes de colocar o site ao vivo, agradeço antecipadamente por qualquer ajuda!

Qualquer consulta pode ser injetada, seja lida ou escrita, persistente ou transitória. As injeções podem ser realizadas terminando uma consulta e executando uma separada (possivel com mysqli ), o que torna irrelevante a consulta desejada.

Qualquer input de uma consulta de uma fonte externa seja de usuários ou mesmo interna deve ser considerada um argumento para a consulta e um parâmetro no contexto da consulta. Qualquer parâmetro em uma consulta precisa ser parametrizado. Isso leva a uma consulta corretamente parametrizada que você pode criar uma declaração preparada e executar com argumentos. Por exemplo:

 SELECT col1 FROM t1 WHERE col2 = ? 

? é um espaço reservado para um parâmetro. Usando mysqli , você pode criar uma instrução preparada usando prepare , vincular uma variável (argumento) a um parâmetro usando bind_param e executar a consulta com a execute . Você não precisa desinfetar o argumento (na verdade é prejudicial para fazê-lo). mysqli faz isso por você. O processo completo seria:

 $stmt = mysqli->prepare("SELECT col1 FROM t1 WHERE col2 = ?"); $stmt->bind_param("s", $col2_arg); $stmt->execute(); 

Há também uma distinção importante entre consulta parametrizada e declaração preparada . Esta afirmação, enquanto preparada, não está parametrizada e, portanto, é vulnerável à injeção:

 $stmt = mysqli->prepare("INSERT INTO t1 VALUES ($_POST[user_input])"); 

Para resumir:

  • Todas as consultas devem ser adequadamente parametrizadas (a menos que não tenham parâmetros)
  • Todos os argumentos para uma consulta devem ser tratados de forma hostil quanto possível, independentemente da sua origem

Ele será fechado em segundos, mas apenas para resolver as coisas

Eu entendo como usar mysqli_real_escape_string

Receio que você não esteja.

se eu tiver que usar isso em todas as variables ​​que estou recebendo para minha instrução SQL

definitivamente não.
esta function deve ser usada para formatar apenas seqüências SQL

Eu tenho que usá-lo quando estou fazendo instruções selecionadas também ou apenas na atualização e exclusão de inserção?

QUALQUER declaração SQL. Mas, novamente, não “usando mysqli_real_escape_string”, mas formatando seus literais completamente e corretamente

Também qual outra segurança você recomendaria?

em relação à segurança do SQL – você deve formatar adequadamente apenas strings, mas literais de qualquer tipo. E cada um exige um conjunto distinto de regras de formatação