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’) ;
- ‘&’ passa a ‘&’
- ‘”‘ passa a ‘"’ se a flag ENT_NOQUOTES não estiver activa.
- ”’ passa a ‘'’ só se a flag ENT_QUOTES estiver activa.
- ‘<‘ passa a ‘<’
- ‘>’ passa a ‘>’
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
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);
}