Ir para conteúdo

POWERED BY:

Arquivado

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

ro.fonseca

Seguranca em PHP

Recommended Posts

tb gosto de usar função pra filtros, sem ficar limitado à função nativa

so achei que na func um suprimisse o outro

 

meu charset é utf

vou tentar ver pq nao retornou o que devia

 

essa funcao protection, substitui melhor entao q a funcao analoga do php nao é isso?

 

Eu acho melhor! Susbttuirei todas minhas strip_tags por ela.

 

você nao precisa dessa função pra verificar um campo numerico, basta usar o (int) como foi dito

 

um campo de email, você precisará ter certeza que a string contém um email valido...

 

cada caso é um caso

 

Sim, nao precisa, mas lembre-se: Voce espera um numero, não quer dizer que o usuario vai lhe passar um!

 

por isso usa-se (int)

Compartilhar este post


Link para o post
Compartilhar em outros sites

seu charset pode ser utf , mais tem varios tipos de entidades que são referentes a outros .. ai e que está o problema . o strip remove as tags html e peagapê de uma string .. mais nen todos os tipos ele suporta .. o php mesmo já lançou varias atualizaçoes na função .. e a cada vez ela esta mais pontente mais e melhor se previnir doque 'achar' que vai funcionar não ? , de qualquer forma ela está ali na funçao no seu devido lugar heheh

 

abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu tambem .. mais enfim como o assunto gera discursão acaba todo mundo tirando suas duvidas .. , então fica

a minha dica ai pessoal

 

e bom usar (int) , quando se passa so numeros inteiros na URL . isso e mais conhecido como cast ..

evita o envio de string e uso desnecessario de funçao robando processamento atoa ..

 

sendo então

 

(int)$_POST['a'] // vamos supor que eu mandei a132tq3]t~y]~ç  no post
// o retorno seria : 0

 

se tiver apenas numeros no $_POST['a'] , o retorno será o propio numero

 

agora quando se passa nome de usuarios , algo que necessite conter string + numero .. eu fiz essa funçao aqui

