Exercício 1

Nessa página HTML simples eu descrevo, de forma sucinta, as principais funcionalidades de cada exemplo.


Ex1-hello

Nesse exemplo, o código PHP faz a busca de dados de uma tabela do banco de dados MySQL utilizando PDO e exibe os dados em uma tabela HTML estilizada com Bootstrap. A seguir, explico cada parte do código com mais detalhes:

  • Conexão com o banco de dados MySQL:
    A primeira linha do código requer o arquivo "conexaoMysql.php", que contém as informações de conexão com o banco de dados MySQL. Em seguida, a função mysqlConnect() é chamada, que é responsável por criar uma conexão com o banco de dados utilizando a extensão PDO e retornar um objeto PDO.

  • Execução de uma consulta SQL:
    O bloco try-catch é utilizado para executar a consulta SQL que busca os dados da tabela "aluno" do banco de dados. A consulta é definida na variável $sql utilizando a sintaxe HEREDOC, que permite definir uma string multilinha com variáveis interpoladas. Em seguida, a função query() é chamada no objeto PDO ($pdo), que retorna um objeto PDOStatement contendo o resultado da consulta.

  • Exibição dos dados em uma tabela HTML:
    Os dados retornados pela consulta são exibidos em uma tabela HTML utilizando a biblioteca Bootstrap. A linha <table class="table table-striped table-hover"> define uma tabela estilizada com listras e efeitos de hover. O bloco while é utilizado para iterar sobre cada linha da consulta e exibir os valores na tabela. A função htmlspecialchars() é utilizada para escapar caracteres especiais e evitar a execução de código malicioso.

  • Escapando caracteres especiais:
    A função htmlspecialchars() é utilizada nas variáveis $nome e $telefone antes de exibi-las na tabela. Essa função converte caracteres especiais em entidades HTML, evitando que eles sejam interpretados como código HTML. Isso é importante para evitar ataques XSS (cross-site scripting) em que um invasor pode inserir código malicioso em um formulário ou campo de entrada e fazer com que o usuário execute esse código sem saber. A função htmlspecialchars() garante que os dados exibidos na tabela não contenham código malicioso.


Ex2-SQL-injection

  1. mostra-alunos.php:
    • Este código PHP tem como objetivo buscar dados de uma tabela no banco de dados MySQL e exibi-los em uma tabela HTML estilizada com Bootstrap. Para isso, o arquivo de conexão conexaoMysql.php é requerido na primeira linha. Na sequência, a função mysqlConnect() é invocada, a qual cria uma conexão com o banco de dados usando a extensão PDO e retorna um objeto PDO.
    • O bloco try-catch é utilizado para executar uma consulta SQL que busca os dados da tabela "aluno" do banco de dados. A consulta é definida na variável "$sql" utilizando a sintaxe HEREDOC, que permite definir uma string multilinha com variáveis interpoladas.
    • Em seguida, a função query() é chamada no objeto PDO ($pdo), que retorna um objeto PDOStatement contendo o resultado da consulta. Para exibir os dados na tabela HTML, a variável $stmt é iterada com um loop while, que permite iterar sobre cada linha da consulta e exibir os valores na tabela.
    • Antes de exibir os dados na tabela, a função "htmlspecialchars()" é usada nas variáveis $nome e $telefone para escapar caracteres especiais e evitar a execução de código malicioso.

  2. cadastro-vulneravel.php:
    • Este código PHP tem como objetivo inserir dados em uma tabela no banco de dados MySQL. O arquivo de conexão "conexaoMysql.php" é requerido na primeira linha. Na sequência, as variáveis $nome e $telefone são definidas a partir dos dados recebidos por POST.
    • O bloco try-catch é utilizado para executar uma consulta SQL que insere os dados na tabela "aluno" do banco de dados. A consulta é definida na variável $sql utilizando a sintaxe HEREDOC, o que pode levar a uma vulnerabilidade de segurança por injeção de SQL.
    • Na sequência, a função "exec()" é chamada no objeto PDO ($pdo) para executar a consulta. Depois de executar a consulta, a página é redirecionada para a página "mostra-alunos.php". Caso ocorra uma exceção, a mensagem de erro será exibida.
    • É importante mencionar que o código é vulnerável a ataques de injeção de SQL, o que pode levar a alterações não autorizadas na base de dados. O código é vulnerável porque não faz a validação dos dados recebidos por POST e permite que um invasor possa inserir código SQL malicioso nos campos de entrada.

Ex3-cadastro

  1. cadastra-cliente.php:
    O código "cadastra-cliente.php" realiza o cadastro de um novo cliente no banco de dados. A seguir, estão as principais etapas do código:
    • Inclusão do arquivo "conexaoMysql.php" que realiza a conexão com o banco de dados.
    • Recebimento dos dados do novo cliente por meio do método POST.
    • Criação de uma variável $hashsenha que é o resultado da aplicação do algoritmo de hash de senha seguro do PHP na senha informada pelo usuário.
    • Criação de uma consulta SQL que utiliza prepared statements para inserir os dados do novo cliente na tabela "cliente" do banco de dados.
    • Execução da consulta SQL por meio do método execute() do objeto $stmt.
    • Redirecionamento do usuário para a página "mostra-clientes.php" após o cadastro ser realizado com sucesso.
    • Tratamento de exceção caso ocorra algum erro durante o cadastro do novo cliente, que pode ser devido a dados duplicados ou falha na inserção dos dados. Nesse caso, é exibida uma mensagem de erro ao usuário.

  2. mostra-cliente.php:
    Este código mostra-cliente.php é responsável por exibir os clientes cadastrados no banco de dados em uma tabela na página HTML.
    1. Conexão com banco de dados:
      • O código faz a conexão com o banco de dados utilizando a função mysqlConnect() presente no arquivo conexaoMysql.php. Não é possível avaliar a segurança dessa conexão sem conhecer a implementação dessa função.
    2. Query SQL:
      • A query SQL é feita utilizando a cláusula SELECT para selecionar todos os dados de todos os clientes cadastrados na tabela cliente.
    3. Prevenção contra SQL Injection:
      • Como não há possibilidade de injeção de SQL, já que nenhum parâmetro do usuário é utilizado na query SQL, não é necessário utilizar prepared statements neste caso..
    4. Processamento de resultados:
      • O resultado da query SQL é processado no loop while utilizando o método fetch() para obter cada linha de resultado do banco de dados.
      • Cada coluna da linha é armazenada em variáveis e, em seguida, utilizadas para preencher as células da tabela HTML.
      • É importante destacar que o código faz uso da função htmlspecialchars() para limpar os dados produzidos pelo usuário, com possibilidade de ataque XSS, antes de inseri-los na página HTML.
    5. Processamento de resultados:
      • A função password_hash() não é utilizada para gerar hashes seguros de senhas, uma vez que a função PASSWORD_DEFAULT pode utilizar algoritmos de hash obsoletos e vulneráveis. É recomendado utilizar uma opção mais segura, como a função password_hash() com o algoritmo Argon2i ou Bcrypt.
      • A senha em hash é armazenada no banco de dados, o que não é uma boa prática de segurança. É recomendado utilizar uma técnica de armazenamento de senhas mais segura, como a adição de um salt e o uso de um algoritmo de hash forte.
      • O código não faz uso de sessões ou autenticação de usuários, o que pode permitir que usuários não autorizados acessem as informações de outros usuários. É recomendado implementar autenticação de usuários para garantir que apenas usuários autorizados tenham acesso às informações.

  3. exclui-cliente.php:
    Este código é responsável por excluir um cliente do banco de dados a partir do CPF recebido na URL. Segue abaixo a explicação de cada passo:
    • O código começa importando o arquivo de conexão com o banco de dados.
    • Em seguida, obtém o CPF do cliente a ser excluído da URL. A sintaxe $cpf = $_GET["cpf"] ?? ""; utiliza o operador de coalescência nula (??) para atribuir um valor vazio à variável $cpf caso o CPF não esteja presente na URL.
    • A declaração SQL para excluir o cliente é definida como uma string usando a sintaxe HEREDOC, que permite incluir múltiplas linhas de texto sem a necessidade de escapar caracteres especiais. A declaração SQL inclui um marcador de posição (?) para o CPF.
    • Um objeto PDOStatement é criado a partir da declaração SQL preparada anteriormente. Em seguida, é executado um comando execute() passando o valor do CPF como parâmetro, para prevenirataques de SQL injection.
    • Caso a execução da query tenha sucesso, o código redireciona o usuário para a página mostra-clientes.php utilizando a função header("location: mostra-clientes.php").
    • Caso ocorra algum erro na execução da query, o código exibe uma mensagem de erro para o usuário utilizando a função exit(). A mensagem de erro inclui uma explicação do erro obtido através do método getMessage() do objeto Exception.

