Rss

  • youtube
  • linkedin
  • google

Algoritimo de validação de CPF brasileiro –; Cadastro de Pessoa Física em PHP

Neste artigo explicarei passo a passo na transformação de um algorítimo de verificação da validade de um CPF para código em PHP.

Se você já conhece o algorítmo e quer ir direto aos códigos disponíveis, clique aqui.

Mas o que é o CPF?

CPF é o acrônimo para Cadastro de Pessoa Física. Ele é um número de documento brasileiro atualmente gerenciado e emitido pela Receita Federal. Todo brasileiro tem o direito (ou o dever) de ter um e somente com ele é possível ter acesso a serviços bancários, matricular-se em cursos de graduação públicos, assumir cargo através de concurso público, ter cartão de crédito, entre outros exemplos.

Composição do CPF

O CPF é composto de onze algarismos, sendo que os ultimos três algarismos possuem significados que explicaremos a seguir.

O nono dígito, lendo da esquerda para a direita, indica a Região Fiscal onde ele foi emitido. Há dez regiões para os algarismo de zero a nove conforme tabela abaixo.

1 – DF, GO, MS, MT e TO
2 – AC, AM, AP, PA, RO e RR
3 – CE, MA e PI
4 – AL, PB, PE, RN
5 – BA e SE
6 – MG
7 – ES e RJ
8 – SP
9 – PR e SC
0 – RS

Os primeiro oito algarismos são o numero base.

Os ultimos dois algarismo são os dígitos verificadores.

Esses dígitos são gerados a partir de cálculos dos nove primeiros algarismos de acordo com a seguintes regras:

Primeiro Dígito verificador

Para o primeiro dígito, pegamos os 8 primeiros algarismos e multiplicamos cada um deles por um número iniciado em 10 e a medida em que vamos avançando para a direita, diminuimos em 1 esse multiplicador e somamos todos os resultados.

Para melhor entendimento, tomemos 123.456.789-XY como exemplo de CPF a ter o digito XY calculado.

1 x 10 = 10
2 x 9 = 18
3 x 8 = 24
4 x 7 = 28
5 x 6 = 30
6 x 5 = 30
7 x 4 = 28
8 x 3 = 24
9 x 2 = 18
Somando 10 + 18 + 24 + 28 + 30 + 30 + 28 + 24 + 18 temos 210.

Agora, com o total obtido temos duas forma de chegar ao digito verificador.

Método 1

Multiplicamos 210 por 10, dividimos por 11 e pegamos o resto.

Temos então: 210 x 10 = 2.100

2.100 / 11 = 190 com resto 10.

Se o resto for 10 o dígito verificador é zero, do contrário, o resto é o dígito verificador.

No nosso caso, como o resto é igual a 10 o primeiro dígito será 0 (zero).

Método 2

Obtemos o resto da divisão de 210 por 11.

Temos então: 210 / 11 é igual a 19 com resto 1.

Aqui temos uma regra para quando o resto for 0 (zero) ou 1 (um). Quando isso acontece o dígito verificador é zero, do contrário subtraimos o resto de 11 para obter o dígito verificador.

Para o nosso caso, como temos resto 1, o nosso primeiro dígito verificador será 0 (zero).

Segundo dígito verificador

Para obter o segundo dígito verificador, acrescentamos o primeiro dígito verificador aos 9 algarismos iniciais e fazemos novamente o mesmo processo feito para o primeiro dígito, com a diferença de que agora iniciamos a partir do segundo dígito.

Nosso CPF já está com o valor 123.456.789-0X e as operações necessárias estão abaixo.
2 x 10 = 20
3 x 9 = 27
4 x 8 = 32
5 x 7 = 35
6 x 6 = 36
7 x 5 = 35
8 x 4 = 32
9 x 3 = 27
0 x 2 = 0
Somando 20 + 27 + 32 + 35 + 36 + 35 + 32 + 27 + 0 temos 244.

Agora, com o total obtido devemos usar uma das duas formas já explicadas para chegar ao dígito verificador.

