- Slides: https://speakerdeck.com/galvao/php7-show-me-the-code
- Repositório: https://github.com/galvao/php7-show-me-the-code
- Algorítmo pseudorandômico, criptograficamente seguro
- Lança exception se o random do sistema operacional não for seguro
- Gerar string aleatória:
bin2hex(randomBytes($length))
- Configurar sessão de forma programática
- Diferentes usuários podem ter diferentes sessões
- Usuário não autenticado deveria estar na sessão também
unserialize
por padrão invoca o método destrutor- Vulnerabilidade: Injeção de código via método destrutor (ex. JSON)
- Parâmetro
allowed_classes
permite filtrar- TRUE: Normal, executa o destrutor
- FALSE: Nenhum método especial executado. Objeto vira
__PHP_Incomplete_Class
- ['Foo', 'Bar', 'Baz']: Permite apenas essas classes
$foo = $bar['baz'] ?? false;
- Açucar sintático para isset + if ternário
- Evita repetição - maior repetição = maior chance de erro
new class (1, 'Bar') {
private $foo
public function __construct($foo, $bar) {
// ...
}
}
- Modo strict para tipos de parâmetros e retorno
declare(strict_types = 1)
- STH = Scalar Type Hint
- RTD = Return Type Decoration
- Strict = Desativa type juggling
- Lança fatal error quando não respeitar o tipo declarado
- Use de vários namespaces ao mesmo tempo
Use Foo\{
Foo,
Bar\Baz
}
- Comparação de maior, igual ou menor
- Especialmente útil em algorítmos de ordenação
- Serve para números, arrays, strings
- Retorna 1 se o valor à esquerda for maior, 0 se forem iguais e -1 se for menor
- Permite desabilitar/rodar o garbage collector programaticamente
session_start([ 'gc_probability' => 0 ]);
session_gc()
try {
// ...
} catch (\Foo | \Bar $exc) {
// ...
}
- public, private e protected para constantes
- Permite declarar retorno "void" em métodos e funções
public function foo() : void
- Na função, usar
return;
ou não usar return
function foo(?int $bar = 0);
- Biblioteca para criptografia
- Mcrypt foi descontinuada
sodium_crypto_secretbox
esodium_crypto_secretbox_open
- Manual do PHP sobre Libsodium
- Para retorno de objetos sem determinar o tipo
function foo() : object
- Permite debugar prepared statements com o PDO (antes não mostrava a query final)
$sth->debugDumpParams()
- Vencedor de uma competição para criar um novo hash
password_hash('123456', PASSWORD_ARGON2I)
- Suporte extendido no PHP 7.3
- http://wiki.php.net/rfc
- Changelog
- Votação de features
- PHP 7.4
- Atributos tipados (private int $foo)
- Argon 2
- Null Coalesce Equal
- Slides/Repositório: https://github.com/ferfabricio/phpweeekend-maringa
- Solução para problemas recorrentes
- Padrão de código
- Identificar problemas, aplicar patterns
- Co-fundador do stackoverflow
- Em um blog post sobre design patterns:
- Adiciona complexidade
- Soluções simples devem ser tentadas primeiro
- Muitos problemas de design podem indicar que aquela linguagem não serve para o que você está tentando fazer (ou você está fazendo errado)
- São aliadas, quando usadas corretamente
- É necessário aprender onde usar
- Perigo: Querer aplicar em todo lugar
- Nós humanos quando aprendemos alguma coisa nova já queremos aplicar ela em todo lugar
- Recomendação de livro sobre Design Patterns
- Link: https://sourcemaking.com/design-patterns-ebook
- Criacionais
- Instanciação das classes e objetos
- Herança e delegação
- Delegação > Herança
- Exemplos: Object pool, prototype, etc.
- Estruturais:
- Composição das classes
- Heranças para comportamentos
- Objetos compostos
- Exemplos: Adapter, bridge, decorator, etc.
- Comportamental:
- Comunicação entre objetos
- Princípio SOLID
- Exemplos: Chain of reference, iterator, etc.
Não deu pra acompanhar o resto da palestra :|
- Repositório: https://github.com/pedromazala/phpweekend
- Tipo uma VM, só que bom
- Gerencia imagens e containers
- Fazendo uma analogia à POO, imagens = classes; container = objeto
- Imagens são pré-construídas
- Docker só carrega as bibliotecas e binários, não carrega o SO inteiro junto igual as VMS
- Atomicidade - Não rodar PHP e MySQL na mesma máquina por ex.
- Evita Dependency Hell - Exemplo: Precisar rodar Python 2 e 3 no mesmo projeto
- Portabilidade - Roda em qualquer lugar
- Escala horizontal
- 12 Factor App
- 12 fatores para tornar um app escalável horizontalmente
- Facilita CI / CD
- Testes realizados em cima da imagem do Docker
- Ambientes semelhantes para desenvolvimento e produção
- Possibilidade de fazer commit de um container
- Possibilidade de fazer save/load de uma imagem (backup.tar)
- Libs dependem do SO
- Versões diferentes (5.2 x 7.2)
- Difícil de lidar com MsSQL
- Configurações específicas (.ini)
- Processamento fora da máquina
- php-fpm: Nginx faz requisição externa para executar código PHP, apenas em arquivos .php
- posphp.alfaumuarama.com.br
- Os seguintes aspectos não interferem na segurança de aplicações
- Linguagem
- Tipagem
- Paradigma
- Padrão de programação
- Segurança deve ser um goal desde o início do projeto
- Top 10 OWASP (Link)
- Tratar o dado, manter apenas o que é legítimo
- Nem toda "injeção" é hack, o usuário pode apenas ter digitado errado
- Guardar o dado original
- Informações mais claras sobre o porquê
- Registrar tentativas (log)
- Não é só tipo de dados que deve ser validado
- Web não tem tipo!
- Validar valor, comprimento, formato, etc
- Validar integridade da informação
- MD5 e SHA1 não são mais úteis
- Hashing não é só pra senha
- Qualquer dado que não precisa ser lido deve estar hasheado
- Codificação de um dado
- Vetor de inicialização = salt
- mcrypt já era, o projeto foi abandonado desde 2003
- No PHP: OpenSSL ou Sodium
- Criptografia aumenta o tamanho do dado
- Email não pode ser varchar
- https://en.wikipedia.org/wiki/Email_address#Syntax
- http://abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijk.com
- Criptografado pode passar de 255 caracteres
- Deve ser do tipo TEXT
- Criptografia deve ser usada em qualquer informação que não deve ser vista por qualquer pessoa
- Segurança > Performance
- Fontes importantes:
- OWASP
- MITRE CVE
- Estude!
- Leia a documentação/manual
- Pesquise sobre cifras
- Consulte vulnerabilidades
- Mantenha-se informado