terça-feira, 3 de julho de 2007

Como saber se uma string é número ou texto

Quando recebemos dados de um variável pelos métodos POST, GET... Não dá pra usar as funções do PHP para verificar se se trata de um número ou uma palavra, frase, etc, porque o PHP trata todos esses dados como sendo strings, então, usar funções como is_int, não vai funcionar.

Algo simples que podemos fazer é o seguinde:

$valor = $_GET['valor']; //ou $_POST['valor']...

if ( $valor / 1 == 0){
header("Location: pagina_de_noticias.php");
//redireciona a página
die();
}


O código acima funciona, pois, se dividirmos um texto por 1 (um), o resultado será smpre (zero).

Isso pode ser útil em uma página de notícias por exemplo.

Imagine que vc tenha um link referente a determinada notícia, assim:
< href="ler_noticia.php?id-noticia=15">....
Para evitar fraudes como SQL Injection, é essencial que na página ler_noticia.php, vc coloque o código acima para verificar se realmente o que foi recebido na página foi um número (id) referente a alguma notícia, e não uma instrução maliciosa.

Outra forma de evitar SQL Injection é usar as funções do PHP para limpeza de string.
Abaixo uma simples função que criei com esse objetivo:

function limpa_dados ($frase){

$frase = addslashes(strip_tags($frase));
//retiras as tags PHP e HTML e coloca / antes das aspas, ou seja, escapa as aspas ( ', " )
$frase = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|\*|--|\\\\)/"),"",$frase);//retira possíveis instruções SQL
$frase = trim($frase);
$simbolos = array('=','OR','AND');
//acrescente os símbolos que achar conveniente
foreach ($simbolos as $simbolo){
$frase = str_replace($simbolo,'',$frase);
//retira os símbolos nocivos
}

return($frase);
}


$valor_recebido = limpa_dados($_POST['valor']);

No array símbolos, vc pode acrescentar qualquer um que vc achar que possam porventura tentar utilizar para fraudar seu site.

Espero que seja útil pra vc essas dicas.

E não se esqueça que segurança é tão, ou mais importante, que um Designer legal de um site. Apesar das pessoas não verem, lembrarão que o site delas nunca teve problemas com Hackers, Craker e outros filhos da put.... da mesma classe.

segunda-feira, 19 de fevereiro de 2007

Como verificar se o CPF está correto

Primeiramente precisamos conhecer as regras de colocação dos dígitos do CPF.

O CPF é composto por 11 dígitos, 2 pontos e 1 traço que separa os dígito verificadores.

O nº de CPF usa 2 dígitos verificadores para saber se o número é válido ou não. Porém, este é um tipo de código que não mostra onde esta o erro, somente diz que tem algum erro.

A regra de validação do CPF é a seguinte:

Sendo 012.345.678-90 um CPF qualquer, temos que

n1 <- 0
n2 <- 1
n3 <-2
n4 <- 3
n5 <- 4
n6 <- 5
n7 <- 6
n8 <- 7
n9 <- 8
n10 <- 9
n11 <- 0 , são cada número do CPF da esquerda para a direita.

> Precisamos somar, multiplicando de n1 a n9 e depois dividir por 11 e obter o resto da divisão, que é o que nos interessa.

SoMa <- (n1 * 10) + (n2 * 9) + (n3 * 8) + (n4 * 7) + (n5 * 6) + (n6 * 5) + (n7 * 4) + (n8 * 3) + (n9 * 2)
ReStO <- SoMa / 11
Pega somente o resto da divisão

> Verificamos se o resto é menor que 2, caso seja, o primeiro digito verificador será 0, caso não seja, o primeiro dígito verificador será 11 – ReStO.

SE ReStO < 2 ENTAO
DIGITO_1 <- 0
SENÃO
DIGITO_1 <- ReStO – 11

> Vamos agora obter o 2 dígito verificador. Procedemos como acima, alterando portanto, os número s serem multiplicados.

