Posts tagged ‘$_GET’

14 de julho de 2010

Nunca mais você vai usar as variáveis $_GET e $_POST

por adlerparnas

Olá! Pessoal!

Meu nome é Adler Parnas e hoje vou falar de um técnica para acessar, validar e filtrar dados das variáveis $_POST e $_GET no PHP.

Caminhando na minha jornada rumo a Certificação PHP, me deparei com um artigo na PHP Architect, que exemplificava a utilização das funções filter_input e filter_input_array. Tais funções foram inseridas no PHP a partir da versão 5.2 e são uma ótima forma para tratar dados das variáveis $_GET e $_POST deixando seu código mais legível e seguro.

Como é falado no artigo original, é incrível a quantidade de sites/sistemas em PHP com falhas de segurança por  não tratar a entrada de dados pelo usuário. Existe também o tempo gasto para escrever códigos de tratamento dos dados de entrada.

Veja como seu código fica mais limpo e claro utilizando a função filter_input para tratar um parâmetro via GET:


<?php

$user_name = filter_input(INPUT_GET, 'user_name', FILTER_SANATIZE_STRING);

?>

Na página de documentação do PHP, também existe um exemplo utilizando a função filter_input_array, onde é criado um array com as opções de validação do POST esperado pelo programa.

<?php
error_reporting(E_ALL | E_STRICT);

/* data actually came from POST
$_POST = array(
   'product_id'    => 'libgd<script>',
   'component'   => '10',
   'versions'       => '2.0.33',
   'testscalar'    => array('2', '23', '10', '12'),
   'testarray'     => '2',
);
*/
/**
 * Arry com as opções de validação
 */
$args = array(
   'product_id'     => FILTER_SANITIZE_ENCODED,
    'component'   => array(
                                    'filter'    => FILTER_VALIDATE_INT,
                                    'flags'     => FILTER_REQUIRE_ARRAY,
                                    'options'   => array('min_range' => 1, 'max_range' => 10)
    ),
    'versions'     => FILTER_SANITIZE_ENCODED,
    'doesnotexist' => FILTER_VALIDATE_INT,
    'testscalar'   => array(
                                    'filter' => FILTER_VALIDATE_INT,
                                    'flags'  => FILTER_REQUIRE_SCALAR,
    ),
    'testarray'    => array(
                                    'filter' => FILTER_VALIDATE_INT,
                                    'flags'  => FILTER_REQUIRE_ARRAY,
    )
);

$myinputs = filter_input_array(INPUT_POST, $args);

var_dump($myinputs);
?>

O resultado deste tratamento seria:

array
   'product_id'     => string 'libgd%3Cscript%3E' (length=17)
   'component'    => boolean false
   'versions'        => string '2.0.33' (length=6)
   'doesnotexist'  => null
   'testscalar'     => boolean false
   'testarray'      => boolean false

Existem vários tipos de filtros que podem ser utilizados, sendo eles divididos em “dois grupos”, SANATIZE e VALIDATE. Os filtros dos tipo SANATIZE limpam os dados da variável, já os filtros do tipo VALIDATE, retornam FALSE caso o dados não passe pelo filtro.

As funções filter_input e filter_input_array não tratam todos os tipos de dados e nem vão deixar seu programa 100% seguro, mas já é uma boa parte da segurança realizada de forma elegante.

É isso ai galera! Espero que essa dica seja útil a todos vocês e caso tenha dito algo errado, favor me corrijam.

Fontes: