Ir para o conteúdo
Johny

Maneira eficaz de proteger contra SQL Injection

Mensagens Recomendadas

Johny    1
Johny

boas pessoal como vi este topico ja iniciado gostava de ter a vossa opinião acerca deste assunto fiz esta funçao gostava de saber se já chega ou é preciso adicionar mais alguma coisa para não ter estas surpresas de ataques

function verificavar($var){
$var = mysql_real_escape_string($var);
$var = strip_tags($var);
$var = str_replace("=", "", $var);
$var = str_replace("%", "", $var);
$var = str_replace("--", "", $var);
return $var;
}

Agradecia a vossa opinião ;)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
mAiN_iNfEcTiOn    0
mAiN_iNfEcTiOn

function verificavar($var){
$var = mysql_real_escape_string($var);
$var = strip_tags($var);
$var = str_replace("=", "", $var);
$var = str_replace("%", "", $var);
$var = str_replace("--", "", $var);
return $var;
}

Olá Johny...

É assim, se vais correr isso para todas as variáveis, isso vai dar raia...

Imagina um sistema de gestão de mensagens, onde eu escrevo a mensagem "Olá, se fosse a ti descontava 20% no valor final do cliente"...

Isso ia tirar-lhe a  %....

Além disso o caract. % só é problemático quando usado com o LIKE ;-) e aí sim deves estar atento a isso ;)... mas normalmente usa-se o LIKE para meter a % ... Resta saber onde...

Conselho pessoal... usa o PDO... o PDO trata-te de problemas como o mysql_real_escape_string, do = ou do -- -.-'

Aliás, o mysql_real_escape_string numa maneira muito 'resumida', o que faz é colocar o caract. \ atrás de caract. que ele considera especiais...

Isso aliado a pelicas ( ou seja ' ) resolves vários problemas de injecção...

Exemplo:

<?php
$valor = "usernameComPelicas'EcomOutrosCaracteres--";

$valor = mysql_real_escape_string( $valor );

mysql_query("SELECT * FROM utilizadores WHERE username = '" . $valor ."');

#Agora com um id:
$id = "5 '";
$id = mysql_real_escape_string( $id );

mysql_query("SELECT * FROM utilizadores WHERE id = '" . $id ."');
?>

Quanto ao strip_tags, deves passar todas as variáveis (que não devam conter tags) por essa função... e aquelas que devem ter tags para depois mostrar (exemplo, HTML de um editor)... deves passar pela funçao htmlentities() :).

###########################################################

Findo isto, vou-te mostrar um exemplo em PDO:

<?php
/**
* Precisamos de um handler da base de dados
* O handler permite-nos criar uma conecção à base de dados e ter um sistema
* para 'preparar' queries... Porquê 'preparar'? Porque vamos criar uma query que
* posteriormente receberá os valores:
*/
$dbh = new PDO('mysql:host=localhost;dbname=aTuaBd', 'user' 'pwd');

# Ao fazer um prepare ele retorna-nos um object do tipo PDO Statement
# Este objecto permite-nos fazer a inserção dos valores que faltam na query
# de modo seguro ;-)
$stm = $dbh->prepare('SELECT * FROM utilizadores WHERE id = :id OR username = :username');

# Usando as variaveis $id e $username acima (originais, ou seja sem qualquer tratamento)
$stm->bindValue(':id',$id);
$stm->bindValue(':username',$username);

# Vamos executar a query (que aqui substituirá os valores que falta da query pelos das vars)
$result = $stm->execute(); # O execute retorna true ou false ;-)

if( $result )
{
  # E agora, para exemplo, vamos 'iterar', ou percorrer item a item, o resultado:
  # Atenção que o fetch() corrido assim retorna um array com indices associativos
  # ... e numéricos...
  while( $arr = $stm->fetch() )
    echo $arr['id'] . ' ' . $arr['username'] . '<br/>';

}
  echo '<br/><br/>';

$result = $stm->execute(); # O execute retorna true ou false ;-)

if( $result )
{
  # Para fazer com objectos:
  while( $obj = $stm->fetch( PDO::FETCH_OBJ ) )
    echo $obj->id . ' ' . $obj->username . '<br/>';
}
?>

(Sorry pelo post enorme)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
psiico    1
psiico

Tu para fazer login usas PHP, se usas PHP podes fazer as validações no ficheiro de PHP. podes usar o mysql_real_escape_string nas variaveis que vais enviar para a DB.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
mjamado    47
mjamado
pois ainda tens q instalar à parte, segundo o que me pareceu.

Eventualmente, apenas a extensão específica para o teu SGBD. A extensão PDO vem de origem, assim como a extensão específica para SQLite.

Em hosts que não tenham esta extensao instalada, pode dar raia.

Se o hoster não tiver isto, é um hoster muito fraquito. Dos que eu conheço, todos têm.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
psiico    1
psiico

Eventualmente, apenas a extensão específica para o teu SGBD. A extensão PDO vem de origem, assim como a extensão específica para SQLite.

Se o hoster não tiver isto, é um hoster muito fraquito. Dos que eu conheço, todos têm.

Okok, só comentei também nao tenho assim tanta experiência em hosts. Só achei que era uma coisa complementar. Mas sim essa maneira que falaram deverá ser a melhor, sem recorrer a nenhuma framework de php.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
falco    33
falco

Independentemente da forma de qual a linguagem que uso, gosto de combinar um conjunto de soluções:

* permissões na BD (não dar permissões de leitura e escrita ao mesmo utilizador da BD);

* nunca confiar em dados que não foram gerados pelo meu código, mas que venham do utilizador! Validar e filtrar/escapar tudo;

* usar um ORM como o PDO pode ajudar, mas usar um ORM nem sempre é possível (por razões de performance em casos extremos), por isso só uso quando posso;

* usar prepared statements, que também tem vantagens de performance;

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
mAiN_iNfEcTiOn    0
mAiN_iNfEcTiOn

* usar um ORM como o PDO pode ajudar, mas usar um ORM nem sempre é possível (por razões de performance em casos extremos), por isso só uso quando posso;

O PDO não é um ORM. Podes chamar-lhe um Database Abstraction Layer (DBAL), ou um interface de comunicação com SGBD's, mas não um ORM. (http://pt2.php.net/manual/en/intro.pdo.php).

* usar prepared statements, que também tem vantagens de performance;

Yup. Se usarmos, no PDO, o bindParam() que nos permite dizer "o parametro tal da query, vai buscar o valor à variavel X, mas só quando for executada", dá para a gente alterar os dados à vontade até se executar.

Além disso PDO facilita a implementação de transacções... ;)

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


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade