AD ative PHP. Como criar sua própria página de registro no WordPress Multisite

Permite usar uma configuração WordPress para vários sites ao mesmo tempo. Ao mesmo tempo, cada site recebe suas próprias tabelas no banco de dados com um prefixo exclusivo.

Tabelas com dados de usuários registrados Comum para todos os sites de rede. Este é um certo mais e registrar um dia você pode acessar vários sites. Além disso, em cada site, a mesma conta pode ter direitos diferentes. Por exemplo, em um site, o usuário pode ser o editor e em outro administrador.

Na instalação usual Página do Wordpress. Registro, Redefinição de Autorização e Senha Exibe o arquivo WP-Login.php.

  • wP-Login.php - Autorização
  • wP-Login.php? Ação \u003d Registro - Registro
  • wP-Login.php? Ação \u003d LostPassword - redefinição de senha

No modo multisite, o kernel do WordPress começa a se comportar um pouco de forma diferente e ao alternar para o link WP-Login.php? Ação \u003d Registar receberá um redirecionamento no WP-signup.php. Esta é a página de registro da sua rede, que é padrão no WordPress.

Além de registrar contas de usuário ordinárias, você pode criar um novo site sobre ele se o superministro tiver ativado tal oportunidade nas configurações de rede (configurações de rede).

Na maioria dos tópicos, a página de registro não parece muito boa. Muitos temas são usados \u200b\u200bpelos quadros CSS, como Bootstrap, e suas próprias classes específicas para a estilização de diferentes elementos nas páginas, por isso é difícil escrever um único HTML que será adequado para todos.

Mas você não deve se desesperar se a página parecer desarrumada. O arquivo WP-Signup.php é uma ótima coisa no começo, quando não há tempo para resolver cada parte do site - você pode se concentrar em outro mais páginas importantes e conteúdo.

Quando você estará pronto para fazer o seu página O registro, wp-signup.php será uma boa amostra e um exemplo em que é fácil entender o espectro de funções que o WordPress fornece processamento e verificação de dados inseridos pelos usuários e criar novas contas.

Rede do site principal

Por padrão, o WordPress abre a página de registro (WP-Signup.php) na rede de domínio principal (site). No entanto, você pode criar páginas de registro para cada site de rede, mesmo que tenham tópicos.

Vamos considerar o caso quando um tópico é usado em todos os sites de rede, mas há uma página de registro em cada uma delas. Os sites diferem na língua (inglês e russo), portanto, a página de registro será exibida no site de idioma "nativo". Se os sites usarem tópicos diferentes, tudo dependerá de quais tópicos que vão se adequarem a mesma layout (uma excelente situação que pode impulsioná-lo para unificar todos os seus tópicos) ou vale a pena descobrir as páginas individualmente.

Alternativa às funções.php.

Ordem em arquivos

Mu-plugins podem conter qualquer número de arquivos e uma estrutura que pareça lógica para você. Eu aderir a essa hierarquia:

| Mu-plugins | | Load.php | | Selena-Network | | | Inscreva-se | | | | plugin.php | | | ... | | | jetpack | | | | plugin.php.

No arquivo load.php, traduções e todos os "plugins" necessários estão conectados:

// Carregando Transferências para Mu-plugins Load_Muplugin_TextDomain ("SELENA_NETWORK", "/ Selena-Rede / Idiomas /"); // funcional para página de registro requer wpmu_plugin_dir. "/selena-network/signup/plugin.php"; // Outro plugin // exige wpmu_plugin_dir ...

Dentro do diretório Selena-Network, as pastas plug-in são armazenadas. Cada um tem seu próprio plugin.php, que nos conectamos no Load.php. Dá flexibilidade e a capacidade de desativar e ativar instantaneamente componentes separados No projeto de trabalho em caso de emergência.

Página de inscrição.

Tendo entendido com onde e como vamos escrever código, você pode ir para a criação da página de registro.

Crie uma página com um exemplo.org/signup/ através da interface usual. Como endereço, você pode usar qualquer URL que pareça adequado para o seu projeto.

Redirecionar para a página de registro desejada

Para o WordPress para descobrir sobre nossa nova página de registro e fez um redirecionamento nele, ao clicar no link "Register", o filtro WP_SIGHUP_LOCEÇÃO é usado. Pode ser encontrado dentro do WP-Login.php e é aquele que é responsável pelo redirecionamento no padrão WP-Signup.php.

