- Obter link
- X
- Outras aplicações
Publicada por
Filipe heitor
em
- Obter link
- X
- Outras aplicações
Este artigo irá ensiná-lo a evitar ataques de injeção de SQL (SQL injection) utilizando as Declarações Preparadas do PHP. A injeção de SQL é um dos tipos mais comuns de vulnerabilidade encontrados nas aplicações WEB de hoje, mas as declarações preparadas utilizam parâmetros vinculados que não combinam variáveis com strings SQL, tornando impossível para o atacante a modificação da declaração SQL.
As declarações preparadas combinam as variáveis com a declaração SQL pré-compilada, e isso faz com que o código SQL e as variáveis sejam enviados separadamente. Depois, as variáveis são interpretadas como meras strings, e não como parte da declaração SQL. Ao utilizar os métodos abaixo, você não precisará utilizar outras técnicas de filtragem de ataques de injeção de SQL, como o mysql_real_escape_string().[1]
editarPassos
editarEntendendo uma injeção de SQL
- Uma injeção de SQL é um tipo de vulnerabilidade explorado em aplicativos que utilizam um banco de dados SQL. A vulnerabilidade ocorre quando uma entrada do usuário é utilizada em uma declaração SQL:
- O que o usuário digitar na variável URL será atribuído à variável . Depois, ela é utilizada diretamente na declaração SQL, possibilitando que o usuário modifique a declaração.
- Assim, o banco de dados SQL receberá a declaração da seguinte maneira:
- Esse é um código SQL válido, mas em vez de retornar a senha de um usuário, essa declaração retornará a senha de todas as senhas da tabela tbl_user. Com certeza, você não vai querer esse tipo de vulnerabilidade nos seus programas.
- Esse é um código SQL válido, mas em vez de retornar a senha de um usuário, essa declaração retornará a senha de todas as senhas da tabela tbl_user. Com certeza, você não vai querer esse tipo de vulnerabilidade nos seus programas.
editarUtilizando o mySQLi para criar Declarações Preparadas
- Crie uma requisição SELECT no mySQLi.
Utilize o código abaixo para selecionar (SELECT) dados de uma tabela usando as declarações preparadas do mySQLi.
$name = $_GET['username']; if ($stmt = $mysqli->prepare("SELECT password FROM tbl_users WHERE name=?")) { // Vincule uma variável ao parâmetro como string. $stmt->bind_param("s", $name); // Execute a declaração. $stmt->execute(); // Recupere as variáveis da requisição. $stmt->bind_result($pass); // Recupere os dados. $stmt->fetch(); // Mostre os dados. printf("Password for user %s is %s\n", $name, $pass); // Feche a declaração preparada. $stmt->close(); }
- Observação: a variável é o objeto de conexão mySQLi.
- Criando uma requisição INSERT no mySQLi. Utilize o código abaixo para inserir (INSERT) dados na tabela utilizando as declarações preparadas do mySQLi.
$name = $_GET['username']; $password = $_GET['password']; if ($stmt = $mysqli->prepare("INSERT INTO tbl_users (name, password) VALUES (?, ?)")) { // Vincule as variáveis ao parâmetro como strings. $stmt->bind_param("ss", $name, $password); // Execute a declaração. $stmt->execute(); // Feche a declaração preparada. $stmt->close(); }
- Observação: a variável é o objeto de conexão mySQLi.
- Criando uma requisição UPDATE no mySQLi. Use o código abaixo para atualizar (UPDATE) os dados em uma tabela utilizando as declarações preparadas do mySQLi.
$name = $_GET['username']; $password = $_GET['password']; if ($stmt = $mysqli->prepare("UPDATE tbl_users SET password = ? WHERE name = ?")) { // Vincule as variáveis ao parâmetro como strings. $stmt->bind_param("ss", $password, $name); // Execute a declaração. $stmt->execute(); // Feche a declaração preparada. $stmt->close(); }
- Observação: a variável é o objeto de conexão do mySQLi.
- Criando uma requisição DELETE no mySQLi. Utilize o script abaixo para deletar (DELETE) dados de uma tabela usando as declarações preparadas do mySQLi.
$name = $_GET['username']; $password = $_GET['password']; if ($stmt = $mysqli->prepare("DELETE FROM tbl_users WHERE name = ?")) { // Vincule a variável ao parâmetro como string. $stmt->bind_param("s", $name); // Execute a declaração. $stmt->execute(); // Feche a declaração preparada. $stmt->close(); }
- Observação: a variável é o objeto de conexão do mySQLi.
editarFontes e Citações
Erro de citação <ref>
tags exist, but no <references/>
tag was found
- $2
Comentários
Enviar um comentário