Pplware

PHP é à quinta-feira – Validação de dados introduzidos

Por Pedro Peixoto para o PPLWARE

No último artigo tivemos a necessidade de efectuar a conversão entre diferentes tipos de codificação. Esta tarefa ocorre mais frequentemente quando é necessário ler, armazenar ou apresentar dados em diferentes charsets. Um vez que o armazenamento e a apresentação dos dados são tarefas controladas pelo programador, é aquando da introdução dos dados que temos de ter mais atenção. O utilizador é imprevisível, é alguem em quem nunca podemos confiar, o elo mais frágil num sistema que a qualquer altura, seja acidentalmente ou intencionalmente, pode estragar o programa.

Hoje vamos aprender a controlar com segurança a introdução de dados por parte de um utilizador.

Entre as inúmeras possibilidades de erros que o utilizador pode causar, podemos destacar algumas que passaremos a explicar e a propôr uma solução (entre tantas outras).

Introdução de caracteres de outra codificação

Podem causar uma má apresentação/armazenamento de dados

Devemos ter em atenção qual o tipo de codificação usado na base de dados, e qual usamos na apresentação dos mesmos. Como usamos uma linguagem com codificação iso-8859-1 as duas função mais usadas serão :

$stringconvertida=utf8_encode($stringporconverter) ; //recebe uma string Latin1 e retorna a string em UTF8

$stringconvertida=utf8_decode($stringporconverter) ; //recebe uma string UTF8 e retorna a string Latin1

Introdução de aspas, plicas ou caracteres especiais

Podem danificar uma query sendo interpretadas pelo driver

Usualmente os drivers das bases de dados para PHP interpretam as plicas/aspas como caracteres de delimitação de strings, assim temos de evitar a sua presença no texto digitado pelo utilizador.

Para converter caracteres especiais (&,plicas,aspas,>,<) em códigos html não interpretados pelo driver vamos usar a seguinte função :

stringconvertida=htmlspecialchars($stringporconverter,ENT_QUOTES,’ISO8859-1’) ;

Introdução de um texto com tamanho superior ao definido na base de dados

Causa um erro na query de inserção na base de dados

$stringcortada=substr ($stringinteira , $inicio, $fim )

Esta função corta a string devolvendo apenas o texto entre a posição de início e de fim. Para o nosso caso o $inicio será 0 e o $fim sera o número máximo de caracteres a usar :

$res = substr('abcdef', 0, 4);  // abcd

No entanto podem-se usar combinações mais complexas para outros efeitos. Por exemplo :

$res = substr('abcdef', 1);         // bcdef
$res = substr('abcdef', 1, 3);     // bcd
$res = substr('abcdef', 0, 8);     // abcdef
$res = substr("abcdef", 0,4);     // abcd
$res = substr("abcdef", -1);      // f
$res = substr("abcdef", -2);      // ef
$res = substr("abcdef", -3, 1);  // d

Introdução de um texto com um tipo de dados errado

Podemos deduzir que os dados estão errados

Quando temos campos como email, telefone ou até mesmo NIF, convém validar se o valor introduzido está no formato correcto. Para isso recorremos a expressões regulares. Uma expressão regular é uma string com um formato padrão. Mas só as expressões regulares davam outro artigo, por isso deixo aqui o link para uma página com vários exemplos : http://www.roscripts.com/PHP_regular_expressions_examples-136.html

A função preg_match permite-nos verificar se uma determinada string cumpre o padrão da expressão regular.

if (preg_match ( $expressaoregular, $string)) 
 
echo ‘valido’ ;
 else
 echo ‘invalido’ ;

No exemplo a seguir efectuamos a validação de um número decimal :

$valorintroduzido = "9,99";
 
if (preg_match( '/^[\-+]?[0-9]*\.*\,?[0-9]+$/', $valorintroduzido)) {
return true;
 }

Para efectuar a validação de outro tipo de dados, bastava substituir a expressão respectiva, por exemplo, para validar um email a expressão regular seria : ‘^[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$’.

Introdução de código HTML

Pode ser desde simples tags que alteram a apresentação dos dados, até ao uso de javscript que será interpretado pelo browser aquando da apresentação

Este é sem dúvida um ponto crítico, imaginemos que estamos a fazer um guestbook em PHP e não validamos o texto introduzido. Um utilizador pode introduzir na mensagem o seguinte texto :

<script>window.location= ‘https://pplware.sapo.pt’</script>

A partir desse momento os utilizadores que abrissem o guestbook seriam reencaminhados para a nossa página.

Outro utilizador poderia também colocar o seu comentário entre as tags <h1> para o destacar em relação aos outros… No fundo é uma porta aberta para utilizadores mal intencionados.

Assim sendo, e para solucionar este problema recorremos à função strip_tags :

$texto = '<p>Teste </p> <a href="https://pplware.sapo.pt">outro texto</a>';

echo strip_tags($texto); // Teste outro texto

É possível permitir algumas tags usando o segundo parâmetro

// Permitir 

e echo strip_tags($texto, '

'); //

Teste

outro texto

Para além desta função podemos recorrer á htmlentities() que tem um comportamento semelhante à htmlspecialchars() que já vimos num ponto acima, a diferença é que esta transforma todas as tags em código HTML, pode ser usada por exemplo quando queremos permitir que o utilizador escreva código HTML, mas sem que ele seja interpretado pelo browser.

$string = "Exemplo  usando bold";
echo htmlentities($str); // Exemplo usando <b>bold</b>

Conclusão

Quando usadas em conjunto estas funções permitem um controlo seguro da introdução de dados por parte dos utilizadores. Cabe a cada um adapta restas funções às suas necessidades. Sugerímos a construção de uma função que conjugue algumas destas regras de modo a ser usada cada vez que inserimos dados na base de dados. Aqui fica um exemplo :

function preparaString($str,$maxlength)
         {
                   return substr(utf8_decode(htmlspecialchars(strip_tags($str), ENT_QUOTES,'ISO8859-1')),0,$maxlength);
         }
Exit mobile version