Observe que este projeto não é mais mantido ativamente.
Este projeto começou como um simples trabalho escolar para um curso de PHP que eu estava cursando. Aí eu precisava desse tipo de sistema para um site que estava fazendo e resolvi começar a expandir. Aviso: Este projeto é/será muito opinativo, o que significa que adicionarei apenas recursos que eu mesmo considero úteis ou interessantes o suficiente para serem desenvolvidos.
password_hash()
do PHP para fazer hash e salgar as senhas. Os nomes de usuário são salvos como texto simples.PASSWORD_DEFAULT
que no momento da escrita usa BCRYPT.Também conhecido como 'Por que existem tantos arquivos?'
O painel de administração estará aqui. Da mesma forma que muitos outros aplicativos da web (como WordPress), o painel de administração pode ser facilmente acessado digitando [host]/admin .
Esta pasta inclui dois arquivos que são usados para definir algumas opções de configuração. Mais informações abaixo.
Apenas algumas novidades CSS para a UI.
O instalador automático reside aqui.
Esta pasta contém todos os arquivos .js necessários para o funcionamento da interface do usuário.
Esta pasta inclui a espinha dorsal do sistema. Possui arquivos .php para conexão ao banco de dados, login e logout, registro/criação de uma nova conta e modificação de contas existentes. Há também o scripts.js que possui algumas vantagens gerais do JavaScript para a interface do usuário. Você precisa inserir as informações do seu banco de dados em credenciais.php, verifique a seção de configuração abaixo para obter ajuda.
Você deve ler isto antes de usar isso. É apenas uma licença normal do MIT.
Este arquivo.
Esta é a página de gerenciamento de contas. Os usuários podem alterar seu nome de usuário e senha aqui.
Este arquivo está aqui apenas para demonstração. Os usuários só poderão acessar esta página se estiverem logados. Caso contrário, serão redirecionados para a página de login.
Minha opinião sobre a criação de um formulário de login simples com Bootstrap. Sinta-se à vontade para modificá-lo para atender às suas necessidades.
Minha opinião sobre a criação de um formulário de registro simples com Bootstrap. Sinta-se à vontade para modificá-lo para atender às suas necessidades.
Isso é usado pelo instalador automático para se remover após a conclusão da instalação.
Esta é a lista das palavras mais comuns em inglês. É usado pelo sugeridor de nome de usuário. Você pode substituir a lista pelo seu próprio arquivo .txt. Cada palavra da lista precisa ser seguida por uma quebra de linha.
Observe que as opções de configuração estão sujeitas a alterações. Volte sempre.
Se você verificar a pasta /config, notará que há dois arquivos diferentes lá. O que dá? O arquivo de configuração principal é config.php . Inclui configurações que são aplicadas no nível do servidor. Você deve editar principalmente este arquivo.
Se você também estiver usando a interface de usuário front-end que forneço, você também pode/deve editar config.js. Lá você pode gerenciar a aparência das coisas para o usuário médio. Lembre-se de que essas configurações são apenas do lado do cliente e não são aplicadas de forma alguma, portanto podem ser editadas pelos usuários.
Nome da opção | Descrição | Valor padrão | Valores suportados |
---|---|---|---|
$disableUserSelfRegistration | Impedir que usuários se registrem | falso | Booleano |
$nomedeusuarioMinLength | Nome de usuário permitido mais curto | 3 | 1 -> |
$nomedeusuárioMaxLength | Nome de usuário permitido mais longo | 30 | 1 -> |
$senhaMinComprimento | Comprimento mínimo das senhas | 8 | 1 -> |
$nomedeusuárioRegExp | Todos os nomes de usuário devem corresponder a esta expressão regular | qualquer regExp | |
$passwordRegExp | Todas as senhas devem corresponder a esta expressão regular | qualquer regExp | |
$newAccountAccessLevel | Útil para criar sua primeira conta de administrador | "usuário" | "usuário", "administrador" |
$debugMode | Permite desabilitar a conexão do banco de dados (somente para depuração) | "não" | "não" |
$debugAdminNome de usuário | Permite que você faça login no modo de depuração | "administrador" | qualquer sequência |
$debugAdminSenha | Permite que você faça login no modo de depuração | "" | qualquer sequência |
$debugSkipInstall | Isto é apenas para fins de depuração | falso | falso |
$tempo limite | Tempo de inatividade (em segundos) necessário para desconectar o usuário | 900 | qualquer número inteiro |
$adminPanelTimeout | Tempo de inatividade necessário para desconectar o usuário do painel de administração | 450 | qualquer número inteiro |
$ mensagens de erro | Mostrar mensagens de erro mais detalhadas. Pode haver vazamento de informações confidenciais! | padrão | "padrão","detalhado" |
$allowUsernameChange | O usuário deve poder alterar seu nome de usuário | verdadeiro | Booleano |
$forceHTTPS | Redireciona todas as conexões não HTTPS para HTTPS e envia HSTS | falso | Booleano |
Em 2019, é considerado um grande risco de segurança não usar HTTPS ao lidar com qualquer tipo de informação sensível (como senhas). É por isso que é altamente recomendável usar apenas soluções de hospedagem que suportem isso e alterar esta opção para verdadeira. Hoje em dia você pode até obter o certificado SSL totalmente gratuito no Let's Encrypt, então não há motivos para não usá-lo. No entanto, em alguns ambientes (mal configurados) SERVER["HTTPS"] superglobal não é definido mesmo quando HTTPS é de fato usado. Isso resulta em um ciclo interminável de redirecionamento. Eu mesmo aprendi isso da maneira mais difícil.
Nome da opção | Descrição | Valor padrão | Valores suportados |
---|---|---|---|
desativarUserSelfRegistration | Desativa quaisquer elementos da UI relacionados ao registro | falso | verdadeiro, falso |
nome de usuárioMinLength | Nome de usuário mais curto que a IU aceita | 3 | 1 -> |
nome de usuárioMaxLength | Nome de usuário mais longo que a IU aceita | 30 | 1 -> |
senhaMinLength | Senha mais curta que a UI aceita | 8 | 1 -> |
nome de usuárioRules | Esta string é mostrada se o nome de usuário não corresponder ao regExp | qualquer sequência | |
regras de senha | Esta string é mostrada se a senha não corresponder ao regExp | qualquer sequência | |
enableUsernameSuggestions | Permite desativar ou ativar sugestões de nome de usuário | verdadeiro | Booleano |
permitirUsernameChange | O usuário deve poder alterar seu nome de usuário (somente UI) | verdadeiro | Booleano |
enableLoginMessage | Exibir qualquer mensagem na página de login | falso | Booleano |
mensagem de login | Defina a mensagem a ser mostrada quando enableLoginMessage for verdadeiro | "" | qualquer sequência |
Conforme afirmado anteriormente, você precisará de um banco de dados MySQL. O banco de dados não requer muito espaço (a menos que você tenha MUITOS usuários) e qualquer versão relativamente recente do MySQl deve funcionar. Você pode configurar seu banco de dados e criar uma conta de administrador manualmente ou pode usar meu instalador automático.
Durante a primeira etapa da instalação, o instalador precisa gravar um arquivo na unidade do seu host. Se você não tiver as permissões adequadas para isso, deverá fazer a instalação manualmente. Veja as instruções abaixo.
users
com cinco colunas: username
, password
, accessLevel
, lastLogin
e rememberMeToken
. Use um tipo de dados de string como CHAR. Eu pessoalmente gosto de usar VARCHAR. Para o lastLogin
eu recomendo INT(11). Eu também adicionaria um campo de ID de incremento automático como chave primária, mas isso não é estritamente necessário.Se você estiver usando VARCHAR ou outro tipo de dados com comprimento máximo de string variável, a tabela abaixo será útil.
Campo | Comprimento necessário (mínimo) |
---|---|
nome de usuário | O mesmo que $usernameMaxLength em config.php |
senha | Eu recomendo usar 255 por segurança (já que o método de criptografia padrão do PHP pode mudar) |
nível de acesso | 5 |
último Login | 11 |
lembre-seMeToken | 255 |
Não se preocupe, algo assim deve ajudá-lo:
CREATE TABLE IF NOT EXISTS users (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
username VARCHAR ( 64 ) NOT NULL UNIQUE,
password VARCHAR ( 255 ) NOT NULL ,
accessLevel VARCHAR ( 10 ) NOT NULL ,
lastLogin INT ( 11 ),
rememberMeToken VARCHAR ( 255 )
);
Depois de configurar o banco de dados, você precisará criar sua primeira conta de administrador. Existem duas maneiras de fazer isso:
admin
e uma senha gerada aleatoriamente. (Se você seguiu meu exemplo SQL acima e definiu a restrição UNIQUE para o campo nome de usuário, a conta não será criada se já existir. Você não receberá mensagem de erro) Depois de criar a conta de administrador, você deve remover (ou renomeie) a pasta /install. Por fim, faça login na conta recém-criada e altere a senha usando a página de gerenciamento de contas.OU
$newAccountAccessLevel
em config/config.php para "admin" e então criar uma nova conta usando o formulário de registro normal. Você precisa remover a pasta /install para poder acessar a página de login. Lembre-se de alterar o valor novamente para “usuário” posteriormente.IMPORTANTE! Lembro novamente que você DEVE excluir a pasta /install antes de usá-la no ambiente de produção ao vivo. Caso contrário, qualquer pessoa poderá ver as credenciais do seu banco de dados!
Após a configuração você pode criar novas contas (admin ou normal) usando o painel de administração.
Isso significa que o instalador percebeu que a função random_bytes(int)
não existe ou não funciona corretamente. Se você estiver usando uma versão do PHP anterior a 7.0, deverá usar uma biblioteca de terceiros que implemente essa função. Para PHP 5.x eu recomendo este.
O padrão do MySQL é 3306.
Isso acontece quando o assistente não consegue se remover. Isso geralmente é causado por algumas permissões restritivas no host. Corrija o problema removendo manualmente a pasta /install.
Verifique dicas de solução de problemas nas perguntas frequentes gerais abaixo.
O painel de administração está em um estágio inicial de desenvolvimento. Muitas coisas podem estar quebradas.
Mais serão adicionados no futuro.
/administrador
Leia config.php com mais atenção.
Isso significa que ocorreu PDOException
ao tentar conectar-se ao banco de dados. Você pode ativar mensagens de erro mais detalhadas em /config/config.php . As causas mais comuns são:
PDO_MYSQL
não está disponível ou configurado corretamente.PDO_MYSQL
. Não, não importa e já faz muito tempo, eu sei. Estou planejando chegar lá em breve™. Atualização: está funcionando agora. Observe que ele só lembra o login por 30 dias (por motivos de segurança).
Sim, eu sei que implementar algo assim sempre abre novas brechas de segurança. No entanto, não estou forçando os usuários a usá-lo nem nada. Se o usuário não marcar a caixa de seleção, nenhum token de acesso será criado, portanto não haverá risco de segurança para esse usuário.
random_bytes()
criptograficamente segura. Esse token é salvo no banco de dados e dois cookies são enviados ao navegador. O valor do primeiro cookie é o nome de usuário do usuário em texto simples. O segundo cookie é muito mais importante. Seu valor é o token criado.O principal problema é que, se "o bandido" conseguir de alguma forma obter acesso ao token do usuário, ele poderá facilmente forjar um cookie e fazer login como esse usuário. Existem duas maneiras de o bandido obter acesso ao token do usuário: obtendo-o de alguma forma (por exemplo, injeção de SQL) do banco de dados ou roubando o cookie e/ou seu valor do usuário.
Considero isso um risco à segurança, pois algumas pessoas estariam inclinadas a usar senhas muito simples ou iguais. No entanto, posso permitir isso em versões futuras por meio de uma opção de configuração.