• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

jotix

Como corrigir a vulnerabilidade Sql injection

17 mensagens neste tópico

Ando para aqui um ler uns artigos de SQL injection, e descobri umas coisas que até então, nunca tinha descoberto :hmm:

Por exemplo, na query Select id, forename, surname FROM teste where forename 'jotix'  (vai seleccionar as colunas id, forename, surename da tabela teste, onde o forename seja jotix)

Sei que um hacker pode, através de SQL injection eliminar toda os registos da tabela. Como barrar esta porta de entrada?

Penso que o problema reside nas ''

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Lê o artigo do tirácio, que cobre isso, e mais coisas também, como XSS e etc.

Um exemplo:

Insira um nome: joao

SELECT pontos FROM users WHERE user='joao'

Insira um nome: '; drop table users;#

SELECT pontos FROM users WHERE user=''; DROP TABLE users;#'

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nesse exemplo que indicaste, como ficaria o código para estar imune de SQL injection?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nesse exemplo que indicaste, como ficaria o código para estar imune de SQL injection?

Usavas a função mysql_real_escape_string(), passando a string com o user como parâmetro.

Exemplo:

$user="'lulz";
$userSeguro=mysql_real_escape_string($user);
$query="SELECT pontos FROM users WHERE user='$userSeguro'";

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E a variável $userSeguro não é utilizada?

Depois de ler o post do tirácio já percebi

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se bem entendi, isto é apenas válido para as query's? Só temos de adicionar a função mysql_real_escape_string à variável a seguir ao WHERE?

É isso?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se bem entendi, isto é apenas válido para as query's? Só temos de adicionar a função mysql_real_escape_string à variável a seguir ao WHERE?

É isso?

A qualquer variável que queiras usar num query..

O que aquilo faz é imagina que tens 'lulz na string, ele põe-te \'lulz de forma a que todos os caractéres que possam interferir com o query original sejam escapados.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então, num exemplo real, um código inicialmente composto por:

$id=$_GET["id"];

if ($_GET["option"]=="edit")

$tablae = mysql_query("SELECT * FROM tb_users where id='$id'"); // selecciono todos los registros de la tabla usuarios, ordenado por nombre

while ($registroe = mysql_fetch_array($tablae)) { // comienza un bucle que leera todos los registros y ejecutara las ordenes que siguen

Para não ser vítima de mysql injection teria de ficar assim:

$id=$_GET["id"];
$idSeguro=mysql_real_escape_string($id)

if ($_GET["option"]=="edit")
$tablae = mysql_query("SELECT * FROM tb_users where id='$id'Seguro"); // selecciono todos los registros de la tabla usuarios, ordenado por nombre

while ($registroe = mysql_fetch_array($tablae)) { // comienza un bucle que leera todos los registros y ejecutara las ordenes que siguen

Estou a pensar correctamente?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, embora te falte ali um ; e tenhas uma ' no sítio errado. :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Será assim:

$id=$_GET["id"];
$idSeguro=mysql_real_escape_string($id)

if ($_GET["option"]=="edit");
$tablae = mysql_query("SELECT * FROM tb_users where id='$idSeguro'"); // selecciono todos los registros de la tabla usuarios, ordenado por nombre

while ($registroe = mysql_fetch_array($tablae)) { // comienza un bucle que leera todos los registros y ejecutara las ordenes que siguen

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A ' já está certa, mas a ; não. É a seguir ao mysql_real_bla bla bla($id)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então, e neste caso:

$search=$_POST["search"];
$metode=$_POST["metode"];

if($_POST['search']){
    $resp = mysql_query("select * from tb_users where $metode LIKE '%$search%'") or die (mysql_error());
$num_reg = mysql_num_rows($resp);
    if(mysql_num_rows($resp) == "0") {
     echo "A pesquisa efectuada não encontrou resultados.";

Pelo que percebo, temos a variável Search que faz qualquer coisa que eu não sei.

Depois a estrutura de controlo if, diz que se for efectuado não sei quê, dá indicações para a efectivação do conjunto de instruções, nomeadamente a interrogação à base de dados sobre, provavelmente, a pesquisa efectuada pelo utilizador.

É criada de seguida uma variável que quantifica o número de registos da pesquisa.

Depois, novamente o if diz que caso as pesquisas não retomem nenhum registo, deve ser impressa a mensagem que lá está.

Falta-me alguma coisa? E o que são aquelas qualquer coisas que eu não sei?

Como se constata o código enunciado é vulnerável ao sql injection.

Então, segundo o que aprendi aqui ficaria assim:

$search=$_POST["search"];
$searchSeguro=mysql_real_escape_string($search)
$metode=$_POST["metode"];
$metodeSeguro=mysql_real_escape_string($metode)

if($_POST['search']){
    $resp = mysql_query("select * from tb_users where $'$metodeSeguro' LIKE '%$searchSeguro%'") or die (mysql_error());
$num_reg = mysql_num_rows($resp);
    if(mysql_num_rows($resp) == "0") {
     echo "A pesquisa efectuada não encontrou resultados.";

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O $searchSeguro está certo, mas o $metode não. Isso está mal desenhado, não há função que te salve. Vais ter de ver o que vem do cliente, ver se é o que estás à espera, e só depois é que fazes a query.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como é que eu hei-de explicar... Tu estás a escolher a coluna pegando directamente no que vem do utilizador, e a coluna não vai ser uma string para poderes escapares caracteres. Tens de ter uma estrutura de controlo para o $metode como if...elseif...else.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora