domingo, 22 de dezembro de 2024

PHP - Evitar injeções de SQL

Para fazer operações de banco de dados em PHP de forma segura e evitar injeções de SQL, você deve usar declarações preparadas (prepared statements) fornecidas pela extensão PDO (PHP Data Objects) ou MySQLi. Ambas as extensões fornecem uma maneira segura de lidar com consultas SQL, evitando a injeção de SQL ao separar a lógica da consulta dos dados de entrada.

Usando PDO

Conexão ao Banco de Dados

php
<?php
try {
    $pdo = new PDO('mysql:host=localhost;dbname=nome_do_banco', 'usuario', 'senha');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    echo 'Erro: ' . $e->getMessage();
}
?>

INSERT

php
<?php
$stmt = $pdo->prepare("INSERT INTO tabela (coluna1, coluna2) VALUES (:valor1, :valor2)");
$stmt->execute(['valor1' => $valor1, 'valor2' => $valor2]);
?>

SELECT

php
<?php
$stmt = $pdo->prepare("SELECT * FROM tabela WHERE coluna = :valor");
$stmt->execute(['valor' => $valor]);
$resultado = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>

UPDATE

php
<?php
$stmt = $pdo->prepare("UPDATE tabela SET coluna1 = :valor1 WHERE coluna2 = :valor2");
$stmt->execute(['valor1' => $novo_valor1, 'valor2' => $valor2]);
?>

DELETE

php
<?php
$stmt = $pdo->prepare("DELETE FROM tabela WHERE coluna = :valor");
$stmt->execute(['valor' => $valor]);
?>

Usando MySQLi

Conexão ao Banco de Dados

php
<?php
$mysqli = new mysqli("localhost", "usuario", "senha", "nome_do_banco");

if ($mysqli->connect_error) {
    die("Conexão falhou: " . $mysqli->connect_error);
}
?>

INSERT

php
<?php
$stmt = $mysqli->prepare("INSERT INTO tabela (coluna1, coluna2) VALUES (?, ?)");
$stmt->bind_param("ss", $valor1, $valor2);
$stmt->execute();
$stmt->close();
?>

SELECT

php
<?php
$stmt = $mysqli->prepare("SELECT * FROM tabela WHERE coluna = ?");
$stmt->bind_param("s", $valor);
$stmt->execute();
$resultado = $stmt->get_result();
$dados = $resultado->fetch_all(MYSQLI_ASSOC);
$stmt->close();
?>

UPDATE

php
<?php
$stmt = $mysqli->prepare("UPDATE tabela SET coluna1 = ? WHERE coluna2 = ?");
$stmt->bind_param("ss", $novo_valor1, $valor2);
$stmt->execute();
$stmt->close();
?>

DELETE

php
<?php
$stmt = $mysqli->prepare("DELETE FROM tabela WHERE coluna = ?");
$stmt->bind_param("s", $valor);
$stmt->execute();
$stmt->close();
?>

Importância das Declarações Preparadas

  • Segurança: Separar os dados da lógica da consulta impede a injeção de SQL, uma das vulnerabilidades mais comuns e perigosas.

  • Reutilização: Declarações preparadas podem ser reutilizadas com diferentes conjuntos de dados, aumentando a eficiência.

  • Leitura: Torna o código mais legível e mantém a estrutura SQL clara.


OBSERVAÇÕES IMPORTANTES:

Vale lembrar que os exemplos citados acima, são utilizadas apenas para uso didático. Cada desenvolvedor deve ser responsável em aplicar medidas de segurança para evitar ataques de injeção de SQL ou de outro tipo em seu sistema.

quinta-feira, 5 de dezembro de 2024

React e Vue

 React e Vue são duas das bibliotecas/frameworks JavaScript mais populares para construir interfaces de usuário interativas e dinâmicas. Vamos comparar brevemente as duas:

React:

  • Desenvolvedor: Facebook

  • Principais Características: Virtual DOM, componentes reutilizáveis, JSX (uma extensão de sintaxe que permite escrever HTML dentro do JavaScript)

  • Popularidade: Muito alta, amplamente utilizado por grandes empresas como Netflix, Facebook e Uber

  • Curva de Aprendizado: Pode ser um pouco mais íngreme para iniciantes

  • Ecosistema: Grande e ativo, com muitas bibliotecas e ferramentas disponíveis