function protect($str)
{
   $str = preg_replace('~([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $str);
   $str = preg_replace('~([0-9]+);~e', 'chr("\\1")', $str);
   $str = str_replace("<script","",$str);
   $str = str_replace("script>","",$str);
   $str = str_replace("<Script","",$str);
   $str = str_replace("Script>","",$str);
   $str = trim($str);
   $tbl = get_html_translation_table(HTML_ENTITIES);
   $tbl = array_flip($tbl);
   $str = addslashes($str);
   $str = strip_tags($str);
   return strtr($str, $tbl);
}

se a string contem aspas , o addslashes já ta ali pra evitar o injection e pra xss e qualquer tipo de charset o replace e as outras funçoes

já estão ali , usem avontade !!!!!

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito bom o topico!

Ta na hora de arrumar outro tema polemico pra discutir, pois este do XSS chegamos a um consenço!

 

E quanto ao SQL INJECTION, Qual a melhor forma de se proteger?

 

PDO?

Remover as declarações na fonte ($_GET, $_POST...)?

 

O que acham?

Compartilhar este post


Link para o post
Compartilhar em outros sites

A respeito do salt que o criativade comentou, geralmente ao passar valores pela url (_GET) eu criei uma função com base64 mesmo, e 2 salt dentro dela

 

Seria algo parecido com isso:

<?php 
function codGet($str, $valor = 1) {

 $salt_1 = '83h3as83ah3ai3a72';
 $salt_2 = '283212390123821jas7a3';

 // Aqui eu codifico a string
 if($valor == 1) {
$str = base64_encode($str);
   $str = base64_encode($salt_1.$str.$salt_2);
return $str;
 }
 // Aqui eu decodifico a string
 if($valor == 2) {
   $str  = base64_decode($str);
$str  = explode($salt_1, $str);  
$str  = explode($salt_2, $str[1]);
return base64_decode($str[0]);  
 }

}

echo codGet('Macaco'); // Saída: ODNoM2FzODNhaDNhaTNhNzJUV0ZqWVdOdjI4MzIxMjM5MDEyMzgyMWphczdhMw==
echo codGet('ODNoM2FzODNhaDNhaTNhNzJUV0ZqWVdOdjI4MzIxMjM5MDEyMzgyMWphczdhMw==', 2); // Saída: Macaco
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu parei de ler quando sugeriram um campo readonly pra guardar um código.

Começou a apitar tudo aqui...

 

É só o cara ir lá no código fonte, pegar o ID do campo e digitar na barra de navegação [a que contem o endereço]:

document.getElementById('ID do input').removeAttribute('readonly');

 

A partir daí ele pode alterar o que quiser...

 

Para evitar o SQL Injection basta apenas UMA única função, chamada mysql_real_escape_string();

 

Sobre sessões e cookies, na verdade toda sessão é baseada em um cookie que guarda o id da sessão e que expira quando o navegador é fechado.

Para alguém acessar um cookie no navegador do usuário, só se ele conseguir invadir seu servidor de alguma maneira.

 

E esse monstro aqui é desnecessário:

function protect($str)
{
   $str = preg_replace('~([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $str);
   $str = preg_replace('~([0-9]+);~e', 'chr("\\1")', $str);
   $str = str_replace("<script","",$str);
   $str = str_replace("script>","",$str);
   $str = str_replace("<Script","",$str);
   $str = str_replace("Script>","",$str);
   $str = trim($str);
   $tbl = get_html_translation_table(HTML_ENTITIES);
   $tbl = array_flip($tbl);
   $str = addslashes($str);
   $str = strip_tags($str);
   return strtr($str, $tbl);
}

 

Quando você vai fazer o input de dados do usuário para o banco, preocupe-se apenas com o SQL Injection.

Como o MySQL no PHP não suporta querys múltiplas, não dá pro cara enviar um comando delete e apagar os dados.

 

Ao retornar os dados do banco para o usuário [output], utilize a função html_special_chars, que vai converter os caracteres especiais do HTML, como <> e aspas em entidades HTML

 

O bacana é deixar o cara achar que invadiu seu site tentando botar um script lá e quando ele vai conferir vê o código escrito ao invés do que ele queria fazer.... ashusahauuausuash

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

É só o cara ir lá no código fonte, pegar o ID do campo e digitar na barra de navegação [a que contem o endereço]:

document.getElementById('ID do input').removeAttribute('readonly');

dessa forma você pode ate colocar um js que apaga o conteudo do body mas sem efeito no servidor

o que você disse é a mesma coisa que copiar o CF e rodar localmente sem a validação de campos com js ou os atributos do formulario

isso não é XSS!

XSS, pode usar uma simples query de busca na url para injetar um js que vai clonar um cookie

 

 

Para alguém acessar um cookie no navegador do usuário, só se ele conseguir invadir seu servidor de alguma maneira.

XSS faz isso - roubo de cookie simplesmente sem precisar invadir nada

 

 

Como o MySQL no PHP não suporta querys múltiplas

MySQLI suporta querys múltiplas e é a recomendada

Compartilhar este post


Link para o post
Compartilhar em outros sites

Falto XSS ..

eu uso essa funçao e nunca tive problemas ..

 

function protect($str)
{
   $str = preg_replace('~([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $str);
   $str = preg_replace('~([0-9]+);~e', 'chr("\\1")', $str);
   $str = str_replace("<script","",$str);
   $str = str_replace("script>","",$str);
   $str = str_replace("<Script","",$str);
   $str = str_replace("Script>","",$str);
   $str = trim($str);
   $tbl = get_html_translation_table(HTML_ENTITIES);
   $tbl = array_flip($tbl);
   $str = addslashes($str);
   $str = strip_tags($str);
   return strtr($str, $tbl);
}

 

ela tanto vale pra SQL Injection quanto pra XSS , não entendi exatamente 'Controle de Uso de SESSION'

eu acho SESSION mais seguro que COOKIE ..

 

Obrigado pela função, mas devemos usar ela especificamente aonde? Somente em entradas de dados, como logins, buscas?

 

Para que serve aqueles caracteres aleatórios em que a pessoa digita o que aparece numa tela?? Evitar spam em massa??? Onde eu posso achar um para colocar no meu site? Nao que eu queira um já pronto, até pq pela parte de programacao nao deve ser complicado, acho q so uma funcao random pra gerar caracteres aleatorios e algumas imagens de letras e numeros...

 

Cara, dá pra fazer captcha com poucas linhas de código, pra isso, use jQuery e seus maravilhosos plugins:

http://www.forumweb....om-php-e-jquery

 

Ah galera, para roubo de cookie, basta o cara fazer isso num input vulneravel:

<script>
while(document.cookie){
document.write(document.cookie+"<br/>");
}
</script>
Isto é um exemplo claro, mas a idéia é esta

 

Além disso, existem técnicas de injeção direto nos cabeçalhos HTTP, vou procurar um exemplo e posto aqui

Compartilhar este post


Link para o post
Compartilhar em outros sites
Cara, dá pra fazer captcha com poucas linhas de código, pra isso, use jQuery e seus maravilhosos plugins:

http://www.forumweb....om-php-e-jquery

 

Só uma duvida em relaçao a seguranca... Eu devo usar esse captcha em todos os meus formularios do site??? Acho q sim, nao? E vlw pela dica!

 

Recomendo usar captchas em lugares mais criticos, que podem ser explorados por robos, tais como formulários de contato e cadastro. Outros tipos, como campos de busca, fica meio chato o captcha.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Observem um site vulneravel a XSS:

http://www.edumedia-share.com/search.php?q=

 

Usei a querystring pra injetar html

http://www.edumedia-share.com/search.php?q=<br/><br/><br/><br/><br/><br/><h1>LUCAS</h1>

 

O resultado é a página de busca com um monte de quebra de linhas e com o meu nome em H1

 

E para ver os cookies do navegador:

http://www.edumedia-share.com/search.php?q=<script>alert(document.cookie)</script>

 

Testem lá e vejam o risco

Compartilhar este post


Link para o post
Compartilhar em outros sites

Observem um site vulneravel a XSS:

http://www.edumedia-share.com/search.php?q=

 

Usei a querystring pra injetar html

http://www.edumedia-share.com/search.php?q=<br/><br/><br/><br/><br/><br/><h1>LUCAS</h1>

 

O resultado é a página de busca com um monte de quebra de linhas e com o meu nome em H1

 

E para ver os cookies do navegador:

http://www.edumedia-share.com/search.php?q=<script>alert(document.cookie)</script>

 

Testem lá e vejam o risco

 

isso já foi discutido e tratado .. ja postei a solução pra esse tipo de ataque .. ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

isso já foi discutido e tratado .. ja postei a solução pra esse tipo de ataque .. ;)

 

Pena que ainda muitos desconhecem o problema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

sha1 e melhor ..

 

<?php
abstract class crypt {

   const SHA_1 = "sha1";

   const SHA_256 = "sha256";

   static public function sha1( $message ){
       $M = self::pre_process( $message );
       $H = array( 0x67452301 , 0xefcdab89 , 0x98badcfe , 0x10325476 , 0xc3d2e1f0 );
       for ( $i = 0 , $N = count( $M ) ; $i < $N ; $i += 16 ){
           $W = array();
           for ( $t = 0 ; $t < 80 ; $t++ ){
               $W[ $t ] = ( $t <= 15 ) ? $M[ $i + $t ] : self::ROTL( $W[ $t - 3 ] ^ $W[ $t - 8 ] ^ $W[ $t - 14 ] ^ $W[ $t - 16 ] , 1 );
           }
           $a = $H[ 0 ];
           $b = $H[ 1 ];
           $c = $H[ 2 ];
           $d = $H[ 3 ];
           $e = $H[ 4 ];
           for ( $t = 0 ; $t < 80 ; $t++  ){
               $T = self::add( self::add( self::ROTL( $a , 5 ) , self::f( $t , $b , $c , $d ) ) , self::add( self::add( $e , $W[ $t ] ) , self::Kt( $t ) ) );
               $e = $d;
               $d = $c;
               $c = self::ROTL( $b , 30 );
               $b = $a;
               $a = $T;
           }
           $H[ 0 ] = self::add( $H[ 0 ] , $a );
           $H[ 1 ] = self::add( $H[ 1 ] , $b );
           $H[ 2 ] = self::add( $H[ 2 ] , $c );
           $H[ 3 ] = self::add( $H[ 3 ] , $d );
           $H[ 4 ] = self::add( $H[ 4 ] , $e );
       }

       return ( sprintf( "%08x%08x%08x%08x%08x" , $H[ 0 ] , $H[ 1 ] , $H[ 2 ] , $H[ 3 ] , $H[ 4 ] ) );
   }

   static private function pre_process( $message ){
       $size = strlen( $message );
       $M = array();
       $N = ( ( $size + 8 ) >> 6 ) + 1;
       $message .= "\x80";

       for ( $i = 0 ; $i < $N * 16 ; $i++  ) $M[ $i ] = 0;
       for ( $i = 0 ; $i < $size ; $i++  ) $M[ $i >> 2 ] |= ord( $message{ $i } ) << ( 24 - ( $i % 4 ) * 8 );

       $M[ $i >> 2 ] |= 0x80 << ( 24 - ( $i % 4 ) * 8 );
       $M[ $N * 16 - 1 ] = $size * 8;

       return( $M );
   }
   static private function add( $x , $y ){
       $lsw = ( $x & 0xffff ) + ( $y & 0xffff );
       $msw = ( $x >> 16 ) + ( $y >> 16 ) + ( $lsw >> 16 );

       return ( ( $msw << 16 ) | ( $lsw & 0xFFFF ) );
   }
   static private function SHR( $x , $n ){
       $z = hexdec( 80000000 );

       if ( $z & $x ){
           $x = ( $x >> 1 );
           $x &= ~$z;
           $x |= 0x40000000;
           $x = ( $x >> ( $n - 1 ) );
       } else {
           $x = ( $x >> $n );
       }

       return( $x );
   }
   static private function ROTR( $x , $n ){
       return( ( self::SHR( $x , $n ) | ( $x << ( 32 - $n ) ) & 0xFFFFFFFF ) );
   }
   static private function ROTL( $x , $n ){
       return ( ( $x << $n ) | self::SHR( $x , 32 - $n ) );
   }
   static private function f( $t , $b , $c , $d ){
       if ( ( $t >=  0 ) && ( $t <= 19 ) ) return ( self::Ch( $b , $c , $d ) );
       if ( ( $t >= 20 ) && ( $t <= 39 ) ) return ( self::Parity( $b , $c , $d ) );
       if ( ( $t >= 40 ) && ( $t <= 59 ) ) return ( self::Maj( $b , $c , $d ) );
       if ( ( $t >= 60 ) && ( $t <= 79 ) ) return ( self::Parity( $b , $c , $d ) );
   }
   static private function Ch( $x , $y , $z ){
       return ( ( $x & $y ) ^ ( ~$x & $z ) );
   }
   static private function Parity( $x , $y , $z ){
       return ( $x ^ $y ^ $z );
   }
   static private function Maj( $x , $y , $z ){
       return ( ( $x & $y ) ^ ( $x & $z ) ^ ( $y & $z ) );
   }
   static private function Sigma_0( $x ){
       return( ( self::ROTR( $x , 2 ) ^ self::ROTR( $x , 13 ) ^ self::ROTR( $x , 22 ) ) );
   }
   static private function Sigma_1( $x ){
       return( ( self::ROTR( $x , 6 ) ^ self::ROTR( $x , 11 ) ^ self::ROTR( $x , 25 ) ) );
   }
   static private function sigma0( $x ){
       return( ( self::ROTR( $x , 7 ) ^ self::ROTR( $x , 18 ) ^ ( self::SHR( $x , 3 ) ) ) );
   }
   static private function sigma1( $x ){
       return( ( self::ROTR( $x , 17 ) ^ self::ROTR( $x , 19 ) ^ ( self::SHR( $x , 10 ) ) ) );
   }
   static private function Kt( $t , $type = self::SHA_1 ){
       $k_SHA1        = array( 0x5a827999 , 0x6ed9eba1 , 0x8f1bbcdc , 0xca62c1d6 );

       $k_SHA256    = array(
           0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
           0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
           0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
           0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
           0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
           0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
           0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
           0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
       );

       switch ( $type ){
           case self::SHA_1 :
               if ( ( $t >=  0 ) && ( $t <= 19 ) ) return ( $k_SHA1[ 0 ] );
               if ( ( $t >= 20 ) && ( $t <= 39 ) ) return ( $k_SHA1[ 1 ] );
               if ( ( $t >= 40 ) && ( $t <= 59 ) ) return ( $k_SHA1[ 2 ] );
               if ( ( $t >= 60 ) && ( $t <= 79 ) ) return ( $k_SHA1[ 3 ] );

               throw new UnexpectedValueException( sprintf( "O valor %08x não era esperado." , $t ) );
           case self::SHA_256:
               return( $k_SHA256[ $t ] );
       }
   }
}
?>

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.