Método 1

Multiplicamos 244 por 10, dividimos por 11 e pegamos o resto.

Temos então: 244 x 10 = 2.440

2.440 / 11 = 221 com resto 9.

Se o resto for 10 o dígito verificador é zero, do contrário, o resto é o dígito verificador e no nosso caso temos 9 como segundo dígito verificador.

Método 2

Obtemos o resto da divisão de 244 por 11.

Temos então: 244 / 11 é igual a 22 com resto 2.

Lembrando que temos uma regra para quando o resto for 0 (zero) ou 1 (um) o dígito verificador é zero.

Caso seja maior que 1 subtraimos esse valor de 11 para obter o dígito verificador.

Para o nosso caso, temos 11 ; 2 = 9 como nosso segundo dígito verificador que é o mesmo valor obtido no método 1.

CPF tem um limite para emissão?

Na teoria, podemos ter até 10^8 ou 100.000.000 (cem milhões) de combinações possíveis para cada região. Na prática temos um pouco menos devido ao não uso de algarismos repetidos, por exemplo. Embora pareça um número bem grande, ele deverá ser remodelado em algum momento, já que não pode ser reutilizado mesmo quando uma pessoa falece.

Supondo que já existam na região 8 (estadao de São Paulo) cerca de 40 milhões de CPFs emitidos (não consegui dados fidedignos em 2022 por isso estou usando um número aproximado da população residente que é de 44,5 milhões de pessoas), restariam aproximadamente 60 milhões de CPFs disponíveis. Com a atual taxa de crescimento de CPFs (ano de 2022) em cerca de 600 mil por ano, o sistema deve aguentar pouco menos de 100 anos.

Chegamos aqui ao final da explicação e do exemplo sobre a composição do CPF. O nosso CPF de exemplo ficou como 123.456.789-09. Abaixo temos alguns exemplos de códigos tanto para gerar os dígitos verificadores, quanto para validá-los.

Codigo de validação de CPF para PHP

abaixo temos alguns códigos:

O primeiro código é de uma função em PHP otimizada para ter o menor numero de complexidade ciclomática que consegui. Ele tem uma ligeira alteração no momento do cálculo do segundo digitido verificador. Ao invés de começar pelo segundo algarismo, o codigo começa pelo primeiro e usa o valor 11 como multiplicador. Outra alteração visivel é que para evitar a necessidade de comparação para saber se estamos no nono e decimo digitos, atribuo o valor zero ao ultimo elemento (indice 10) para reduzir mais uma comparação.

O algoritmo utilizado é o método 1 explicado acima e há um pequeno truque para evitar a comparação com o resto igual a 10 que é fazer o módulo de 10 do resto.

// Codigo que valida um CPF informado quanto a validade de seus dígitos verificadores.

   /**
     * 
     * Verifica se um CPF é válido
     * @ author Marcos Regis <marcos@marcosregis.com>
     * @param string $cpf
     * @return bool
     */
    function validar(string $cpf): bool
    {
        if (strlen($cpf) != 11) {
            return false;
        }
        $elementos = (array)str_split($cpf);
        $elementos[10] = 0; // Reduz uma comparação no calculo de $somaB
        $somaA = 0;
        $somaB = 0;
        foreach ($elementos as $indice => $elemento) {
            $multiplicador = count($elementos) - $indice;
            $somaA += (int)$elemento * (int)($multiplicador > 2 ? $multiplicador - 1 : 0);
            $somaB += (int)$elemento * (int)$multiplicador;
        }

        $moduloA = (($somaA * 10) % 11) % 10;
        $moduloB = (($somaB * 10) % 11) % 10;

        return preg_replace('#\d{9}(\d{2})$#', '$1', $cpf) == $moduloA . $moduloB;
    }

Configurando um servidor de Email

Tenho meu próprio servidor de e-mail utilizando Postfix, Dovecot, MariaDB, Spamassassin, Clamav, Amavisd-new, Fail2ban, Nginx, Postfixadmin e Roundcube sob o CentOS 8.
Embora já tenha diversas receitas de como configurar este pacote, precisei de muitas horas para entender como manter o serviço rodando corretamente, cada configuração no main.cf e no master.cf e no fim conseguir diminuir a enxurrada de spam que chega a cada instante.
E anti-spam é o foco desta publicação. Sofri e continuo sofrendo com as constantes tentativas de utilizarem meus serviços como um zumbi ou disseminador de vírus, fraudes e tudo o mais que puderem.

Perdi a conta de quantas vezes meu serviço de DNS parou por excesso de tentativas de conexão que entupiam a memória e forçava o S.O. a cortar processos para economizar recursos e o named era o escolhido por ser o elo mais fraco.
Então, este artigo tem foco na configuração adequada para serviços de email privado, de poucos usuários e poucos domínios. Certamente muito do que está neste pequeno manual serve para serviços mais parrudos, mas acredito que para estes casos o uso de ferramentas ou serviços dedicados e especializados deva ser sempre levado em consideração.

Então deixemos de lado o falatório para irmos direto ao mão na massa.

Instalação dos pacotes

O primeiro passo é instalar todo os pacotes que serão utilizados. O Roundcube e o Postfixadmin rodam sob um webserver com suporte a PHP e cujas contas de e-mail possam ser armazenadas em um servidor de banco de dados. Como Webserver eu utilizo o Nginx e embora prefira o PostgreSQL vou utilizar o MariaDB como SGBD devido ao fato de que a maioria já o utiliza (devido ao WordPress provavelmente).

Então, ao final do processo de instalação, deveremos ter instalado alguns novos repositórios de pacotes.

Ative os repositórios de Extra Packages para a sua distribuição, caso ainda não o tenha feito. Para o CentOS 8 os comando abaixo fará isso.

$ sudo dnf install epel-release

Adicionalmente, instale os pacotes curl, htop, vim, yum-utils, wget, net-tools, chrony e certbot que serão necessários em outros pontos da configuração.

$ sudo dnf install -y curl htop vim yum-utils wget net-tools chrony certbot

Postfix

Postfix é um MTA (mail transfer agent). Um MTA faz a ponte entre os computadores para a troca de mensagens de correio eletronico. Para o nosso caso, é o elemento principal.

A versão do Postfix que utilizarei neste documento é a 3.3. Para saber qual a versão que será instalada digite:

$ sudo dnf info postfix

Para instalar execute o comando

$ sudo dnf install -y postfix postfix-mysql postfix-pcre

Vamos deixar o serviço parado por enquanto mas já configurado para iniciar junto com o Sistema Operacional.

$ sudo systemctl enable postfix

Dovecot

Dovecot é um Servidor de Email Imap e Pop3. Com ele que poderemos enviar e receber as mensagens via Postfix e entre outras coisas controlar o acesso ao serviço via autenticação.
Para instalar o Dovecot com suporte a mysql basta executar o comando:

$ sudo dnf install -y dovecot dovecot-mysql

Mais uma vez, vamos ativar o serviço porém deixá-lo parado.

$ sudo systemctl enable dovecot

Amavis

Amavis é um filtro de conteúdo para correio eletrônico. Com ele é possível filtrar mensagens nocivas usando configurações contra spam, vírus e outros malwares. Abaixo os comandos que o instalam. Ele requer muitas dependencias que serão atualizadas e/ou instaladas junto. Uma dessas dependencias é o SpamAssassin que será configurado mais adiante, juntamente com todos os outros pacotes que estamos instalando.

Primeiro certifique-se de que o repositorio PowerTools está habilitado, pois é a partir dele que instalaremos o Amavisd-New.

$ sudo dnf config-manager --set-enabled powertools

Em seguida instalamos o Amavis e algumas dependencias sendo uma delas o ClamAV que é um antivirus simples e bastante eficiente para os tipos mais comuns de ameaças e totalmente gratuito.

