PHP além do CRUD

Girorme
ViaHubtecnologia
Published in
9 min readSep 29, 2020

TLDR;
Esse artigo é uma provocação clara e reforça o que já foi evangelizado na comunidade… PHP não é só CRUD!

Thanks to Barn Images

Prólogo

Quando comecei a programar em PHP eu estava longe de seguir qualquer boa prática, melhor, eu não sabia nem que existiam boas práticas, comitês que cuidavam de linguagens para manter o ecossistema de uma linguagem saudável e outras boas coisas, pelo contrário, o meu código era criptografado, literalmente hehe!

Mas eu aprendi algo muito rápido programando em PHP… Tudo é possível.
Sempre gostei muito de segurança e minhas primeiras ferramentas em PHP foram desenvolvidas todas com foco 100% no hacking: Crawlers, scripts de brute force, socket clients e até exploits para algumas vulnerabilidades (Fins estudantis SEMPRE! (-: ).

O hacking ensina o estudante que, com poucos recursos, é possível criar N possibilidades e eu vi isso na prática, vi o PHP fazendo ̶m̶i̶z̶é̶r̶a̶ mágica nas comunidades mais diferentes possíveis (acredite, quando eu digo diferente é porque é diferente mesmo rs).

Então eu comecei a utilizar a linguagem com essa flexibilidade em mente, naquele momento eu tinha conhecimentos em C/C# e na “troca” para o PHP ficou evidente a facilidade comparada com tais linguagens.

A Surpresa

Resumido a minha introdução à linguagem eis que alguns anos se passam e eu começo a ter um contato mais profissional com PHP. Primeiro emprego, sistema vai, sistema vem, bug aqui, bug ali ( ̶b̶u̶g̶ ̶e̶m̶ ̶t̶o̶d̶o̶ ̶l̶u̶g̶a̶r̶), freelas aparecendo, experiência sendo construída e etc.

Tive um panorama geral do que é trabalhar com PHP, as ferramentas que na maioria das vezes eram utilizadas e como o ciclo de desenvolvimento era tomado (certamente ainda tem muito oceano pela frente).

E em algum momento caiu a ficha…

Trabalhar com PHP/WEB é trabalhar com CRUD na maioria do tempo

Isso pode ser meio óbvio para algumas pessoas, porque se estamos falando de web é claro que estamos falando de criação/edição de cadastros, coisas cotidianas, regras de negócio e todo o kit profissional que já estamos acostumados…

Aplicação -> Banco de Dados -> Aplicação -> Banco de Dados -> Aplicação

O ciclo se repete…

Percebi que devx que trabalhavam com PHP nunca se aventuraram em outros aspectos da linguagem (serve como motivação para estudar outros campos fora a web).

Isso ficou muito evidente principalmente nos momentos onde era necessário sair do cotidiano: Criar features que trabalham com agendamento/interação com o sistema operacional, manipulação de arquivos, interação com protocolos diferentes e até mesmo segurança de aplicações.

E isso é uma verdade ainda hoje, 2020…

E tudo bem! PHP é uma linguagem que nasceu na web e naturalmente essa associação sempre existirá…

Para deixar claro… O meu cotidiano profissional é esse também, eu estou sempre criando CRUDS, resolvendo problemas relacionados à CRUDS e toda aquela rotina de um desenvolvedor (O mundo é esse).

Por esse motivo sempre que possível — quando tenho ideias de ferramentas, artigos envolvendo programação ou até mesmo uma pesquisa de vulnerabilidade que seja — tenho o dever de mostrar que posso utilizar PHP ̶P̶y̶̶̶t̶̶̶h̶̶̶o̶̶̶n̶̶̶ ̶e̶̶̶ ̶e̶l̶i̶x̶i̶r̶ ̶t̶̶̶a̶̶̶ ̶̶̶s̶̶̶e̶̶̶m̶̶̶p̶̶̶r̶̶̶e̶̶̶ ̶̶̶q̶̶̶u̶̶̶e̶̶̶b̶̶̶r̶̶̶a̶̶̶n̶̶̶̶̶d̶o̶̶̶ ̶̶̶o̶̶̶ ̶̶̶g̶̶̶a̶̶̶l̶̶̶h̶̶̶o̶̶̶ ̶̶̶t̶̶̶a̶̶̶m̶̶̶b̶̶̶é̶̶̶m̶̶̶ e que a linguagem dá ao dev poder suficiente para sair da caixa.

Linguagens de programação são ferramentas que ajudam a resolver problemas diversos do dia a dia e com certeza esses problemas envolvem muito mais que um s̶i̶m̶p̶l̶e̶s̶ CRUD.

Eu estou jogando palavras ao ar justamente para te incentivar, para sair da rotina e ver que é possível se impressionar (Acredite, todos nós temos esse poder)!

Tenho a consciência também que um pensamento vem à tona: “Por que aprender sockets se eu só trabalho com postgres fazendo crud?”… A resposta é simples:

Conhecimento nunca é demais…

Por onde começar?

Como introdução, nesse artigo irei mostrar algumas ferramentas interessantes que podemos criar com o PHP e em outros artigos irei me aprofundar com mais detalhes na criação de mais algumas outras coisas (Esse artigo tem que ser rápido esse porque estou finalizando um CRUD rs… :) )

CLI

Muitas ferramentas que fogem do domínio do navegador certamente estão rodando no terminal e devido a isso muitas bibliotecas foram criadas para facilitar a criação a manutenibilidade das mesmas. Bibliotecas essas para facilitar as atividades recorrentes. Os exemplos a seguir serão todos executados via terminal e iremos colocar em prática algumas coisas básicas e legais.

Ah e basta procurar em algum awesome-php que fica notável a quantidade/variedade de bibliotecas para cli:

  • Aura.Cli — Interação com interfaces de terminal no estilo request (Context) e response (Stdio) por meio de objetos prontos para cli. Inclui suporte à Getopt e diversos outros helpers
  • Laravel Zero — Micro framework para aplicações CL (Dica do nosso amigo @danielhe4rt)
  • Boris — PHP REPL
  • Cilex — Micro framework para construir ferramentas CLI
  • CLI Menu — Biblioteca para construir menus CLI
  • CLIFramework — Framework cli para criação de aplicações flexíveis
  • CLImate — Estilização de textos CLI
  • Commando — Parser CLI.
  • Cron Expression — Parser e controle de tarefas CRON
  • GetOpt — Parser de argumentos CLI
  • GetOptionKit — Parser de argumentos CLI
  • Hoa Console — Parser de argumentos CLI
  • PsySH — PHP REPL.

A lista veio diretamente daqui: https://github.com/ziadoz/awesome-php#command-line

Networking

Quando estamos na web, por baixo dos panos, temos sockets trabalhando a todo vapor. A internet é feita de sockets e nada mais justo do que conhecer um pouco mais sobre…

Já criei algumas ferramentas legais utilizando e o aprendizado é gigante e envolve muitos pontos interessantes: Domínio, tipo, protocolo e diversas outras coisas.

Uma ferramenta simples e muito legal para se criar e treinar sockets é o famoso “banner grab” para identificar serviços que estão rodando em dada porta em algum ip. Abaixo um simples script que criei para usarmos de exemplo no artigo:

A utilização é bem simples:

$ php banner-grab.php -i ftp.unicamp.br -p 21
[+][ftp] ftp.unicamp.br:21 up...
Response:
220 FtpServer da Unicamp

Dessa forma sabemos qual serviço está rodando na porta e se o host está de pé. Seria muito simples modificar o script para ler hosts de um arquivo por exemplo ou até mesmo de algum site obtido via webCrawling, as possibilidades são infinitas.

Muitas ferramentas maduras fazem esse trabalho com maestria trazendo versões, identificando falhas e muitas outras coisas, exemplo: nmap, netcat, etc.

A lista dentro de network é gigante, explore: https://www.php.net/manual/pt_BR/book.network.php

Caso queira um exemplo simples criei essa lib que, entre as funcionalidades, gera ips utilizando as funções long2ip e ip2long em conjunto com generators:

