Jump to content
ruimcosta

Segurança web

Recommended Posts

ruimcosta

Biba,

Gostaria de partilhar e submeter à vossa apreciação este trecho de código, que incluso em todos os ficheiros do vosso site, irá ajudar a filtrar de uma forma automática todas as entradas de informação no vosso site.

function mysql_real_escape( $val ){
    if( function_exists( "mysql_real_escape_string" )){
        return mysql_real_escape_string( $val );
    }else{
        return $val;
    }  
}

function filter_data($val){
    $lixo = array ("\n","\r","<",">");

    if( is_array($val) ){
        foreach( $val as $key => $value ){
            $val[$key] = htmlentities($value,ENT_QUOTES);  
            $val[$key] = mysql_real_escape( $val[$key] );
            $val[$key] = addslashes($val[$key]);
            $val[$key] = str_replace($lixo, "", $val[$key]);
        }    
    }else{
        $val = htmlentities($val,ENT_QUOTES); 
        $val = mysql_real_escape( $val );
        $val = addslashes($val); 
        $val = str_replace($lixo, "", $val);   
    }
    
    return $val;
}

$_POST    = array_map("filter_data",$_POST);
$_GET     = array_map("filter_data",$_GET);
$_SESSION = array_map("filter_data",$_SESSION);
$_REQUEST = array_map("filter_data",$_REQUEST);
$_SERVER  = array_map("filter_data",$_SERVER);
$_COOKIE  = array_map("filter_data",$_COOKIE);

Após estas linhas não precisam de efectuar limpezas manuais às vossas variáveis.

Agradeço todas as críticas oferecidas.


Abraços e beijinhos,Rui Costa

Share this post


Link to post
Share on other sites
pedrotuga

Mmmm...

sem ofensa, é demasiada ginga-joga para meu gosto.

Sou a favor de se usar o que é preciso usar quando é necessário em vez de arranjar um canivete suíço que dá para tudo mas não é o mais indicado para nada.

Para mim é simples, se é para inserir uma string numa base de dados musql, uso sempre o mysql_real_escape_string(). Nem acho que faça muito sentido um programador estar a escrever if(function_exists(...)) numa situação destas.

Se é para inserir um número, is_int(), is_float(), etc.

Se é para fazer output de texto, htmlspecialchars() aquando do output.

Mais umas validações com expressões regulares aqui e ali, mas isso é mais por motivos de consistencia de dados do que por segurança.

Share this post


Link to post
Share on other sites
mjamado

Concordo com o pedrotuga.

Se é para inserir na BD não é preciso fazer nada, para além de verificações de consistência (ver se é uma data, ou se é um URL, ou se é um número positivo, etc.). Depois, o próprio motor da BD se encarrega da segurança.

Os valores que serão para apresentar, mas apenas esses, são passados por algo mais poderoso, como o HTML Purifier, por exemplo, antes de entrarem na BD. Não vou andar a verificar tudo e mais alguma coisa (até porque há coisas que não podem ser escapadas).

Mas, já agora, tens aí coisas redundantes. $_REQUEST = $_POST + $_GET + $_COOKIE.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
brunoais

Acho q é melhor comentar isto parte a parte:

function mysql_real_escape( $val ){
    if( function_exists( "mysql_real_escape_string" )){
        return mysql_real_escape_string( $val );
    }else{
        return $val;
    }  
}

Então se não existir o mysql_real_escape_string() significa que já q n temos a função n temos segurança.

Pesquisa antes de mais: http://php.net/manual/en/function.mysql-escape-string.php

E um servidor com o PHP4 é um servidor demasiado desactualizado. Quem é dono disso já devia de ter tratado de actualizar o php!

function filter_data($val){
    $lixo = array ("\n","\r","<",">");

    if( is_array($val) ){
        foreach( $val as $key => $value ){
            $val[$key] = htmlentities($value,ENT_QUOTES);  
            $val[$key] = mysql_real_escape( $val[$key] );
            $val[$key] = addslashes($val[$key]);
            $val[$key] = str_replace($lixo, "", $val[$key]);

$val[$key] = htmlentities($value,ENT_QUOTES); //ok...
$val[$key] = str_replace($lixo, "", $val[$key]); //Completamente inútil!!!!

Se usas o htmlentities os caracteres '<' e '>' não existem na string! E mais! o trim é mais rápido que o str_replace (para estes casos).

$val[$key] = mysql_real_escape( $val[$key] );
$val[$key] = addslashes($val[$key]);

O que obtens daqui é que tudo fica com os slashes em duplicado.

Se tinhas: E ele disse "Aí a minha vida"

ficas com: E ele disse \\\\"Aí a minha vida!\\\\" (quase a certeza!)


        }    
    }else{
        $val = htmlentities($val,ENT_QUOTES); 
        $val = mysql_real_escape( $val );
        $val = addslashes($val); 
        $val = str_replace($lixo, "", $val);   
    }
    
    return $val;
}

Idem ao q já escrevi em cima.

$_POST    = array_map("filter_data",$_POST);
$_GET     = array_map("filter_data",$_GET);
$_SESSION = array_map("filter_data",$_SESSION);
$_REQUEST = array_map("filter_data",$_REQUEST);
$_SERVER  = array_map("filter_data",$_SERVER);

Já reparei tb que não confias no servidor. Se não confias no servidor em quem é que confiarás?

$_COOKIE  = array_map("filter_data",$_COOKIE);

É o que eu tenho a dizer assim à partida.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
Guest id194

Sou a favor de se usar o que é preciso usar quando é necessário em vez de arranjar um canivete suíço que dá para tudo mas não é o mais indicado para nada.

Nuff said!

Mas já agora fica uma sugestão, no PHP 5.2.0 foram introduzidos filtros precisamente para este tipo de coisas:

http://pt2.php.net/manual/en/ref.filter.php

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.