O SQL Injection (Injeção de SQL) é um tipo de ameaça de segurança que se aproveita de falhas em sistemas que interagem com bases de dados via SQL. Neste post veja SQL Injection em PHP.
A injeção de SQL ocorre quando o atacante consegue inserir uma série de instruções SQL dentro de uma consulta (query) através da manipulação das entradas de dados de uma aplicação.
O exemplo abaixo mostra uma vulnerabilidade em um código no qual é possível injetar comandos SQL através da URL:
/* Se existir id (se usuário passou alguma coisa),
mantém o que ele passou ($_GET["id"]), caso contrário, adote 1 */
$id = (isset($_GET["id"]))?$_GET["id"]:1;
$conn = mysqli_connect("localhost", "root", "", "meuBanco");
$sql = "SELECT * FROM tb_usuarios WHERE idusuario = $id";
/* O problema do parâmetro $id é que o mesmo vem de uma URL, o que pode ser
manipulado */
$exec = mysqli_query($conn, $sql);
while($result = mysqli_fetch_object($exec)) {
//Mostra o valor do campo "CPF"
echo $result->CPF . "<br>";
echo var_dump($result);
//A função var_dump() exibe todas as informações do usuário
Ao passar o parâmetro $id via URL é possível informar junto uma instrução SQL para mostrar todas as informações dos usuários, por exemplo:
http://criandobits.com.br/seguranca/exemplo-02.php?id=5 OR 1 = 1 —
A URL acima, além de passar o valor 5 para o parâmetro $id, passa a instrução OR 1 = 1 — que significa “condição sempre verdadeira (OR 1 = 1)” e ignora qualquer outra instrução SQL que venha depois (–).
Para corrigir a vulnerabilidade acima, será feito o tratamento das informações recebidas:
$id = (isset($_GET["id"]))?$_GET["id"]:1;
/* Se o parâmetro recebido não for numérico ou
se for uma string com mais de 6 caracteres... */
if(!is_numeric($id) || strlen($id) > 6) {
exit ("Ops, pegamos você, safadinho! kkk");
}
$conn = mysqli_connect("localhost", "root", "", "dbphp7");
$sql = "SELECT * FROM tb_usuarios WHERE idusuario = $id";
$exec = mysqli_query($conn, $sql);
while($result = mysqli_fetch_object($exec)) {
echo var_dump($result);
Acima, se for atribuido uma string (que pode ser um comando SQL) para o parâmetro $id (!is_numeric($id)) ou uma string com mais de 6 caracteres (o que pode representar um comando SQL), o programa finalizará (exit()).
A melhor forma de evitar ataques é usar boas práticas nos comandos SQL: tudo que for comparado, usar aspas, pois o próprio PHP já trata tudo que vem dentro das aspas como string e, principalmente, o uso do PDO com os binds params.
Então conheça o curso online que já ajudou milhares de pessoas a aprender a programar e desenvolver seus próprios projetos do ZERO e usando orientação a objetos de uma forma fácil de entender.
CLIQUE NA IMAGEM ABAIXO E SAIBA MAIS:
Dúvidas ou sugestões sobre SQL Injection em PHP? Deixem nos comentários! Para mais dicas, acesse o nosso canal no YouTube:
https://youtube.com/criandobits
Quer receber GRÁTIS o e-book "Como Formatar um Computador em 5 Minutos"?
Sobre o Autor
0 Comentários