Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Wilian Fiabani

Segurança em PHP

Recommended Posts

Segurança é o item mais importante de um sistema, logo, não é preciso apenas cuidar da SQL Injeção, lembrem-se sempre dos itens tipo include de páginas, arquivo de configuração de DB que muita gente ainda usa ini, colocar index.html em branco nas pastas cuja não tem uma index, ou até mesmo criar um htaccess para redirecionamento caso o acesso seja direto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Procurando na internet encontrei no Stack Overflow a seguinte resposta:

 

Aqui está um exemplo de código que addslashes não bloqueia:

 

"http://localhost/escape_test.php?max=0+and+sleep(10)"

 

<?php
mysql_connect("localhost","root","");
if(get_magic_quotes_gpc()){
   $max=$_GET['max'];
}else{
   $max=addslashes($_GET['max']);
}
print "select * from mysql.user where max_connections=".$max;
$q=mysql_query("select * from mysql.user where max_connections=".$max);
$a=mysql_fetch_array($q);
print_r($a);
?>

 

Ele sugere que uma das coisas que pode impedir é forçar o valor a ser Integer

 

Link da resposta no StackOverflow

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem, eu faria algo do tipo...

 

~<?php

function anti_injection($campo, $tipo="string"){
    if($tipo == "string"){
         if(get_magic_quotes_gpc() == 0){
              $campo = addslashes($campo);
         }
         return $campo;
    }elseif($tipo=="numeric"){
         if(is_numeric($campo)){
              return $campo;
         }else{
              $campo = preg_replace('/[^0-9]/', '', $campo);
              return $campo;
         }
    }
}

// para realizar a função em caso de sting:
$str = anti_injection($_GET['str'], "numeric"); // irá inserir uma barra invertida antes de ', " e \
echo $str;

?>

 

Caso você deseje realizar a função em uma string, ele irá adicionar uma barra invertida antes dos caracteres de escape ', " e \, como dito no código.

 

Caso seja um número, ele irá excluir tudo o que não for número, desde letras, espaços a símbulos...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estive pensando melhor o código acima, e acho melhor assim:

 

<?php
/**
* Função Anti-SQL Injection
* Por Marcos Knijnik
*/

function anti_injection($campo, $tipo="string"){

  if($tipo == "string"){
     if(get_magic_quotes_gpc() == 0){
        $campo = addslashes($campo);
     }
     return $campo;

  }elseif($tipo=="numeric"){
     $campo = 0 + $campo;
     return $campo;
  }
}

// para usar em caso de string
$senha = anti_injection($senha);

// para usar em caso de número
$id = anti_injection($id, 'numeric');

 

Mudei a parte de número e agora tem uma eficácia máxima... veja, o PHP faz algumas conversões automáticas, e caso nós adicionemos um número há algo, ele automaticamente exclue tudo após o primeiro caractere não-numérico. Nesse caso, se usassemos o exemplo acima para tratar "' or 1=1", ele excluiria tudo. Agora, caso tratemos "5 DROP tabela", ele excluiria tudo apartir do espaço, ficando "5".

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu sempre via a maioria dos programadores substituindo palavras e acrescentando barras invertidas como forma de prevenir contra o SQL Injection, e queria mostrar que isso é totalmente desnecessário. ;)

 

mas é isso que mysql_real_escape_string faz:

 

Beraldo, vi sua mensagem agora. Sim, a função mysql_real_escape_string também faz isso, mas a grande diferença é que ela faz isso apenas para escapar o conteúdo e não o modifica.

 

Se você usar addslashes os dados serão salvos com as barras invertidas, ou seja, vai alterar o conteúdo salvo no banco de dados e você terá que tratá-lo duas vezes, na entrada e saída do banco com a função stripslashes. Por outro lado usando a função mysql_real_escape_string o conteúdo será salvo intacto no banco de dados.

 