SoMa <- (n1 * 11) + (n2 * 10) + (n3 * 9) + (n4 * 8) + (n5 * 7) + (n6 * 6) + (n7 * 5) + (n8 * 4) + (n9 * 3) + (DIGITO_1 * 2 )
ReStO <-SoMa / 11
Pega somente o resto da divisão

> Verificamos se o resto é menor que 2, caso seja, o segundo digito verificador será 0, caso não seja, o dígito verificador será 11 – ReStO.

SE ReStO < 2 ENTAO
DIGITO_2 <- 0
SENÃO
DIGITO_2 <- ReStO – 11

> Pronto! Agora é só compararmos os dígitos verificadores obtidos (DIGITO_1 e DIGITO_2) com o número de CPF que queremos validar.

SE DIGITO_1 = n10 ENTAO
SE DIGITO_2 = n11 ENTAO
Escreva “CPF válido!”
SENAO
Escreva “CPF inválido!”
SENAO
Escreva “CPF inválido!”

...............................................................................

O algoritmo completo:

CPF = 012.345.678-90

n1 <- 0
n2 <- 1
n3 <- 2
n4 <- 3
n5 <- 4
n6 <- 5
n7 <- 6
n8 <- 7
n9 <- 8
n10 <- 9
n11 <- 0

//Para o primeiro digito

SoMa <- (n1 * 10) + (n2 * 9) + (n3 * 8) + (n4 * 7) + (n5 * 6) + (n6 * 5) + (n7 * 4) + (n8 * 3) + (n9 * 2)
ReStO <- SoMa / 11 //Pega somente o resto da divisão

SE ReStO < 2 ENTAO
DIGITO_1 <- 0
SENÃO
DIGITO_1 <- ReStO – 11

//Para o segundo dígito

SoMa <- (n1 * 11) + (n2 * 10) + (n3 * 9) + (n4 * 8) + (n5 * 7) + (n6 * 6) + (n7 * 5) + (n8 * 4) + (n9 * 3) + (DIGITO_1 * 2 )
ReStO <- SoMa / 11 //Pega somente o resto da divisão

SE ReStO < 2 ENTAO
DIGITO_2 <- 0
SENÃO
DIGITO_2 <- ReStO – 11


SE DIGITO_1 = n10 ENTAO
SE DIGITO_2 = n11 ENTAO
Escreva “CPF válido!”
SENAO
Escreva “CPF inválido!”
SENAO
Escreva “CPF inválido!”



Em PHP ficaria assim:

function verifica_cpf($cpf){

$cpf = trim(str_replace('-','',str_replace('.','',$cpf)));

#DIGITOS VERIFICADORES

$D1 = NULL;
$D2 = NULL;

$n1 = $cpf{0};
$n2 = $cpf{1};
$n3 = $cpf{2};
$n4 = $cpf{3};
$n5 = $cpf{4};
$n6 = $cpf{5};
$n7 = $cpf{6};
$n8 = $cpf{7};
$n9 = $cpf{8};
$n10 = $cpf{9};
$n11 = $cpf{10};

#Primeiro Digito

$resto = ( ($n1 * 10) + ($n2 * 9) + ($n3 * 8) + ($n4 * 7) + ($n5 * 6) + ($n6 * 5) + ($n7 * 4) + ($n8 * 3) + ($n9 * 2) ) % 11;

$resto < d1 ="0" d1 ="11">

#Segundo Digito

$resto = ( ($n1 * 11) + ($n2 * 10) + ($n3 * 9) + ($n4 * 8) + ($n5 * 7) + ($n6 * 6) + ($n7 * 5) + ($n8 * 4) + ($n9 * 3) + ($D1 * 2 ) ) % 11;

$resto < 2 ? $D2 ="0" : $D2 = 11 - $resto;

if ($D1 == $n10 && $D2 == $n11){
return 'correto';
}
else {
return 'errado';
}

}

print(verifica_cpf('012.345.678-90));