Unconfigured Ad Widget

Collapse

Anúncio

Collapse
No announcement yet.

Segurança no PHP

Collapse
X
 
  • Filter
  • Tempo
  • Show
Clear All
new posts

  • Font Size
    #1

    Dica Segurança no PHP

    Arquivos .inc

    Muitos programadores PHP tinham (alguns ainda tem) o hábito de salvar seus includes em arquivos do tipo /inc/config.inc.

    Nesses arquivos config.inc, geralmente colocam strings SQL, variáveis importantes, funções globais, etc. Eis um exemplo de arquivo .inc:
    Código PHP:
    <?
    // conectar.inc
    $host_db "localhost"
    $user_db "usuário"
    $pw_db "senha"

    $conexao mysql_connect($host_db,$user_db,$pw_db);
    ?>
    Mas, geralmente estes arquivos .inc tem as permissões de acesso como qualquer outro e como não é interpretado pelo servidor, pode-se facilmente fazer o download dos mesmos.

    Qualquer usuário mal intencionado que fizesse o download desse arquivo teria acesso ao seu endereço do seu servidor MySQL, à sua senha e seu usuário.

    Correção. Existem dois métodos:

    *Deixar seus arquivos em uma pasta especial e mudar as permissões de acesso desta pasta;
    *A que eu prefiro. Mudar as extensões de config.inc para config.inc.php.


    Assim, o servidor se encarrega de 'ocultar' o conteúdo do arquivo.

    SQL Injection

    Estamos desenvolvendo uma área restrita. Ao validar o Login, nós fazemos:

    Código PHP:
    <?
    $user 
    $_POST["usuario"];
    $senha $_POST["senha"];
    $result mysql_query("Select * From users Where user='" $user ."' AND senha='" $senha "'",$cox);
    ?>
    Imaginemos que um usuário mal intencionado digite nos campos a seguinte string:
    Código PHP:
    1' OR 1='
    A nossa string SQL ficaria assim:
    Código PHP:
    SELECT FROM Users WHERE user='1' OR 1='1' AND senha='1' OR 1='1' 
    Como no final teremos um OR 1=1, o resultado da string sempre retornará verdadeiro.

    Teríamos que, na resposta da SQL, todos os ítens seriam selecionados. E o usuário mal intencionado terá um login QUALQUER, provavelmente o primeiro login do registro da tabela.

    Logar como usuário definido.

    Lembramos que esse código vale para o MySQL e não foi testado em outros BDs. Mas quem quiser testar, poste o resultado aqui depois.

    No MySQL, o caractere # (sustenido) age como comentário. Então, o nosso 'amigo' usuário malicioso coloca a seguinte string no campo de login:
    Código PHP:
    admin'# 
    Independente da senha, teremos no final a seguinte instrução SQL:
    Código PHP:
    SELECT FROM Users WHERE user='admin'#' OR 1='1' AND senha='qualquer' 
    Já que tudo que há à direita do sustenido é comentário, então a instrução SQL se resume a isso:

    Código PHP:
    SELECT FROM Users WHERE user='admin' 
    É possível assim acessar qualquer usuário sem precisar da senha.

    Solução: Tratamento de dados. Colocar uma barra () antes das aspas simples, fazendo com que a SQL não interprete as aspas simples como parte da string SQL:

    Código PHP:
    $user str_replace(''', '\''$user);
    $senha str_replace(''', '\''$senha); 
    Includes mal formatados

    É comum ver alguns sites fazendo includes de strings que vem por GET ou POST. Assim:

    Código PHP:
    <?
    // teste.php?arquivo=./qualquer.php
    $arquivo $_GET["arquivo"];
    include(
    $arquivo);
    ?>
    O programa incluirá o arquivo ./qualquer.php no código. Mas, e se a URL estiver assim:

    Código PHP:
    teste.php?arquivo=../../../../etc/passwd 
    O usuário terá na tela o seu arquivo de senhas e usuários. E isso com qualquer outro arquivo importante.

    Solução: Tratamento de dados.

    Varíaveis globais

    Para quem está começando a programar em PHP, é muito mais prático liberar variáveis globais em seus scripts PHP.

    Em vez de fazer $_GET["usuario"], fazem apenas $usuario.

    Isso acarreta em alguns problemas.

    Vejamos esta situação, teste.php:

    Código PHP:
    <?
    if (autenticar($user,$senha)) {
        
    $verificado=1;
    }

    if(
    $verificado==1) {
        
    // Faz alguma coisa importante
    }
    ?>
    Novamente, o usuário poderia passar a seguinte URL:

    Código PHP:
    teste.php?verificado=
    Solução: Neste caso, bastaria um 'else $verificado=0', mas as situações podem ficar mais complexas. E podem ser contornadas, evitando o uso de variáveis globais.
    ~# Criado pela [IN]Segurança #~

  • Font Size
    #2
    muito interessante vlw

    Comment


    • Font Size
      #3
      Muito Bom valeu !

      Comment


      • Font Size
        #4
        E o tao de SQL INJECTION como se proteger ?

        Comment


        • Font Size
          #5
          Postado Originalmente por ribeiro alves Ver Post
          E o tao de SQL INJECTION como se proteger ?
          bastante simples..

          *Colocar magic_quotes_gcp para On
          Com esta opção será colocado um escape antes dos (') nos parâmetros:
          -COOKIE
          -POST
          -GET

          *Usar mysql_real_escape_string()
          Faz escape nas strings mysql_query usadas

          *Validar os parâmetros enviados pelos usuários
          $usuario_id = (int)$_GET['usuario_id'];
          O $usuario_id será sempre um integer e poderemos controlado os dados enviados pelos usuários.
          ~# Criado pela [IN]Segurança #~

          Comment

          X
          Working...
          X