$ sudo dnf -y install amavisd-new clamd perl-Digest-SHA1 perl-IO-stringy

Novamente, vamos ativar os serviços para que sempre iniciem de forma automática, mas por enquanto deixando-os parados.

$ sudo systemctl enable amavisd spamassassin

MariaDB (ou MySQL)

Normalmente, quem usa WordPress já possui instalado e configurado o MariaDB ou o MySQL. Se esse for o seu caso, pode pular esta etapa.

Eu particularmente prefiro o PostgreSQL, mas como a intenção deste documento é permitir que DevOps consigam ter seus proprios serviços e nem sempre dá pra ter varias instancias resolvi usar o MariaDB. Dessa forma, caso necessite adicionar posteriormente o WordPress, não precisará adicionar um SGBD adicional ou mesmo usar wrappers para que ele tenha suporte a PostgreSQL.

Não se preocupe com as configurações neste momento, pois as detalharei mais adiante em outra publicação. Continuando com a instalação devemos executar o comando:

$ sudo dnf install -y mariadb-server

e em seguida ativar o serviço para iniciar junto com o sistema

$ sudo systemctl enable mariadb

Webserver (Nginx + Php-Fpm)

Os ultimos elementos a serem instalados fazem parte do Webserver. É possível que você já tenha um rodando como o Apache então esse ponto pode ser pulado. Se você está iniciando um novo servidor ou se não tem intimidade com a configuração do Apache e PHP, recomendo seguir as dicas dessa instalação.

Eu gosto muito do Nginx e vou usar em conjunto com o Php-Fpm.

$ sudo dnf install -y nginx php-fpm

Neste ponto já temos todos os arquivos necessários para inciar a configuração do Servidor de Email.

Sou muito preguiçoso

Não gosta de ficar digitando ou não está preocupado nos detalhes de cada item instalado. Seus problemas acabaram!

Você pode executar todos os comando deste documento com as linhas abaixo:

ATENÇÃO! Este script é apenas um arquivo com as linhas de comando. Eventualmente pode não funcionar corretamente dependendo das configurações do seu sistema.

$ sudo dnf update
$ sudo dnf install -y epel-release
$ sudo dnf config-manager --set-enabled powertools
$ sudo dnf -y install --enable-repo=epel-release,powertools curl htop vim yum-utils wget net-tools chrony certbot postfix dovecot amavisd-new clamd perl-Digest-SHA1 perl-IO-stringy mariadb-server ngixn php-fpm
$ sudo systemctl enable postfix mariadb spamassassin amavisd dovecot nginx php-fpm 

Com tudo instalado podemos iniciar as configurações. Comecemos pelo MariaDB.

Antispam para Servidores de E-mail

Já publiquei um tempo atrás um artigo mostrando como montei um servidor e e-mail utilizando as ferramentas mais comuns para ambiente OpenSource em Linux. Usei Postfix, Dovecot, Postfixadmin, Roundcube e Spamassassin.

Agora vou mostrar uma outra ferramenta que é uma alternativa ao Spamassassin que é o MailCleaner.



Continue lendo >>

Protegendo seu WordPress de ataques

Esse site que está acessando é uma instalação do WordPress. Eu gosto da facilidade dele.

O WordPress é mesmo muito bom para se produzir um blog rapidamente em um VPS ou Nuvem, mas sua facilidade também é seu maior defeito.

Como é muito simples ter um site com ele, a grande maioria das páginas presentes na internet são feitos utilizando-o e consequentemente isso atrai aqueles que procuram falhas na programação de seu código aberto.



Continue lendo >>

Docker em Ubuntu. Service nginx failed to build: ADD failed: stat /var/lib/docker/tmp/docker-builder(;)/startup.sh: no such file or directory

Docker em Ubuntu

Às vezes, ao usar Laradock, este erro ocorre depois de tentar uma reconstrução de container com no such file or directory mensagem em docker-compose up -d –build nginx comando.

Não está claro para mim qual é a questão real, mas executando o comando com sudo, podemos executá-lo com sucesso.