Caso "Registrar": if (is_multisite ()) (wp_redirect (apply_filters ("wp_signup_location", network_site_url ("wp-signup.php")); sair; // ...

Como você se lembra, por padrão, a página de registro abre no domínio principal da rede. É por isso que a rede_site_url () é usada aqui.

Adicione seu manipulador de filtro a MU-plugins / Selena-Network / Signup / Plugin.php, que receberá o endereço da página de registro no site atual:

Função selena_network_signup_page ($ URL);) add_filter ("wp_signup_location", "selena_network_signup_page", 99);

sELENA_NETWORK - Prefixo, que eu uso nos nomes de todas as funções dentro dos MU-plugins no meu site para evitar conflitos, deve ser substituído por seu próprio prefixo exclusivo. A prioridade de adicionar o Filtro 99, porque alguns plugins, como BBPress e BuddyPress, podem sobrescrever esse endereço para o seu próprio (plugins MU são carregados anteriormente do que os plugins convencionais, vêem acima).

Por favor, note que é usada home_url (), que, ao contrário do Network_Site_Url (), fornece o endereço do site atual e não o site da rede principal.

Funcionalidade WP-Signup.php

O arquivo WP-Signup.php contém um grande número de funções e código. Para ver a imagem como um todo, você pode usar o código dobrável. Como regra, em inglês é chamado de "Código dobrável".

No início do arquivo de 1 a 80, a linha (na versão 4.1.1), várias verificações são feitas e produzindo a página "Iniciar" usando Get_Header ().

Em seguida, muitos métodos são declarados e antes de começarmos a trabalhar com eles, vale a pena entender o que faz com que cada função. Dentro, muitos deles são frequentemente usados \u200b\u200boutras funções com o prefixo WPMU_, todos eles são declarados no arquivo WP-Inclui / MS-Functions.php. Esta seção é difícil de entender sem ver o código você mesmo. Abaixo de uma pequena descrição das funções básicas caso você tenha dificuldade.

  • wpmu_signup_stylesheet () - Saída de CSS adicionais na página de registro.
  • show_blog_form () - Campos para registro do site (endereço, visibilidade de nome para mecanismos de pesquisa).
  • validate_blog_form () - Verificando o endereço e nomes do site inseridos usando WPMU_Validate_blog_signup ().
  • show_user_form () - campos para registrar o usuário (login e endereço de e-mail).
  • validate_user_form () - Verificação do login inserido e endereços. Mail com wpmu_validate_user_signup ().
  • assinatura_another_blog () - Campos para registrar novos sites usando show_blog_form () para usuários que já estão registrados no site.
  • validate_another_blog_signup () - verifica o endereço do site e o nome usando validate_blog_form ().
  • assinar_User () é a principal função para produzir o campo da página de registro.
  • validate_user_signup () - verifica o endereço de login e e-mail. Mail com validate_user_form ().
  • signup_blog () - Campos para inserir o endereço, nome e visibilidade do site (segunda etapa de registro) usando show_blog_form ().
  • validate_blog_signup () - verifica o login, endereço de e-mail. Mail, endereço e nome do site.

Na parte inferior do arquivo WP-Signup.php (de 646 costura na versão 4.1.1), a lógica principal da página de registro, que usa os métodos acima. Esta parte do código não é submetida à função. No final, get_footer () é chamado.

Copie o wp-signup.php funcional

Em seguida, o procedimento para copiar um wp-signup.php em mu-plug-ins será descrito e fazendo alterações no Garfo. Pode não parecer o caminho certo. Em vez disso, você pode escrever suas funções a partir do zero para verificar e enviar formulários usando classes, não funções convencionais. Na minha opinião, o WP-Signup.php já tem toda a lógica necessária para nossa página, permanece apenas para fazer pequenas alterações.

Ao atualizar o WordPress, o WP-Signup.php muda de vez em quando, mas isso não significa que, com cada versão terá que sincronizar seu "FORC". Funções dentro do WP-Signup.php são essencialmente envolvidas pela saída HTML, verificação de dados, criação de contas e sites estão envolvidas no prefixo WPMU_, declarado em MS-Functions.php.

Vamos criar uma função que exibirá o formulário de inscrição na página. Para fazer isso, copie o WP-Signup.php da raiz WordPress em Mu-plugings / Selena-Network / Signup /. Conecte-o dentro de Mu-Pugins / Selena-Network / Signup / Plugin.php).

Exigir wpmu_plugin_dir. "/selena-network/signup/wp-signup.php";

Excluir todas as verificações exigem e desnecessárias a partir do início do arquivo copiado. Na versão 4.1.1, este é o código inteiro de 1 a 80 linhas.

Agora estamos prontos para criar a função principal para exibir o formulário de inscrição. Para fazer isso, toda a lógica da linha 646 e para o final do arquivo, seremos transferidos para a função chamada selena_network_signup_main. No final, você exclui dois fechamentos desnecessários

(linhas 722 e 723), bem como a chamada get_footer ().

No recém-criado selena_network_signup_main () No começo, declararemos a variável global Active_Signup que todos os outros métodos deste arquivo usam. E adicione a chamada de evento antes_signup_form, que nós excluíamos desde o início do arquivo.

Função selena_network_signup_main () (global $ Active_signup; do_action ("befor_signup_form"); // ...)

Agora permanece apenas para alterar o layout em todos os lugares onde é necessário e a página de registro está pronta.

Saída do formulário de inscrição

Existem pelo menos duas opções aqui. Uma maneira mais conveniente de criar um shortcode e colocá-lo na página através do editor usual.

// Criar um Network_SignUp Add_ShortCode Shortcode ("Network_signup", "selena_network_signup_main");

A segunda opção é criar uma página Página-Signup.php na pasta Tema da filha. Em vez da palavra "inscrição", você pode usar um ID exclusivo atribuído à página. Dentro do modelo, adicione o layout requerido e faça um seletique selena_network_signup_main () no lugar certo.

Como resultado, minha página de registro começou a parecer muito melhor e mais limpa.

Página de ativação

Por padrão, o WordPress divide convencionalmente o processo de registro em multisite para duas etapas - preenchendo o formulário no site e ativação da conta quando o link é enviado para o exilado letra eletrônica. Depois de preencher o formulário criado na seção anterior, o WordPress envia uma carta com uma pequena instrução e referência para ativar a conta.

Para a saída da página de ativação, o arquivo WP-Activate.php é atendido localizado no diretório raiz do WordPress. Wp-ativate.php também pode ser completamente alterado. O processo é semelhante ao que já fizemos para WP-Signup.php.

Crie o exemplo.org/activate / Page através da interface normal. Como endereço, use qualquer URL que pareça adequado para você.

Copie o arquivo WP-Activate.php para seus plugins MU e conecte-o a mu-pugins / selena-rede / inscrição / plugin.php.

Exigir wpmu_plugin_dir. "/selena-network/signup/wp-ative.php";

No interior, não tantos conteúdos, ao contrário do WP-Signup.php. O arquivo realiza uma única operação - ativa a conta se a tecla correta for obtida e exibir uma mensagem de erro ou uma operação bem-sucedida.

Exclua todas as verificações desnecessárias e exigem - de 1 a 69 linha no WordPress 4.1.1. No final, remova a chamada get_footer (). O conteúdo restante transferindo para a função selena_network_activate_main ().

É interessante notar que a constante WP_INSTALLING foi anunciada aqui antes de carregar o WordPress (WP-load.php). Sua presença faz com que o WordPress não carregue plugins.

Como no caso da página de registro, permanece apenas para corrigir o layout onde é necessário. Você também pode alterar o texto das mensagens exibidas (neste caso, não se esqueça de adicionar um domínio de texto de seus plugins MU a todos os tradutores de função, ele não está instalado em nenhum outro lugar).

A função acabada pode ser usada em uma página predeterminada por meio de um shortcode ou um modelo separado em uma subsidiária.

Letras de ativação com referências adequadas

A página de ativação está pronta para funcionar, mas o WordPress não sabe sobre isso e ainda enviará cartas de ativação com referência a WP-Active.php. Ao contrário do WP-Signup.php, não há filtro, o que permitiria alterar o endereço. Em vez disso, você precisa escrever seu recurso que enviará letras com links corretos.

No momento do preenchimento e envio de um formulário na página registro Wordpress. Chama wpmu_signup_ do utilizador.() ou wpmu_signup_ blog.() Dependendo do tipo de registro. Ambas as funções criam uma nova entrada na tabela WP_SignUps, preenchendo-a com o conteúdo necessário, entre os quais existe uma chave de ativação da conta.

Depois, dependendo da função, WPMU_SIGUP_ é chamado do utilizador._Notificação () ou wpmu_signup_ blog._Notificação (). Ambas as funções têm funcionalidade semelhante - geram e enviam uma carta com uma referência de ativação, mas tome diferentes argumentos. Em ambos, há filtros para "interceptação" de eventos.

If (! Aplicar_filters ("WPMU_SIGHUP_USER_NOTIFICAÇÃO", $ User, $ user_Email, $ Key, $ meta)) Retornar falso;

Para ativar contas com a criação de blogs:

If (! Apply_Filters ("WPMU_SIGHUP_BLOG_NOTIFICAÇÃO", $ domain, $ Caminho, $ title, $ user, $ user_email, $ tecla, $ meta)) (retorno false;)

Ele permanece apenas para escrever seus manipuladores dentro do qual você envia letras via wp_mail (), e no final necessariamente para dar false para que o WordPress não envie uma carta de ativação duas vezes - uma das suas, outra - carta por padrão com um link para Wp-ativate.php.

Função SELENA_NETWORK_WPMU_SIGHUP_USER_NOTIFICAÇÃO (USER USER, $ USER_EMAIL, $ Key, $ meta \u003d array ()) (// gera um cabeçalho, texto e cabeçalhos de texto // // // enviar uma carta ou adicionar uma tarefa cron para enviar uma carta WP_MAIL ($ User_Email, WP_SpecialChars_Decode ($ Assunto), $ Mensagem, $ Message_Headers); // Recuperar falso para que o WordPress não envie uma letra de ativação duas vezes retornar false;) add_filter ("wpmu_signup_uver_notification", "selena_network_wpmu_signup_user_notification", 10, 4) ;

Se você enviar cartas através do servidor SMTP ou o número de registros for muito grande, você deve pensar em não enviar cartas instantaneamente. Em vez disso, você pode adicionar tarefas de cron usando o WordPress CRON.

Feche o acesso ao WP-signup.php e WP-Activate.php

Tendo criado suas próprias páginas de registro e ativação, pode ser necessário fechar os "originais". Por exemplo, se houver campos adicionais na página de registro, que deve ser preenchido. Além disso, muitos sites WordPress estão expostos a registros de spam.

Resolver dois problemas com uma ação pode ser perguntado pelo Apache para dar 404 no caso de tentar abrir essas páginas. Para fazer isso, você só precisa registrar um par de rewriterule adicional ao seu arquivo de configuração ou.htaccess.

RewriteEngine no RewriteBase / # Conhecimento de expressões regulares nunca será supérfluo :) Rewriterule ^ wp-signup \\ .php - rewriterule ^ wp-ativate \\ .php - # Comece o WordPress # Regras do WordPress Por padrão Não toque :) # .. . # Fim do wordpress.

Conclusão

Para isso e muitos outros "problemas" associados ao WordPress na Internet existem muitas soluções. Por exemplo, para criar páginas de registro e ativação, alguns são oferecidos para reescrever o original WP-signup.php e wp-active.php. Isso não deve ser feito porque, no caso da atualização do WordPress, você perderá todas as alterações feitas em arquivos, e não poderá, verificar a integridade do kernel usando.

Ao desenvolver qualquer adição, tópicos ou soluções devem ser gastos algum tempo para lidar com o que está acontecendo dentro do WordPress. Existem muitas ferramentas úteis de depuração para isso.

P.S.

Para atribuir automaticamente funções diferentes, novos usuários podem usar o plugin de gerenciamento de usuários multisite.

Se você tiver alguma dúvida ou dificuldade durante a criação de páginas de registro e ativação após ler o artigo, deixe um comentário e responderemos.

27.03.2015 27.03.2015

Desenvolvedor de WordPress. Ele ama pedir em tudo e lidar em novas ferramentas. Inspirado pela arquitetura dos componentes do symfony.

  • Crie sua própria página de registro para multisite em vez de padrão WP-signup.php.

    Em comum instalação Wordpress. A página de registro (autorização, redefinição de senha) exibe o arquivo WP-Login.php.

    • /wp-login.php - Autorização.
    • /wp-login.php?action\u003dRegister - Registro.
    • /wp-login.php?action\u003dlostpassword - redefinição de senha

    Para multisite no wp-login.php existem condições separadas. Então, quando você clica no link /wp-login.php?action\u003dRegister no Multisaite, o WordPress fará um redirecionamento para a página /wp-signup.php. Em muitos tópicos, a página não parece muito atraente, então vamos fazer o nosso.

    Rede do site principal

    Por padrão, o WordPress abre a página de registro (WP-Signup.php) na rede de domínio principal (site). No entanto, você pode fazer uma página de registro separada para cada site de rede, mesmo que tenham tópicos diferentes. Vamos considerar o caso quando em todos os sites de rede tiverem sua própria página de registro, mas o mesmo tópico é usado e os sites diferem apenas no idioma. Se forem usados \u200b\u200btópicos diferentes, você precisará escrever mais código.

    funções.php?

    Não. O nome deste arquivo parece ser mencionado em qualquer artigo sobre o WordPress. No nosso caso, levando em conta o fato de que a funcionalidade de registro é projetada para vários sites, faz sentido levá-lo em plugins que são carregados ao abrir qualquer site.

    Digressão lírica

    Vale a pena notar que os plugins são carregados anteriormente do que os plug-ins comuns e até que o kernel do WordPress seja totalmente baixado, para que a chamada para algumas funções possam levar a erros do FATABAL no PHP. Similar "cedo" download tem suas vantagens. Digamos que dentro de qualquer tema não puder ser apegado a alguma ação que é desencadeada antes de baixar o arquivo functions.php do tópico. Um exemplo disso pode servir como um plugin JetPack_Module_Loaded_Related (posts relacionados - o nome do módulo) com o qual é possível rastrear a atividade de módulos no jetpack. É impossível "embreagem" do arquivo tópico para esta ação, porque a ação já funcionou antes de carregar o tópico - os plugins são carregados anteriormente. Você pode dar uma olhada na imagem comum da ordem de inicialização do WordPress na página de referência de ação no código.

    Ordem em arquivos

    Mu-plugins podem conter qualquer número de arquivos e qualquer gráfico, que parecerá lógico para você. Eu aderir a essa hierarquia:

    | -Mu-plugins | - | load.php | - | - | Selena-Network | - | - | - | - - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | -... | - | - | - | -JetPack | - | - | - | - | - - -plugin.php

    No arquivo Load.php, todos os "plugins" necessários estão conectados à nossa rede:

    Load Traslates para todos os addons load_muplugin_textdomain ("selena_network", "/ selena-rede / idiomas /"); // inscrição de rede requer wpmu_plugin_dir. "/selena-network/signup/plugin.php"; // Outro plugins // requer wpmu_plugin_dir ...

    Dentro da pasta Selena-Network, as pastas plug-in são armazenadas, cada uma tem seu próprio plugin.php, que nos conectamos no Load.php. Dá flexibilidade e a capacidade de desativar e incluir rapidamente algumas coisas.

    Endereço da página de registro

    Para especificar o endereço da página de registro, use o filtro WP_SignUp_Location. Ele pode ser encontrado dentro do arquivo WP-Login.php e é ele quem é responsável pelo redirecionamento no WP-Signup.php.

    Caso "Registrar": if (is_multisite ()) (wp_redirect (apply_filters ("wp_signup_location", rede_site_url ("wp-signup.php")); sair;

    Adicione seu recurso em Mu-plugins / Selena-Network / Signup / Plugin.php, que dará o endereço da página de registro no site atual:

    Função selena_network_signup_page ($ URL) (retorna home_url (). "/ Signup /";) add_filter ("wp_signup_location", "selena_network_signup_page", 99);

    sELENA_NETWORK - Prefixo, que eu uso nos nomes de todas as funções dentro dos MU-plugins no meu site para evitar conflitos, deve ser substituído por seu próprio prefixo exclusivo. A prioridade de adicionar o Filtro 99, porque alguns plugins, como BBPress e BuddyPress, podem sobrescrever esse endereço para o seu próprio (plugins MU são carregados anteriormente do que os plugins convencionais, vêem acima). Por favor, note que a casa_url () é usada, em vez de rede_site_url (), para deixar o visitante no mesmo domínio. Você pode usar qualquer URL como endereço.

    Criando uma página

    Agora vamos criar uma página com site.com/signup/ através de uma interface regular e no modelo de pasta da filha-sujeito para nossa nova página - página-assinar.php. Em vez da palavra "inscrição", você pode usar um ID exclusivo.

    Dentro do novo modelo, você deve ligar para a função selena_network_signup_main (), que exibirá o formulário de inscrição.

    Vale a pena notar que todo o processo com modelos não é necessário e, em vez disso, você pode criar seu próprio shortcode, que também ligará para a função selena_network_signup_main ().

    wp-signup.php e wp-ativate.php

    Agora vamos criar uma função que exibirá o formulário de inscrição. Para fazer isso, copie os arquivos wp-signup.php e wp-active.php a partir da root wordpress em mu-bugs / Selena-Network / Signup / (e não se esqueça de conectá-los dentro de Mu-plugins / Selena-Network / Inscrição / plugin.php). Outras manipulações com arquivos são extremamente difíceis e longas para descrever, então venha para torná-los você mesmo. Eu só descreverei o que precisa ser feito exatamente e publicar os arquivos de origem do seu projeto:

    1. No início do arquivo, exclua todas as funções de chamadas e outras funções externas do código.
    2. Renomear todas as funções adicionando prefixos exclusivos aos nomes.
    3. A parte inferior do código WP-Signup.php é envolta na função SELENA_NETWORK_SIGHUP_MAIN e, em seu início, iniciar a gravação global $ Active_Signup; .
    4. Substitua o layout por conta própria nos lugares certos.

    Dentro wp-active.php você precisa fazer sobre o mesmo:

    1. Exclua todas as funções externas do código, envolva o layout em uma função separada.
    2. Altere o layout em lugares onde é necessário.

    O arquivo WP-Activate.php é responsável pela página de ativação da conta. Tal como acontece com a página de registro, você precisa criar um modelo separado para dentro da qual chamar uma função no arquivo WP-Active.php.

    Nós enviamos as letras de ativação

    A página de registro envia uma carta ao visitante com referência à ativação da conta. Por padrão, esta é a função wpmu_signup_user_notification () no arquivo MS-Functions.php. Sua funcionalidade pode ser emprestada por sua função. A razão pela qual você deseja recusar a utilização desta função - envia uma referência de ativação da conta com WP-Active.php. Você pode desativar esse recurso usando o filtro WPMU_SignUp_user_notification movendo o falso nele (se isso não for fazer, a carta de ativação será enviada duas vezes, o bem, na verdade duas letras diferentes).

    Função ExércitoOfselenagomez_WPMU_SignUP_USER_NOTIFICATIFICAÇÃO (USER USER_Mail_Mail, $ Key, $ meta \u003d array ()) (// ... // code da função wpmu_signup_user_notification () wp_mail ($ user_specialchars_decode ($ Assunto), $ Message_Headers ); Retornar falso;) add_filter ("wpmu_signup_user_notification" "," Armyofselegenagomez_wpmu_signup_user_notification ", 10, 4);

    Como resultado, a página de registro no tópico de Selena começou a parecer muito mais limpa e cuidadosa.

    Conclusão

    A internet tem muitas outras formas não muito corretas de fazer a mesma coisa - Apache redirecionamentos, formulários Ajax que não funcionarão sem script java, etc. Eu realmente não gostei muito, então tentei fazer mais corretamente meu próprio site.

    Noto que os arquivos de edição devem ser capazes de cuidadosamente e tentar não se afastar da origem para o ranknesh, se o WordPress alterar os arquivos WP-signup.php e wp-active.php, eles eram mais fáceis de compará-los a encontrar alterações .

    Não se esqueça de olhar para o código-fonte de todas as funções descritas acima, a fim de lidar totalmente com o que e como acontece dentro do código.

    Bônus. Proteção contra spammers.

    Até mesmo os sites mais jovens no WordPress estão frequentemente sujeitos a registro de spam. Você pode escrever condições infinitas para filtrar bots, muitas vezes mais parecidos com a tentativa de criar uma inteligência artificial 🙂 no caso de um redirecionamento regular, um redirecionamento regular no Apache me ajudou, com o qual ao abrir / wp-wp.php e / wp- Acitvate.php, eu pedi para a edição 404 (eu não sou um especialista em ajuste o ApacheEntão, minhas regras podem não ser muito corretas).

    RewriteEngine em rewriteBase / rewriterule ^ wp-signup \\ .php - rewriterule ^ wp-ativar \\ .php - # Comece o wordpress # regras do WordPress Por padrão Não toque :) # ... # End Wordpress

    P. S. Eu tento descrever algumas coisas de terceiros como em detalhes, tanto quanto possível, porque quando eu comecei, às vezes foi de alguma forma dizer e explicar muitas coisas. Eu também acredito que pequenas dicas semelhantes em outros materiais que alguém será empurrado para o estudo de algo novo e expandindo seu campo de conhecimento. Expressões regulares são usadas em registros de Reriterule, eles não são completamente complexos, por exemplo, o símbolo ^ significa o início da linha.

    Segal Vamos considerar a exploração da vulnerabilidade crítica de 1 dia na popular CMS Joomla, que trovejava na internet no final de outubro. Será sobre vulnerabilidades com números CVE-2016-8869., CVE-2016-8870. e CVE-2016-9081.. Todos os três ocorrem de um pedaço de código, que foi uma vez nas profundezas da estrutura, esperando por suas próprias horas, então se libertar e trazer com ele caos, sites hackeados e lágrimas em qualquer usuário inocente deste Joomla. Apenas os desenvolvedores mais valentes e ousados \u200b\u200bcujos olhos são vermelhos da luz dos monitores, e os teclados estão repleto de migalhas de pão, eles foram capazes de desafiar o sufusão inchada e impõem a cabeça no altar de correções.

    Aviso

    Todas as informações são fornecidas apenas para fins informativos. Nem os editores nem o autor são responsáveis \u200b\u200bpor qualquer dano possível causado pelos materiais deste artigo.

    Por que tudo começou

    Em 6 de outubro de 2016, Damis Palma (Demis Palma) criou um tópico sobre troca de pilha, que perguntou: por que, de fato, em Joomla versão 3.6 Existem dois métodos para registrar usuários com o mesmo registro de nome ()? O primeiro está localizado no Controlador de UsuáriosControlerRegroler, e o segundo é no UsersControlleruser. Damis queria saber se o método UsersControlleruser :: Register () é usado em algum lugar, ou é apenas um anacronismo evolucionário que permanece na antiga lógica. Ele foi perturbado com o fato de que, mesmo que esse método não seja usado em nenhuma apresentação, ele pode ser chamado usando uma solicitação formada. Qual foi a resposta do desenvolvedor sob o apelido de Itoctopus, confirmando: o problema realmente existe. E enviou um relatório para os desenvolvedores do Joomla.

    Em seguida, os eventos desenvolveram o caminho mais rápido. Em 18 de outubro, os desenvolvedores do Joomla aceitam o relatório Damis, que até a época atacou o POC, permitindo que você registre o usuário. Ele publicou uma nota em seu site, onde em termos gerais contou sobre o problema e os pensamentos sobre isso. No mesmo dia sai uma nova versão Joomla 3.6.3, que ainda contém um código vulnerável.

    Depois disso, David Tammellini (Davide Tampellini) gira o bug para o estado de registro não é um usuário simples, mas administrador. E em 21 de outubro, a equipe de segurança do Joomla chega a um novo caso. Já fala sobre aumentar os privilégios. No mesmo dia, o anúncio aparece no site do Joomla que na terça-feira, 25 de outubro, outra versão com um número de seqüência 3.6.3 será lançado, o que corrige a vulnerabilidade crítica no kernel do sistema.

    Em 25 de outubro, a equipe do Joomla Security Strike encontra o último problema que um código descoberto por Damis. Em seguida, na filial principal do repositório Joomla oficial, o compromisso de 21 de outubro, com um nome inconspicoso preparar 3.6.4 Liberação estável, que corrige o bug malfadado.

    Depois disso, inúmeros indivíduos interessados \u200b\u200bestão conectados à transmissão de desenvolvedores à transmissão de desenvolvedores - eles começam a promover vulnerabilidade e cozinhar sólidos.

    Em 27 de outubro, o pesquisador de Harry Roberts estabelece uma exploração pronta no repositório de pesquisa XIPHOS, que pode fazer o upload de um arquivo PHP para um servidor com um CMS vulnerável.

    Detalhes

    Bem, com a pré-história terminada, vá para a coisa mais interessante - o discernimento da vulnerabilidade. Como versão de teste, eu instalei o Joomla 3.6.3, então todos os números de linha serão relevantes para esta versão. E todos os caminhos para os arquivos que você verá em seguida serão indicados em relação à raiz do CMS instalado.

    Graças à Palma Encontre Damis, sabemos que existem dois métodos que realizam o registro do usuário no sistema. O primeiro é usado pela CMS e está no /components/com_users/ncontrollers/Comers/controllers/registration.php:108. O segundo (aquele que nós e teremos que ligar), vive em / componentes / com_users / controladores / user.php: 293. Vamos olhar para isso mais perto.

    286: / ** 287: * Método para registrar um usuário. 288: * 289: * @Return Boolean 290: * 291: * @síze 1.6 292: * / 293: Registro de função pública () 294: (295: JSession :: checktoken ("post") ou jexit (JText :: _ ("Jinvalid_token")); ... 300: // Obtenha os dados do formulário. 301: $ Data \u003d $ this-\u003e input-\u003e pós-\u003e get ("user", matriz (), "array");. .. 315: $ return \u003d $ model-\u003e validar ($ form, $ data); 316: 317: // verifique se há erros. 318: if ($ retorno \u003d\u003d\u003d FALSE) 319: (... 345: / Termine o registro. 346: $ return \u003d $ model-\u003e Registre ($ Data);

    Aqui deixei apenas linhas interessantes. A versão completa do método vulnerável pode ser visualizada no repositório Joomla.

    Vamos descobrir o que acontece quando o registro regular do usuário: quais dados são enviados e como eles são processados. Se o registro do usuário estiver ativado nas configurações, o formulário pode ser encontrado em http: //joomla.local/index.php/component/users/? Visualizar \u003d Registro.


    Um pedido legítimo para o registro do usuário se parece com a captura de tela a seguir.


    Os componentes com_users são responsáveis \u200b\u200bpor trabalhar com os usuários. Preste atenção ao parâmetro da tarefa na consulta. Tem $ controller. $ Método. Vamos ver a estrutura do arquivo.

    Nomes de script na pasta controladores. Cumpre os nomes dos controladores chamados. Como em nossa solicitação é agora $ controller \u003d "Registro", o arquivo será chamado. registration.php. E seu método registrado ().

    Atenção, pergunta: Como transmitir processamento de registro em uma área vulnerável no código? Você provavelmente já adivinhou. Os nomes dos métodos vulneráveis \u200b\u200be presentes coincidem (registrar), para que possamos apenas mudar o nome do controlador chamado. E onde está o controlador vulnerável? No arquivo user.php.. Acontece que $ controller \u003d "User". Coletamos todos juntos e recebemos tarefa \u003d usuário.Register. Agora, a solicitação de registro é processada pelo método que precisamos.


    A segunda coisa que precisamos fazer é enviar dados no formato certo. Tudo é simples aqui. O registro legítimo () está esperando por um array de nós chamado JForm, no qual transmitimos dados para registrar - nome, login, senha, correio (consulte a captura de tela com uma consulta).

    • /components/com_users/ncontrollers/registration.php: 124: // Obtenha os dados do usuário. 125: $ requestedata \u003d $ this-\u003e input-\u003e pós-\u003e get ("jform", matriz (), "array");

    Nossa ala recebe esses dados da matriz nomeada pelo usuário.

    • /Components/com_users/ncontrollers/user.php: 301: // Obtenha os dados do formulário. 302: $ Data \u003d $ this-\u003e input-\u003e pós-\u003e get ("user", matriz (), "array");

    Portanto, alteramos os nomes de todos os parâmetros com o JFrom no usuário.

    O terceiro nosso passo é encontrar um token válido CSRF, já que não haverá registro sem ele.

    • /Components/com_users/ncontrollers/user.php: 296: Jsession :: checktoken ("post") ou jexit (jinvalid_token));

    Parece um hash MD5, e você pode aceitar, por exemplo, do formulário de autorização no site /index.php/component/users/?View\u003dLogin.


    Agora você pode criar usuários através do método desejado. Se tudo aconteceu, parabenizo - você apenas entendeu a vulnerabilidade CVE-2016-8870. "A verificação ausente das permissões para o registro de novos usuários".

    Veja como parece no método "Trabalhando" do Register () do controlador de usuários:

    • /components/com_users/ncontrollers/registration.php: 113: // se o registro estiver desativado - redirecionar para a página de login. 114: if (jcomponentleper :: getParams ("com_users") -\u003e Obtenha ("AllowUserRegistration") \u003d\u003d 0) 115: (116: $ this-\u003e setredirect (JRoute :: _ _ ("index.php? Opção \u003d com_users & View \u003d login ", falso)); 117: 118: Retorno falso; 119 :)

    E assim vulnerável:

    • /Components/com_users/ncontrollers/user.php:

    Sim, de forma alguma.

    Para entender o segundo, muito mais sério problema, enviaremos um pedido formado por nós e seguiremos como é realizado em diferentes seções do código. Aqui está uma peça que é responsável por verificar os dados enviados pelo usuário no método de trabalho:

    Continuação disponível apenas para os participantes

    Opção 1. Participe da comunidade do site para ler todos os materiais no site

    A adesão na comunidade durante o período especificado irá abrir o acesso a todos os materiais de hacker, aumentará seu desconto acumulativo pessoal e acumulará uma classificação profissional de pontuação Xakep!

    Os tópicos geralmente não são funcionais, mas às vezes nós, desenvolvedores, você precisa introduzir algumas possibilidades em nosso tópico para torná-lo um pouco melhor e mais conveniente.

    Neste guia, consideraremos o termo "território de plugins", bem como aprender como usar uma ferramenta fantástica escrita por Thomas Griffin: Biblioteca de ativação de plug-in TGM.

    Funcionalidade do tópico: invasão para o território de plugins

    Os temas são projetados para alterar o design do site do WordPress. Idealmente, o tópico deve afetar apenas o aspecto visual. No entanto, no nosso WordPress "Idade de Ouro", os desenvolvedores de plug-in geralmente incluem características funcionais em seus tópicos que permitem que você mantenha a competitividade no mercado.

    Esta é a invasão do território de plugins. Podemos apresentar o "território de plugins" como algumas seções funcionais do código. Qualquer snippet de código Alterar a funcionalidade do seu site deve ser representado como um plugin se o código especificado não estiver estabelecido no WordPress Kernel.

    Eu já formulei anteriormente em um dos meus artigos uma regra empírica "plugins de território:

    Se a peculiaridade estiver relacionada à representação visual do site, neste caso, ele deve ser incluído no tópico; Se estiver associado à funcionalidade, ele deve ser representado como um plug-in separado.

    Regra bem simples. As pessoas ainda tentam se registrar no nível de fragmentos funcionais de código em seus tópicos, mas os catálogos de temas (como o Wordpress.org ou Themeforest) não tenham temas que invadam o território de plugins. Assim, a proposta de funcionalidade nos temas tornou-se um certo problema.

    Felizmente, há uma solução simples que não vai contra a regra do "território de plugins".

    Introdução à biblioteca de ativação do plug-in TGM

    Configurando a ativação do plug-in TGM

    Preste atenção à função TGMPA () com dois parâmetros no final do código. O segundo parâmetro é a variável $ config, que também é uma matriz, como $ plugins. Como segue do seu nome, você pode configurar a biblioteca de ativação do plug-in TGM usando desse maciço. A variável aceita seu próprio conjunto de opções:

    • iD (string) é um ID exclusivo para a biblioteca de ativação do plug-in TGM em seu tópico. Isso é muito importante: se outros plugins também usam ativação de plug-in TGM, diferentes IDs impedirão possíveis conflitos.
    • default_Path (string) - um caminho absoluto padrão para plug-ins em seu tópico. Quando você instala, você pode usar o nome do arquivo zip como o valor do parâmetro de origem para o seu plug-in.
    • menu (string) - Menu Menu para instalação de plug-ins.
    • has_notices (Boolean) - Se especificado em Notificações administrativas verdadeiras serão emitidas para os plug-ins necessários / recomendados.
    • demissível (Boolean) - Se especificado em True, o usuário pode "fechar" notificações.
    • disamSy_MSG (string) - se a opção desmissível estiver definida em false, esta mensagem será mostrado acima do aviso do administrador.
    • iS_Automatic (Boolean) - Se especificado em True, os plugins serão ativados após o usuário concordar em instalá-los.
    • mensagem (string) - HTML adicional, exibido na frente da tabela de plug-in.
    • strings (Array) - uma matriz que inclui mensagens exibidas. Você pode configurá-los como linhas de transmissão. Veja o arquivo do exemplo.php para ver a lista completa de todas as mensagens.
    "Mytheme-TGMPA", // seu ID TGMPA exclusivo "default_path" \u003d\u003e get_stylesheet_directory (). "/ lib / plugins /", // padrão absoluto path "menu" \u003d\u003e "mytheme-install-instale-plugins", // menu slug "has_notices" \u003d\u003e True, // Mostrar avisos de administrador "Demissível" \u003d\u003e False , // os avisos não são demissíveis "Dismiss_msg" \u003d\u003e "Eu realmente preciso que você instale esses plugins, ok?", // Esta mensagem será emitida no topo do Nag "IS_Automatic" \u003d\u003e True, // automaticamente Ativar plugins após a instalação "mensagem" \u003d\u003e "", // mensagem para a saída antes da tabela de plugins" Strings "\u003d\u003e Array (); // A matriz de mensagens que a ativação do plug-in TGM usa);

    Conclusão

    Como você pode ver, sugira funcionalidades em temas wordpress. Talvez - você só tem que pensar em primeiro lugar sobre os usuários que podem mudar de um tópico para outro. A biblioteca de ativação do plugin TGM oferece uma maneira realmente inteligente para isso.

    O que você acha dessa ferramenta? Você já usou, você pretende usá-lo no futuro? Compartilhe seus pensamentos!