Ex4-login

  • A função checkLogin($pdo, $email, $senha) é definida com três parâmetros: a conexão PDO com o banco de dados, o email do usuário e a senha do usuário. A função cria uma consulta SQL para buscar o hash da senha armazenado no banco de dados para o email fornecido. A consulta é executada usando prepared statements para evitar ataques de injeção de SQL. A função verifica se há um resultado para a consulta e se a senha fornecida pelo usuário corresponde ao hash armazenado no banco de dados usando a função password_verify. Se as credenciais estiverem corretas, a função retorna true; caso contrário, retorna false.

  • A conexão PDO com o banco de dados é criada usando a função "mysqlConnect" definida em "conexaoMysql.php".

  • O email e a senha são obtidos do formulário de login usando as variáveis superglobais $_POST. Caso uma dessas variáveis não esteja definida, será atribuído um valor padrão vazio.

  • A função checkLogin é chamada com os parâmetros $pdo, $email e $senha. Se a função retornar true, o usuário é redirecionado para a página "home.html" usando a função "header". Caso contrário, o usuário é redirecionado para a página "index.html".


Ex5-transacao

  1. mostra-enderecos-pedidos.php:
    • Este código se conecta a um banco de dados e seleciona informações de entrega de todos os clientes usando uma junção interna entre as tabelas cliente e endereco_entrega. A consulta SQL é armazenada em uma string delimitada por <<<SQL e SQL; que é passada para $pdo->query() para ser executada. Como não há parâmetros fornecidos pelo usuário na consulta SQL, não há necessidade de usar declarações preparadas para evitar injeções de SQL.
    • Em seguida, o resultado da consulta é exibido em uma tabela HTML usando um loop while para percorrer as linhas do resultado. A função htmlspecialchars() é usada para limpar quaisquer caracteres que possam ser usados em um ataque XSS. Finalmente, um link é fornecido para voltar ao menu principal.
    • Como não há parâmetros fornecidos pelo usuário na consulta SQL e todas as entradas do usuário são devidamente limpas, esse código parece estar bem protegido contra injeções de SQL e ataques XSS. No entanto, se outras partes do código ou banco de dados contiverem vulnerabilidades, essas vulnerabilidades podem ser exploradas para comprometer a segurança do aplicativo.

  2. transacao-cadastra-pedido.php:
    • Na primeira linha do código é feita a inclusão do arquivo de conexão com o banco de dados (conexaoMysql.php) que contém as informações de acesso ao banco de dados.
    • Em seguida, é criada a variável $pdo que recebe o resultado da função mysqlConnect(), que é responsável por realizar a conexão com o banco de dados utilizando a API PDO.
    • Os dados do cliente e do endereço de entrega são obtidos através da variável $_POST, que é uma superglobal que contém dados submetidos através de um formulário HTTP POST.
    • Em seguida, é calculado um hash seguro da senha do cliente utilizando a função password_hash().
    • São definidas duas consultas SQL para inserir os dados do cliente e do endereço de entrega nas tabelas correspondentes.
    • Dentro do bloco try-catch, é iniciada a transação no banco de dados através do método beginTransaction() da conexão PDO.
    • O primeiro passo é realizar a inserção dos dados do cliente na tabela correspondente utilizando um prepared statement para prevenir ataques do tipo SQL Injection.
    • Em seguida, é obtido o id do cliente recém cadastrado utilizando o método lastInsertId() da conexão PDO.
    • Com o id do cliente em mãos, é realizada a inserção dos dados do endereço de entrega utilizando outro prepared statement.
    • Se todas as operações ocorrerem sem exceções, a transação é efetivada através do método commit() da conexão PDO.
    • Caso ocorra uma exceção, a transação é desfeita através do método rollBack() da conexão PDO e uma mensagem de erro é exibida ao usuário.

Igor Augusto