Seems that the regular user need access rights to directory /var/lib/docker/tmp/ but do not have. So, running with sudo the trouble is bypassed and the build can finished normally.

Depois de construir containers com sudo, é possível descarregá-lo e recarregar sem sudo.

Servidor de Email – Parte 4 – Postfix 3

Parte 1 – Configurar arquivo main.cf

Esta é a quarta parte do processo de criação do servidor de Email em um CentOS 8 e a primeira parte da configuração do Postfix. Se chegou aqui por acaso, melhor ler primeiro uma das publicações abaixo:

Parte 1 – Instalação dos Pacotes

Parte 2 – Configuração do MariaDB

Parte 3 – Configuração do Dovecot

O Postfix é a parte mais importante do nosso servidor de email. Ele será responsável por conversar com outros MTAs para que receba e envie as mensagens de correio eletrônico e para que ele possa ser contatado é necessário que ele seja identificável através do nome do servidor ou o seu hostname.



Continue lendo >>

Servidor de Email – Parte 3 – Dovecot

Esta é a terceira parte do processo de criação do servidor de Email em um CentOS 8. Se chegou aqui por acaso, melhor ler primeiro as publicações anteriores

Parte 1 – Instalação dos Pacotes

Parte 2 – Configurar MariaDB

O Dovecot é um MDA (Mail Delivery Agent) que é um agente que transporta as mensagens do Postfix para as caixas de mensagens virtuais. Nesta seção iremos configurar a instalação do Dovecot para forçar os usuários a usarem SSL quando eles se conectarem, desta forma nunca enviando senhas em modo texto simples.

Eu sempre gosto de manter os arquivos originais de qualquer definição para caso eu acabar me perdendo durante as configurações. Eu posso dizer que esse passo não é necessário caso esteja fazendo esse tutorial integralmente, porém, se já tem uma configuração anterior e está apenas usando para melhorá-lo sugiro fortemente que faça copia de seus arquivos.

No nosso caso, os arquivos de configuração estarão em /etc/dovecot/conf.d/. Podemos então fazer a cópia com o comando:



Continue lendo >>

Servidor de Email – Parte 2 – MariaDB

Esta é a segunda parte do processo de criação do servidor de Email em um CentOS 8. Se chegou aqui por acaso, melhor ler primeiro a publicação anterior sobre a Instalação dos Pacotes

Porque usar MariaDB/MySQL?

Antes de tudo devo deixar claro que prefiro usar o PostgreSQL em detrimento do MariaDB/MySQL por muitas razões, porém, há uma que pesa muito contra o uso do PostgreSQL em um servidor unificado com WordPress e serviços de E-mail que é o simples fato de que o WP não possui suporte nativo ao PostgreSQL. Você pode ter mais informações sobre esse assunto na documentação oficial do WordPress neste link. Como estou me baseando em experiências pessoais para escrever este documento e também para pequenos serviços, estou usando o que há de mais comum e mais acessível. Caso o uso de PostgreSQL seja do seu interesse, você pode consultar este documento mais tarde onde mostrarei como migrar do MariaDB para o PostgreSQL.

Configurando MariaDB/MySQL

Supondo que você esteja seguindo os passos deste manual, você estará com uma instalação do MariaDB ainda não configurada. Caso já tenha uma instalação funcional, pode pular para o próximo passo.



Continue lendo >>

DataTables + HTML 5 Botões de exportação + Laravel-Mix (Webpack)

Nos últimos dias, Eu experimentei um problema ao tentar usar DataTables e Bootstrap 4 com suporte para exportar os resultados para Excel e PDF usando Laravel-Mix. Após horas e horas tentando colocar todos os scripts para trabalharem juntos, Eu finalmente consegui. Então, decidi escrever este pequeno Como Fazer para aqueles com o mesmo tipo de problemas.



Continue lendo >>

J5 Links

Aqui estão alguns links úteis para celular Samsung J5.

Burlar verificação de Conta Google