Foi isso o que eu quis dizer.

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu sempre via a maioria dos programadores substituindo palavras e acrescentando barras invertidas como forma de prevenir contra o SQL Injection, e queria mostrar que isso é totalmente desnecessário. ;)

 

mas é isso que mysql_real_escape_string faz:

...Se você usar addslashes os dados serão salvos com as barras invertidas...

 

Nops.... Só salva com as barras invertidas se estiver com o magic_quotes_gpc() habilitado. Caso contrário, só escapa os caracteres.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu faria com o str_replace mesmo

ficando assim

<?php
$campo = $_POST['campo'];
$campo = str_replace("'","",$campo);
$campo = str_replace('"',"",$campo);
echo = $campo;
?>

 

ou eu utilizaria array

Compartilhar este post


Link para o post
Compartilhar em outros sites

@CrY

 

Como funcionaria se eu, utilizando a forma que você definiu, eu precisasse gravar no banco de dados a palavra "marca d'água", por exemplo?

 

Vejamos:

<?php
$campo = "marca d'água";
$campo = str_replace ( "'", "", $campo );
$campo = str_replace ( '"', "", $campo );
echo $campo; // marca dágua

 

Ou então se precisasse gravar TV 20":

<?php
$campo = 'TV 20"';
$campo = str_replace ( "'", "", $campo );
$campo = str_replace ( '"', "", $campo );
echo $campo; // TV 20

 

Veja que nos dois casos o conteúdo foi danificado, o sentido original (segundo caso) ou ficando incorreto gramaticamente (primeiro caso). Então, eu repito. Escapar caracteres (addslashes) em strings e para os outros campos fazer o cast.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

validação de dados é muito importante, eu mesmo sempre gostei, eu tenho um colega que ficava bravo comigo porque eu sempre encontrava erros nos scripts e el se indignava hehehheh.

 

 

Hospedagem de sites

Compartilhar este post


Link para o post
Compartilhar em outros sites

Recentemente recebi inject no meu site.

 

Fui ver nas logs e tinha passado o seguinte

 

upupdatedaupdatete tabela sesett coluna = 1

 

O problema é o seguinte, a função antisql iria remover aquilo que eu não queria, como select, update, delete, where e etc

 

Ai remover "update" de upupdatedaupdatete

 

Sobraria "update" do mesmo jeito, então o jeito foi fazer uma função recursiva, se existir "update" ou qualquer outra coisa na string, executa a função novamente, senão, retorna a string.

Compartilhar este post


Link para o post
Compartilhar em outros sites

#90

é desnecessário..

 

os parâmetros devem ser filtrados de acordo com os seus respectivos typehint antes de formatar adequadamente na query sql.. basta isso

 

no php, o typehint não é obrigatório, pois é automaticamente interpretado pelo engine, propiciando um certo "desleixe" por parte dos inexperientes em programação

Compartilhar este post


Link para o post
Compartilhar em outros sites

#92

 

ereg_replace é uma função em "desuso" (deprecated), ou seja, será removido nas próximas versões do PHP.

Deve trocar por preg_replace, que ficaria assim:

preg_replace('#[^a-zA-Z0-9]#', '', $str);

 

 

Uma outra coisa.. a função é deficitária:

 

function filtra($str)
{
   //return ereg_replace("[^a-zA-Z0-9]", "", $str);
   return preg_replace('#[^a-zA-Z0-9]#', '', $str);
}
echo filtra('日本語 ãéá');

 

 

remove caracteres multibyte e também os caracteres especiais do latin..

 

se quer aprender a se proteger de sql-injection (injeções SQL), entenda o que é SQL..

Quem realmente entende o que é o SQL, não faz essas (1)coisas absurdas corrompendo os dados..

 

 

(1) desculpe pelos termos ofensivos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Usar as funções

mysql_escape_string() e htmlspecialchars()

 

Já é uma mão na roda, eu uso somente essas funções e nao tenho problemas ^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.