Vue:

  • Desenvolvedor: Evan You (ex-engenheiro do Google)

  • Principais Características: Componentes reutilizáveis, sintaxe simples e intuitiva, integração fácil com projetos existentes

  • Popularidade: Crescente, usada por empresas como Adobe e GitLab

  • Curva de Aprendizado: Mais fácil para iniciantes, com uma sintaxe que se aproxima do HTML, CSS e JavaScript

  • Ecosistema: Menor em comparação ao React, mas ainda com muitas bibliotecas e ferramentas úteis

e Nuxt.js:

  • : Um framework de React que facilita a construção de aplicações web full-stack, oferecendo renderização no lado do servidor (SSR) e SEO aprimorado.

  • : Um framework de Vue que oferece funcionalidades semelhantes ao Next.js, como SSR e uma estrutura de projeto mais organizada.

Comparação:

  • Flexibilidade: React (Next.js) oferece mais flexibilidade e liberdade, enquanto Vue (Nuxt.js) é mais simples e fácil de aprender.

  • Comunidade: React tem uma comunidade maior e mais recursos disponíveis, enquanto Vue tem uma comunidade crescente e é conhecida por sua simplicidade.

  • Desempenho: Ambos são eficientes, mas a escolha pode depender das necessidades específicas do seu projeto e da sua familiaridade com cada framework.

Node

  é um ambiente de execução JavaScript que permite aos desenvolvedores construir aplicações web do lado do servidor. Criado em 2009 por Ryan Dahl, se baseia no motor V8 JavaScript do Google Chrome para executar código JavaScript fora de um navegador.

Principais Características do Node.js:

  1. Single-Threaded e Event-Driven:

    • usa um modelo single-threaded com um loop de eventos, permitindo o processamento assíncrono e não bloqueante, ideal para aplicações I/O intensivas.

  2. V8 Engine:

    • Utiliza o motor V8 do Chrome para compilar JavaScript diretamente em código de máquina, proporcionando alta performance.

  3. NPM (Node Package Manager):

    • Vem com o NPM, um gerenciador de pacotes que permite aos desenvolvedores instalar, compartilhar e gerenciar pacotes de software, com mais de um milhão de pacotes disponíveis.

  4. Grande Comunidade:

    • Possui uma comunidade ativa e em crescimento, com muitos módulos e bibliotecas disponíveis para facilitar o desenvolvimento.

  5. Escalabilidade:

    • é conhecido por sua capacidade de lidar com um grande número de conexões simultâneas com alto throughput, tornando-o ideal para aplicações de tempo real.

Vantagens do Node.js:

  • Desempenho Alto: Devido ao seu modelo assíncrono e não bloqueante, é extremamente eficiente para aplicativos I/O intensivos.

  • Desenvolvimento Rápido: O uso de JavaScript tanto no frontend quanto no backend permite uma integração mais suave e um desenvolvimento mais rápido.

  • Ampla Adoção: Muitas empresas grandes como LinkedIn, Netflix, e PayPal usam devido às suas capacidades e performance.

Exemplos de Uso:

  • API REST: Criação de APIs RESTful para interagir com bancos de dados e fornecer dados aos clientes.

  • Aplicações em Tempo Real: Como chats e jogos online, que requerem comunicação bidirecional e contínua entre cliente e servidor.

  • Serviços de Microserviços: Devido à sua eficiência e escalabilidade, é frequentemente usado na arquitetura de microserviços.

Diferença entre React e React Native

 

React (ou React.js)

React é uma biblioteca JavaScript de código aberto, desenvolvida pelo Facebook, para construir interfaces de usuário interativas e dinâmicas. Aqui estão alguns pontos chave sobre React:

  • Finalidade: Construção de interfaces de usuário para aplicações web.

  • Linguagem: Utiliza JavaScript e JSX (JavaScript XML).

  • Componentes Reutilizáveis: Facilita a criação de componentes modulares e reutilizáveis.

  • Virtual DOM: Usa um DOM virtual para otimizar e acelerar as atualizações da interface.

  • Ecosistema Rico: Pode ser integrado com várias outras bibliotecas e frameworks, como Redux para gerenciamento de estado e para renderização no servidor.

React Native

React Native é um framework para construir aplicativos móveis nativos para iOS e Android usando JavaScript e React. Desenvolvido também pelo Facebook, React Native permite que os desenvolvedores usem a mesma base de código para criar aplicativos que funcionam em múltiplas plataformas. Aqui estão alguns pontos chave sobre React Native:

  • Finalidade: Construção de aplicativos móveis nativos.

  • Linguagem: Utiliza JavaScript e JSX, mas também permite a escrita de componentes nativos em Objective-C, Swift, e Java.

  • Componentes Nativos: Utiliza componentes específicos de plataformas móveis, como <View>, <Text> e <Image>, em vez de componentes HTML.

  • Bridge (Ponte): Comunica-se com APIs nativas usando uma ponte, permitindo a execução de código nativo junto com o JavaScript.

  • Performance Nativa: Os aplicativos construídos com React Native são verdadeiramente nativos e proporcionam performance similar à de aplicativos desenvolvidos com linguagens nativas.

