Apenas uma solução simples de autenticação de usuário dentro de um esqueleto de estrutura super simples que funciona imediatamente (e vem com um instalador automático), usando a implementação oficial de hashing/salting de senha bcrypt à prova de futuro do PHP 5.5+, mais alguns recursos interessantes que irão acelerar drasticamente o tempo desde a ideia até o primeiro protótipo de aplicação utilizável. Nada mais. Este projeto tem como foco a simplicidade extrema. Tudo é o mais simples possível, feito para projetos menores, trabalho típico de agência e rascunhos rápidos. Se você deseja construir aplicativos corporativos massivos com todos os recursos que os frameworks modernos possuem, dê uma olhada em Laravel, Symfony ou Yii, mas se você deseja apenas criar rapidamente algo que simplesmente funcione, então este script pode ser interessante para você.
A arquitetura mais simples possível do HUGE foi inspirada em diversas palestras em conferências, slides e artigos sobre grandes aplicações que - surpreendentemente e intencionalmente - remontam ao básico da programação, usando programação processual, classes estáticas, construções extremamente simples, não totalmente-DRY código etc., mantendo o código extremamente legível (StackOverflow, Wikipedia, SoundCloud).
Alguns chavões interessantes neste contexto: KISS, YAGNI, Feature Creep, Produto mínimo viável.
Para manter este projeto estável, seguro, limpo e mínimo, decidi reduzir o desenvolvimento do HUGE ao mínimo. Não se preocupe, isso é realmente uma coisa boa: novos recursos geralmente significam novos bugs, muitos testes, correções, incompatibilidades e, para algumas pessoas, até mesmo estresse intenso com atualizações. Como HUGE é um script crítico para a segurança, novos recursos não são tão importantes quanto um núcleo estável e seguro, é por isso que as pessoas o usam. Isso significa:
E para ser honesto, manter uma estrutura gratuita em meu raro tempo livre também não é o que quero fazer permanentemente. :)
Finalmente, uma pequena nota: O mundo PHP evoluiu dramaticamente, temos excelentes frameworks com recursos incríveis e grandes equipes profissionais por trás, documentações muito bem escritas e grandes comunidades, então simplesmente não há razão para colocar muito trabalho em outro framework. Em vez disso, comprometa-se com os frameworks populares, então seu trabalho terá muito mais impacto e será usado por muito mais pessoas!
Obrigado a todos em torno deste projeto, divirtam-se! Beijos, Chris
Em 2010/2011 não havia soluções de login úteis no mundo PHP, pelo menos não para não especialistas. Então cometi o pior erro que todo jovem desenvolvedor comete: tentar construir algo sozinho, sem ter a menor ideia dos princípios básicos de segurança. O que tornou tudo ainda pior foi: a web estava (e está) cheia de tutoriais totalmente quebrados sobre a construção de sistemas de autenticação de usuários, até mesmo as maiores empresas do mundo fizeram isso completamente errado (estamos falando de SONY, LinkedIn e Adobe aqui), e também muitas estruturas importantes em todas as grandes linguagens de programação (!) Usavam tecnologias de salvamento de senhas totalmente desatualizadas e inseguras.
Porém, em 2012, o especialista em segurança Anthony Ferrara publicou uma pequena biblioteca PHP, permitindo hashing de senhas extremamente seguro, moderno e correto em PHP 5.3 e 5.4, utilizável por qualquer desenvolvedor sem qualquer estresse e sem qualquer conhecimento sobre aspectos internos de segurança. O script era tão incrível que foi escrito no núcleo do PHP 5.5, que é o padrão de fato atualmente.
Quando isso foi lançado, tentei usar essa biblioteca simples para construir um sistema de login totalmente funcional e pronto para uso para vários projetos privados e comerciais e coloquei o código no GitHub. Muitas pessoas acharam isso útil, contribuíram e corrigiram bugs do projeto, fizeram forks, versões menores e maiores. O resultado é este projeto.
Observação: agora, em 2015, a maioria das principais estruturas possui uma excelente lógica de autenticação de usuário incorporada por padrão. Este não era o caso anos atrás. Então, da perspectiva atual, talvez seja mais inteligente escolher Laravel, Yii ou Symfony para projetos sérios. Mas sinta-se à vontade para experimentar o HUGE, o instalador automático iniciará uma instalação totalmente funcional em minutos e sem qualquer configuração.
E por que o nome "ENORME"? É uma boa combinação com TINY, MINI e MINI2, MINI3, que são alguns dos meus outros projetos mais antigos. Micro frameworks supermínimos para desenvolvimento extremamente rápido e simples de sites simples.
Veja uma demonstração ao vivo da versão 3.0 mais antiga aqui e o phpinfo() do servidor aqui.
Há muito trabalho por trás deste projeto. Posso economizar centenas, talvez milhares de horas de trabalho (calcule isso nos custos do desenvolvedor). Portanto, quando você estiver ganhando dinheiro usando o HUGE, seja justo e devolva algo ao código aberto. HUGE é totalmente gratuito para uso privado e comercial.
Apoie o projeto alugando um servidor na DigitalOcean ou apenas oferecendo um café em BuyMeACoffee.com. Obrigado! :)
Sinta-se também à vontade para contribuir com este projeto.
Licenciado pelo MIT. Totalmente gratuito para projetos privados ou comerciais.
Certifique-se de conhecer os fundamentos da programação orientada a objetos e MVC, ser capaz de usar a linha de comando e ter usado o Composer antes. Este script não é para iniciantes.
Ei, totalmente automático. Por que ? Porque sempre odiei passar dias tentando descobrir como instalar alguma coisa. Isso economizará muito tempo e nervosismo. Doe um café se gostar.
Se você estiver usando o Vagrant para o seu desenvolvimento, basta
vagrant box add ubuntu/trusty64
vagrant up
nessa pasta.5 minutos depois você terá um HUGE totalmente instalado dentro do Ubuntu 14.04 LTS. O código completo será sincronizado automaticamente com a pasta atual. A senha root do MySQL e a senha root do PHPMyAdmin são definidas como 12345678 . Por padrão 192.168.33.111 é o IP da sua nova caixa.
Instalação extremamente simples em um servidor Ubuntu 14.04 LTS típico novo e simples:
Baixe o script do instalador
wget https://raw.githubusercontent.com/panique/huge/master/_one-click-installation/bootstrap.sh
Torne-o executável
chmod +x bootstrap.sh
Execute-o! Reserve alguns minutos para realizar todas as tarefas. E sim, você pode me agradecer mais tarde :)
sudo ./bootstrap.sh
Composer install
na pasta raiz do aplicativo para instalar as dependências"E-mail não funciona"? Veja a solução de problemas abaixo. PENDÊNCIA
Esta é apenas uma orientação rápida para fácil configuração de um ambiente de desenvolvimento!
Certifique-se de ter Apache, PHP 5.5+ e MySQL instalados. Tutorial aqui. O Nginx também funcionará com certeza, mas nenhuma diretriz de instalação está disponível ainda.
Edite o vhost para possibilitar URLs limpos e direcione todo o tráfego para a pasta /public do seu projeto:
sudo nano /etc/apache2/sites-available/000-default.conf
e faça o arquivo parecer
<VirtualHost *:80>
DocumentRoot "/var/www/html/public"
<Directory "/var/www/html/public">
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Habilite o mod_rewrite e reinicie o Apache.
sudo a2enmod rewrite
service apache2 restart
Instale curl (necessário para usar git), openssl (necessário para clonar do GitHub, pois o github é apenas https), PHP GD, a biblioteca gráfica (criamos captchas e avatares) e git.
sudo apt-get -y install curl
sudo apt-get -y install php5-curl
sudo apt-get -y install openssl
sudo apt-get -y install php5-gd
sudo apt-get -y install git
git clone ENORME
sudo git clone https://github.com/panique/huge " /var/www/html "
Instalar o Compositor
curl -s https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
Vá para a pasta do projeto, carregue os pacotes do Composer (--dev é opcional, você conhece o negócio)
cd /var/www/html
composer install --dev
Execute as instruções SQL. Via phpmyadmin ou via linha de comando, por exemplo. 12345678 é a senha de exemplo. Observe que isso está escrito sem espaço.
sudo mysql -h " localhost " -u " root " " -p12345678 " < " /var/www/html/application/_installation/01-create-database.sql "
sudo mysql -h " localhost " -u " root " " -p12345678 " < " /var/www/html/application/_installation/02-create-table-users.sql "
sudo mysql -h " localhost " -u " root " " -p12345678 " < " /var/www/html/application/_installation/03-create-table-notes.sql "
Torne a pasta do avatar gravável (certifique-se de que seja o caminho correto!)
sudo chown -R www-data " /var/www/html/public/avatars "
Se isso não funcionar para você, tente da maneira mais difícil, definindo alternativamente
sudo chmod 0777 -R " /var/www/html/public/avatars "
Remova o arquivo de demonstração padrão do Apache
sudo rm " /var/www/html/index.html "
Edite a configuração do aplicativo em application/config/config.development.php e insira as credenciais do seu banco de dados.
Última parte (não necessária para um primeiro teste): Defina suas credenciais SMTP no mesmo arquivo e defina EMAIL_USE_SMTP como true, para que você possa enviar e-mails adequados. É altamente recomendável usar SMTP para envio de e-mail! O envio nativo via mail() do PHP não funcionará em quase todos os casos (bloqueio de spam). Eu uso SMTP2GO.
Em seguida, verifique o IP/domínio do seu servidor. Tudo deve funcionar bem.
Esta é uma configuração NGINX não testada. Por favor, comente no ticket se você encontrar problemas.
server {
# your listening port
listen 80;
# your server name
server_name example.com;
# your path to access log files
access_log /srv/www/example.com/logs/access.log;
error_log /srv/www/example.com/logs/error.log;
# your root
root /srv/www/example.com/public_html;
# huge
index index.php;
# huge
location / {
try_files $uri /index.php?url=$uri&$args;
}
# your PHP config
location ~ .php$ {
try_files $uri = 401;
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/php-fastcgi/php-fastcgi.socket;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
Muito obrigado ao razuro por esta excelente configuração: coloque isso dentro da sua pasta raiz, mas não coloque nenhum web.config na sua pasta pública.
<?xml version="1.0" encoding="UTF-8"?><configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Imported Rule 1" stopProcessing="true">
<match url="^(.*)$" ignoreCase="false" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
</conditions>
<action type="Rewrite" url="public/index.php?url={R:1}" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
Encontre o ingresso original aqui.
Por padrão, existem dois usuários de demonstração, um usuário normal e um usuário administrador. Para obter mais informações sobre isso, dê uma olhada na parte da função do usuário do pequeno bloco de documentação dentro deste leia-me.
Usuário normal: o nome de usuário é demo2
, a senha é 12345678
. O usuário já está ativado. Usuário administrador (pode excluir e suspender outros usuários): O nome de usuário é demo
, a senha é 12345678
. O usuário já está ativado.
Existem vários arquivos na pasta raiz do projeto que podem ser irritantes:
README e CHANGELOG são autoexplicativos.
Uma documentação real está sendo preparada. Até então, dê uma olhada no código e use os recursos de conclusão de código do seu IDE para ter uma ideia de como as coisas funcionam. É bastante óbvio quando você olha os arquivos do controlador, os arquivos de modelo e como os dados são mostrados nos arquivos de visualização. Lamento muito que ainda não haja documentação, mas o tempo é raro e todos nós fazemos isso de graça em nosso tempo livre :)
Atualmente existem dois tipos de usuários: usuários normais e administradores. São exatamente iguais, mas...
Os usuários administradores podem excluir e suspender outros usuários, eles têm um botão adicional "admin" na navegação. Os usuários administradores têm um valor 7
dentro do campo da tabela do banco de dados user_account_type
. Eles não podem fazer upgrade ou downgrade de suas contas (pois isso não faria sentido).
Usuários normais não possuem recursos de administração, com certeza. Mas eles podem atualizar e fazer downgrade de suas contas (experimente via /user/changeUserRole), que é basicamente uma implementação super simples do conceito de usuário básico/usuário premium. Usuários normais têm um valor 1
ou 2
dentro do campo da tabela do banco de dados user_account_type
. Por padrão, todos os novos usuários registrados são usuários normais com função de usuário 1, com certeza.
Consulte a seção "Testando com usuários de demonstração" deste leia-me para obter mais informações.
Há também uma solicitação pull muito interessante que adiciona funções e permissões de usuário, que não está integrada ao projeto por ser muito avançada e complexa. Mas, isso pode ser exatamente o que você precisa, fique à vontade para tentar.
Para evitar ataques CSRF, a HUGE faz isso da maneira mais comum, usando um token de segurança quando o usuário envia formulários críticos. Isto significa: Quando o PHP renderiza um formulário para o usuário, a aplicação coloca uma "string aleatória" dentro do formulário (como um campo de entrada oculto), gerada via Csrf::makeToken() (application/core/Csrf.php), que também salva esse token na sessão. Quando o formulário é enviado, a aplicação verifica se a solicitação POST contém exatamente o token do formulário que está dentro da sessão.
Este recurso de prevenção de CSRF está atualmente implementado no processo de formulário de login (consulte application/view/login/index.php ) e no processo de formulário de alteração de nome de usuário (consulte application/view/user/editUsername.php ), a maioria dos outros formulários não são de segurança. crítico e deve permanecer o mais simples possível.
Então, para fazer isso com um formulário normal, simplesmente: No seu formulário, antes do botão de envio coloque: <input type="hidden" name="csrf_token" value="<?= Csrf::makeToken(); ?>" />
Então, na ação do controlador, valide o token CSRF enviado com o formulário fazendo:
// check if csrf token is valid
if (!Csrf::isTokenValid()) {
LoginModel::logout();
Redirect::home();
exit();
}
Um grande obrigado a OmarElGabry por implementar isso!
Em teoria: Sim, mas esse recurso não funcionou nos meus testes. Como é um recurso externo, consulte o ticket correspondente para obter mais informações.
Existem alguns recursos incríveis ou ideias de recursos criados por pessoas incríveis, mas esses recursos são de interesse muito especial para serem incluídos na versão principal do HUGE, mas dê uma olhada nestes tickets se estiver interessado:
A ideia deste projeto é fornecer um aplicativo barebone super simples com um sistema completo de autenticação de usuário que funcione bem e estável. Devido à natureza altamente relacionada à segurança deste script, quaisquer alterações significam muito trabalho, muitos testes, captura de casos extremos, etc., e no final passei 90% do tempo testando e corrigindo novos recursos ou novos recursos quebrando os existentes coisas, e fazer isso não é realmente o que alguém quer fazer de graça no raro tempo livre :)
Para manter o projeto estável, limpo e sustentável, gostaria de anunciar o "fim de vida útil" deste projeto, ou seja:
A. HUGE não receberá nenhum recurso novo no futuro, mas... B. correções de bugs e correções serão feitas, provavelmente por anos
Enquanto o HUGE estava em desenvolvimento, havia três regras principais que me ajudaram (e provavelmente a outros) a escrever um código mínimo, limpo e funcional. Pode ser útil para você também:
Conforme observado na introdução deste README, também existem alguns conceitos poderosos que podem ajudá-lo no desenvolvimento de coisas legais: KISS, YAGNI, Feature Creep, Produto mínimo viável.
Para evitar trabalho desnecessário para todos nós eu recomendo a todos que usem o HUGE para projetos simples que só precisam dos recursos que já existem, e se você realmente precisa de uma arquitetura RESTful, migrações, roteamento, 2FA etc, então é mais fácil, mais limpo e mais rápido simplesmente usar Laravel, Symfony ou Zend.
No entanto, aqui estão os possíveis recursos sugeridos pela comunidade, retirados de muitos tickets. Sinta-se à vontade para implementá-los em seus forks do projeto:
Havia dois (!) fóruns de suporte para v1 e v2 deste projeto (HUGE é v3), e ambos foram vandalizados por pessoas que nem leram o leia-me e/ou as diretrizes de instalação. A pergunta mais feita foi "o script não funciona, por favor ajude" sem fornecer nenhuma informação útil (como código ou configuração do servidor ou mesmo a versão usada). Enquanto escrevo estas linhas alguém perguntou via Twitter "como instalar sem o Composer". Você sabe o que quero dizer :) - 99% das perguntas não seriam necessárias se as pessoas tivessem lido as diretrizes, fizessem uma pesquisa mínima por conta própria ou parassem de complicar as coisas desnecessariamente. E mesmo ao escrever respostas detalhadas, a maioria deles ainda estragou tudo, resultando em reclamações e reclamações (para suporte gratuito para um software livre!). Foi simplesmente frustrante lidar com isso todos os dias, especialmente quando as pessoas tomam como certo que é dever dos desenvolvedores de código aberto fornecer suporte detalhado, gratuito e pessoal para cada solicitação de "ajuda, por favor".
Então decidi interromper completamente qualquer suporte gratuito. Para perguntas sérias sobre problemas reais dentro do script, use o recurso de problemas do GitHub.
Palavras duras, mas como basicamente todo projeto público de internet é assediado, vandalizado e trollado hoje em dia por pessoas muito estranhas, é necessário: Algumas regras simples.
Respeite que este é apenas um roteiro simples escrito por voluntários não remunerados em seu tempo livre. Este NÃO é um software empresarial que você comprou por US$ 10.000. Não há razão para reclamar (!) do software de código aberto gratuito. A atitude contra o software livre é realmente frustrante hoje em dia, as pessoas consideram tudo garantido sem perceber o trabalho por trás disso e o fato de obterem software sério totalmente de graça, economizando milhares de dólares. Se você não gosta, então não use. Se você quiser um recurso, tente participar do processo, quem sabe até construí-lo sozinho e adicioná-lo ao projeto! Seja gentil e respeitoso. Críticas construtivas com certeza são sempre bem vindas!
Não ataque, não odeie, não envie spam, não vandalize. Por favor, não peça suporte pessoal gratuito, não pergunte se alguém poderia fazer o seu trabalho por você. Antes de perguntar algo, certifique-se de ter lido o README, seguido todos os tutoriais, verificado novamente o código e tentado resolver o problema sozinho.
Trolls e pessoas muito irritantes serão banidos/bloqueados permanentemente. O GitHub tem uma equipe antiabuso muito poderosa.
Por favor, comprometa-se apenas no ramo de desenvolvimento . O branch master sempre conterá a versão estável.
Scrutinizer (ramo mestre), Scrutinizer (ramo de desenvolvimento), Code Climate, Codacy, SensioLabs Insight.
Devido às possíveis consequências ao publicar um bug em um projeto público de código aberto, peço gentilmente que você envie bugs realmente grandes para meu endereço de e-mail, e não poste aqui. Se o bug não for interessante para os invasores: Sinta-se à vontade para criar um problema normal no GitHub.
Veja os problemas ativos aqui: https://github.com/panique/huge/issues?state=open
Questão interessante: quando um usuário acessa seu site, o navegador do usuário também solicitará um ou mais (!) favicons (tamanhos diferentes). Se esses arquivos estáticos não existirem, seu aplicativo começará a gerar uma resposta 404 e uma página 404 para cada arquivo. Isso desperdiça muita energia do servidor e também é inútil, portanto, certifique-se de sempre ter favicons ou lidar com isso no nível Apache/nginx.
HUGE tenta lidar com isso enviando uma imagem vazia no cabeçalho do view/_templates/header.php !
Mais informações sobre este ticket: Retorne 404 adequado para favicon.ico ausente, imagens ausentes, etc.
Mais aqui no Stackflow: Como evitar solicitações de favicon.ico? Não é bobagem que um pequeno favicon exija mais uma solicitação HTTP? Como fazer o favicon virar um sprite?.
Também estou blogando no Dev Metal .