Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Dúvida sobre falhas de segurança citada na aula

Bom dia. Na aula fizemos o seguinte código:

public function encontrarPorId(string $id)
    {
        $selecionaArtigo = $this->mysql->prepare('SELECT * FROM artigos WHERE id = ?');

        $selecionaArtigo->bind_param('s', $id);

        $selecionaArtigo->execute();

        $artigo = $selecionaArtigo->get_result()->fetch_assoc();

        return $artigo;
    }

O professor comentou que colocamos ? ao invés do parâmetro $id na query porque não é seguro colocar o id na consulta direto porque podemos ter falhas de segurança como SQL injection. Porém não entendi o que seriam essas falhas de segurança e como isso poderia ser provocado no nosso sistema. Também não entendi o que é SQL Injection.

3 respostas
solução!

Oi Karolinna, tudo bem?

A injeção de SQL é um truque malicioso usado para alterar uma consulta SQL.

Existem alguns caracteres, como por exemplo o hífen duplo(--), que podem ser perigosos para a sua consulta SQL porque possuem um significado especial. É por isso que sempre ao capturar dados de um formulário é precisado realizar o escape desses dados, para que uma pessoa má intencionada não insira esses caracteres na sua consulta. O que o placeholder (a interrogação ?) faz é realizar o escape desses dados automaticamente para proteger nossas consultas dessa injeção de SQL.

Bons estudos.

Tem um exemplo para ficar mais claro?

Oi Karolina,

No site oficial tem uma explicação completa https://www.php.net/manual/pt_BR/security.database.sql-injection.php

O que é necessário saber é que existem formas de burlar uma consulta SQL e para evitar isso é necessário realizar o escape dos dados antes de passa-los para uma consulta, ou seja, retirar dos dados potenciais caracteres que possam afetar a consulta SQL original. Como o SQL injection é um truque muito famoso e corriqueiro não precisamos nos preocupar em fazer esse escape de maneira manual, pois, já existem muitas soluções já prontas, a exemplo usar a "?" fornecida pelo próprio PHP e comentada por você na pergunta inicial.

Um exemplo bem basicão, apenas pra você ter uma noção:

Digamos que vc tenha a consulta:

INSERT INTO usuarios (nome, admin) VALUES ($nome, '0')

No formulário do seu sistema você vai pedir o nome do usuário para que seja substituído na variável $nomee inserido no banco.

O problema é que a pessoa em vez de passar o nome no formulário, ela pode passar uma consulta SQL e alterar aquele valor 0 para o valor 1 da coluna admin. No formulário a pessoa pode digitar:'Ricardo', '1') -- , e após substituir o que foi digitado na variável $nome, a consulta vai ficar dessa maneira:

INSERT INTO usuarios (nome, admin) VALUES ('Ricardo', '1') --, '0')

O duplo hifen -- é usado para desativar o restante de uma linha e transormar em comentário o que vem após, logo a consulta final será:

INSERT INTO usuarios (nome, admin) VALUES ('Ricardo', 1)

Bingo! Agora o valor de admin não é mais 0 e sim 1 e afetar todo seu sistema. Por isso é preciso retirar o hífen duplo, assim como outros caracteres especiais, dos dados antes de passa-lo para a consulta.

É um assunto muito extenso para o fórum, com certeza existem diversos vídeos no youtube ou em outros lugares na internet com demonstrações mais práticas e profundas, vale a pena dar uma pesquisada.

Bons estudos.