Pergunta

Aqui estão algumas possibilidades para iniciar a conversa:

  1. Escape de todas as entradas na inicialização.
  2. Escape de cada valor, preferencialmente ao gerar o SQL.

A primeira solução é abaixo do ideal, porque você precisará remover o escape de cada valor se quiser usá-lo em algo diferente de SQL, como exibi-lo em uma página da web.

A segunda solução faz muito mais sentido, mas escapar manualmente de cada valor é uma dor.

Estou ciente de declarações preparadas, no entanto eu acho MySQLi complicado.Além disso, separar a consulta das entradas me preocupa, porque embora seja crucial obter a ordem correta, é fácil cometer um erro e, assim, escrever os dados errados nos campos errados.

Foi útil?

Solução

como afirma @Rob Walker, consultas parametrizadas são sua melhor aposta.Se você estiver usando o melhor e mais recente PHP, recomendo dar uma olhada em DOP (Objetos de dados PHP).Esta é uma biblioteca nativa de abstração de banco de dados que oferece suporte para uma ampla variedade de bancos de dados (incluindo MySQL, é claro), bem como instruções preparadas com parâmetros nomeados.

Outras dicas

Declarações preparadas são a melhor resposta.Você tem testes porque pode cometer erros!

Ver esse pergunta.

Eu usaria declarações preparadas.Se você quiser usar instruções preparadas, provavelmente desejará verificar as funções PDO para PHP.Isso não apenas permite que você execute facilmente instruções preparadas, mas também permite que você seja um pouco mais agnóstico em relação ao banco de dados, ao não chamar funções que começam com mysql_, mysqli_ ou pgsql_.

O DOP pode valer a pena algum dia, mas ainda não chegou lá.É um DBAL e seu ponto forte é (supostamente) facilitar a troca entre fornecedores.Não é realmente construído para capturar injeções de SQL.

De qualquer forma, se você quiser escapar e higienizar suas informações, usar declarações preparadas pode ser uma boa medida (eu concordo).Embora eu acredite que seja muito mais fácil, por ex.utilizando filtro.

Sempre usei a primeira solução porque 99% das vezes, variáveis ​​em $_GET, $_POST, e $_COOKIE nunca são enviados para o navegador.Você também nunca escreverá código por engano com uma injeção de SQL (a menos que não use aspas na consulta), enquanto com a segunda solução você pode facilmente esquecer de escapar de uma de suas strings.

Na verdade, sempre fiz isso dessa maneira porque todos os meus sites tinham a configuração magic_quotes ativada por padrão e, depois de escrever muito código usando uma dessas duas soluções, é preciso muito trabalho para mudar para o outro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top