Diferenças Chave

  • Plataforma de Destino: React é usado para desenvolvimento web, enquanto React Native é usado para desenvolvimento móvel.

  • Componentes: React usa componentes HTML, enquanto React Native usa componentes móveis nativos.

  • Renderização: React utiliza o Virtual DOM, enquanto React Native renderiza componentes nativos diretamente.

  • Arquitetura: React Native requer uma ponte para comunicação entre o JavaScript e o código nativo, enquanto React trabalha diretamente no navegador.

Em resumo, React é ideal para construir interfaces web modernas e interativas, enquanto React Native permite desenvolver aplicativos móveis nativos com uma experiência de usuário rica e desempenho nativo.

quarta-feira, 25 de setembro de 2024

Resolvendo Problemas com Acentos em E-mails PHP

 Resolvendo Problemas com Acentos em E-mails PHP

 

Se você está enfrentando problemas com os acentos ao enviar e-mails em português usando PHP, saiba que isso é um problema comum. Felizmente, a solução é simples e envolve a configuração correta do charset e da codificação do e-mail. Aqui está um guia passo a passo para resolver esse problema:

  

Configuração do Charset:

  • O charset define o conjunto de caracteres que será usado no e-mail. Para garantir que todos os caracteres especiais em português sejam exibidos corretamente. Para isso, temos que definir o charset como UTF-8.
  • No PHPMailer, você pode fazer isso com a seguinte linha de código:

 

$mail->CharSet = 'UTF-8';

 

Configuração da Codificação:

  • A codificação base64 é recomendada para garantir que o conteúdo do e-mail seja transmitido corretamente, especialmente quando inclui caracteres especiais.
  • No PHPMailer, configure a codificação com a seguinte linha de código:

 

$mail->Encoding = 'base64';

 

Isso mesmo! Configurar o charset e a codificação dessa forma no PHPMailer garante que os caracteres especiais sejam exibidos corretamente.

 

Exemplo Completo:

Aqui está um exemplo completo de como configurar o PHPMailer para enviar e-mails com acentos corretamente:

 

<?php

use PHPMailer\PHPMailer\PHPMailer;

use PHPMailer\PHPMailer\Exception;

 

require 'path/to/PHPMailer/src/Exception.php';

require 'path/to/PHPMailer/src/PHPMailer.php';

require 'path/to/PHPMailer/src/SMTP.php';

 

$mail = new PHPMailer(true);

 

try {

    // Configurações do servidor

    $mail->isSMTP();

    $mail->Host = 'smtp.example.com';

    $mail->SMTPAuth = true;

    $mail->Username = 'seu_email@example.com';

    $mail->Password = 'sua_senha';

    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;

    $mail->Port = 587;

 

    // Configurações do e-mail

    $mail->setFrom('seu_email@example.com', 'Seu Nome');

    $mail->addAddress('destinatario@example.com', 'Nome do Destinatário');

    $mail->Subject = 'Assunto do E-mail';

 

    // Charset e Encoding

    $mail->CharSet = 'UTF-8';

    $mail->Encoding = 'base64';

 

    // Corpo do e-mail

    $mail->isHTML(true);

    $mail->Body = '<p>Olá, mundo! É um prazer ajudar você.</p>';

    $mail->AltBody = 'Olá, mundo! É um prazer ajudar você.';

 

    $mail->send();

    echo 'E-mail enviado com sucesso';

} catch (Exception $e) {

    echo "Erro ao enviar e-mail: {$mail->ErrorInfo}";

}

?>

 

Porém, temos um outro problema com os acentos na língua portuguesa, o qual os comandos adicionados anteriormente não resolve.

 

Configuração do Subject

Porém no $mail->Subject, é necessário fazer uma configuração adicional:

 

$mail->Subject = '=?UTF-8?B?' . base64_encode("Currículo de/a: ") . '?=' .$_POST["Name"];

 

Para garantir que o assunto do e-mail seja exibido corretamente, você deve codificá-lo em base64.

Seguindo esses passos, você deve conseguir enviar e-mails em português sem problemas com acentos. Espero que tenham gostado.

 

Wellington Pereira

wellington@tonsoft.com.br