Data scraping / Coleta de dados

Uma das coisas mais legais de se fazer utilizando programação na minha opinião é o data/webscraping. Conseguimos automatizar ferramentas diversas, desde bots de games, caçadores de cupons (hehehe) e até monitorar político ladrão.

É muito simples com PHP acessar uma url e extrair links/informações. Criemos então um crawler para obter todos os links de uma página:

Utilização:

$ php link-scraper.php -u https://github.com/okfn-brasil/serenata-de-amor
[+] Link: https://github.com/
[+] Link: https://lab.github.com/
[+] Link: https://opensource.guide
[+] Link: https://github.com/events
[+] Link: https://github.community
[+] Link: https://education.github.com
[+] Link: https://stars.github.com
[+] Link: https://enterprise.github.com/contact
[+] Link: https://education.github.com
[+] Link: https://serenata.ai/en
[+] Link: https://docs.github.com/articles/which-remote-url-should-i-use
[+] Link: https://desktop.github.com
...

Esse é um script que pode ser utilizado sem problemas, mas é claro que existem ferramentas muito mais profissionais (Tanto clients http, quanto interpretação de DOM):

Binary parsing

Assim como em python ou outras linguagens, é possível interpretar/manipular dados binários utilizando as funções pack e unpack. O que quer dizer que podemos interpretar protocolos, fazer parsing de arquivos, enviar dados binários através de conexões e outras coisas legais.

Um exemplo simples para ilustrar a capacidade de tais funções é criar um “parser” de arquivos gif, para identificar a versão do mesmo. Podemos pesquisar a especificação de um dado arquivo e interpreta-lo via unpack.

A primeira coisa é saber como o cabeçalho de um arquivo gif é organizado:

struct _gif_header
{
uint32 SignatureHi; // "GIF8"
uint16 SignatureLo; // GIF version: "7a" or "9a"
uint16 Width; // logical screen width in pixels
uint16 Height; // logical screen height in pixels
uint8 Flags; // Global Color Table specification
uint8 Background; // background color
uint8 Range; // default pixel aspect ratio
};

Com essas informações em mãos podemos ler o arquivo de forma binária e trazer o resultado de uma forma que um humano possa entender (Iremos obter informação apenas até o campo Height da struct:

A saída do arquivo:

$ php binary-unpack.php
{"version":"GIF89a","width1":250,"width2":0,"height1":250,"height2":0}

Conseguimos saber então que a versão do gif é GIF89a, a largura é de 250 e a altura também de 250.

O que acontece na utilização do unpack é o seguinte:

- A -> Ler um byte e interpretar como string.
... O número de bytes vem a seguir
- 6 -> Leia um total de 6 bytes, iniciando da posição 0
- version -> Índice que será criado no array contendo a informação obtive por A6.
- / -> Inicio de um novo trecho- C -> Ler um byte e interpretar como unsigned byte
- 2 -> Leia um total de 2 bytes
- width-> Índice que será criado no array
- / -> Inicio de um novo trecho- C -> er um byte e interpretar como unsigned byte
- 2 -> Leia um total de 2 bytes
- height -> Índice que será criado no array

Então sabendo a especificação de dado arquivo (ou fazendo engenharia reversa) é possível interpretar qualquer tipo de arquivo.

Artigos legais de introdução:

Multithread / Concorrência

O PHP tem se mostrado cada vez mais maduro quando falamos de programação multithread/async, eu mesmo já experimentei algumas bibliotecas muito legais, entre elas:

Que foi muito legal no início apesar de expor uma api muito complexa para o dev, o que fez com que o autor krakjoe desse início a outra lib muito legal:

Dessa vez com uma api mais simples e concisa podemos entregar coisas concorrentes de verdade, com menos complexidade.

Convido você a explorar um pouco mais desse mundo…

Vale mencionar aqui o excelente artigo do Vinicius Dias que mostra como podemos explorar de forma nativa o mundo assíncrono no PHP:

Algumas coisas legais para estudar:

--

--

Girorme
ViaHubtecnologia

Open source — Sec — Psicodelic Mind Process