Não apenas os programadores PHP ruins ou medianos, muitas vezes bons, esquecem os objetivos de segurança.
Embora não seja esculpido em pedra, sites de hackers podem ser feitos caminho mais difíceis com a introdução de algumas regras
- segmentação de código / dados / arquivo de trabalho e aplicação de permissão
- código: um diretório onde você guarda seus arquivos executáveis: este diretório TEM que ser acessível, mas NÃO DEVE ser gravável pelo usuário executando o apache (www-data ou httpd em sistemas diferentes) (mecanismo php_admin_flag ativado)
- data: lugar do css, imagens e arquivo estático que vem com a página: este diretório NÃO DEVE ser gravável ou executável pelo Apache (mecanismo php_admin_flag desativado)
- um diretório para arquivos carregáveis pelo usuário, arquivos temporários e assim por diante: este diretório pode ser gravável, mas NÃO DEVE ser executado pelo Apache (mecanismo php_admin_flag desativado)
- desabilitando arquivos .htaccess: um terço de uma vez, os 'hacks' do site são apenas sobre reescrever arquivos .htaccess, então é como um escalonamento de privilégios. Também acelera o Apache se ele não precisar verificar se algum arquivo .htaccess está residindo em _qualquer_ nível do caminho que está sendo atendido.
- introduzindo restrições não-obstétricas no PHP, como
- desativando funções não utilizadas (sistema, exec no início),
- introduzindo open_basedir (estritamente declarando diretórios onde o exec do PHP não é permitido)
- Mecanismo php_admin_flag desativado no diretório / e permitindo somente diretórios específicos (ou melhor, arquivos específicos)
- display_errors estritamente OFF
- com o virtualhosting em muitos sites, está se tornando útil se você introduzir um wrapper do sendmail, a fim de marcar cada letra de saída, facilitando a localização do virtualhost que inunda o sistema com spam
- e, claro, evitando erros comuns, como incluir uma variável GET / POST
Um simples wrapper do sendmail:
#!/bin/sh
umask 077
TEMP=/tmp
CHROOT=${1:-unspecified}
trap "rm -f msg.$$ ; exit 1" 0 1 2 3 15
rm -f msg.$$ || exit 1;
cat | formail -f -I "X-subsystem-sent: \"$CHROOT\"" >$TEMP/trapmail.$$
exec <$TEMP/trapmail.$$ || exit 1
rm -f $TEMP/trapmail.$$ # safe, we hold the file descriptor
exec /usr/sbin/sendmail -t -i
exit 1