Quais são as melhores práticas de segurança para plug-ins e temas do WordPress? [fechadas]

22

Conforme sugerido nesta pergunta , estou adicionando este tópico como uma nova pergunta para discussão / votação da comunidade sobre as práticas recomendadas para segurança de plug-ins / temas.

Aqui está a lista de verificação inicial, com base nas minhas configurações atuais (em andamento) / lista de verificação de segurança de dados usada para revisar Temas (os princípios não devem ser diferentes para Plugins do que são para Temas).

Se você quiser conferir um tema com uma página de configurações de tema segura e com código sólido, confira este tema:
http://wordpress.org/extend/themes/coraline

Chip Bennett
fonte
Se alguém com os privilégios apropriados não se importaria de fazer deste um wiki da comunidade?
Chip Bennett
Para obter uma pergunta no modo wiki necessidades de um mod para marcar a questão de forma adequada , eu já sinalizado-lo para a atenção mod, é uma apenas uma questão de tempo agora .. :)
t31os
O que há de tão especial na coralina? Imo ainda existem maneiras de entrar em eu sugiro para anons Link a insted:. Wordpress.stackexchange.com/questions/13539/...
kaiser
Pode não haver nada de especial em Coraline. No momento, é simplesmente aquele ao qual apontamos os desenvolvedores de Temas, ao revisar os Temas, porque foi o exemplo dado por Justin Tadlock, que fez muitas das revisões iniciais de Temas específicos de segurança. Eu ofereceria a enologia também como um bom exemplo, mas não quero parecer que estou tentando criar meu próprio tema. :)
Chip Bennett

Respostas:

12

Sanitize, valide e escape de dados

Desinfecte qualquer coisa que possa entrar e sair do (!) Banco de dados, tanto no front-end quanto no back-end!

Plugins e Temas devem executar a validação de dados adequada:

  1. Valide e limpe todos os dados não confiáveis ​​antes de inserir dados no banco de dados
  2. Escape todos os dados não confiáveis ​​antes de serem enviados nos campos do formulário Configurações
  3. Escape de todos os dados não confiáveis ​​antes de serem exibidos nos arquivos de modelo de tema

Plug-ins e temas devem ser usados esc_attr()para entradas de texto e / esc_html()ou esc_textarea()para áreas de texto.

Também disponível a partir da API do WordPress é esc_url(), esc_url_raw(), esc_js()e wp_filter_kses().

Mau exemplo:

<?php $url = 'javascript:pwnd()'; ?>
<a href="<?php echo $url; ?>">anchor</a>

Bom exemplo:

<a href="<?php echo esc_url($url); ?>">anchor</a>

Aqui está um ótimo vídeo de Mark Jaquith explicando o uso das funções de escape:

Chris_O
fonte
3
Higienize na entrada, escape na saída .. :) #
3131 t31os
9

Use apenas $ _GET / $ _POST / $ _REQUEST com cuidado e quando APIs melhores não estiverem disponíveis

Plugins e Temas deve usar as configurações de API para obter e salvar dados de entrada de formulário, em vez de confiar em $_POSTe $_REQUESTdados diretamente.

Rarst
fonte
3
Sempre trate $ _POST, $ _REQUEST e $ _GET como inseguros. Limpe e limpe os valores dessas matrizes e coloque-os em suas próprias variáveis. Nunca limpe os valores provenientes do usuário e coloque-os novamente em $ _POST.
goldenapples
2
Sempre verifique se a chave que você precisa usar está definida na matriz apropriada. isset () é seu amigo :)
mfields
9

Usar $wpdb->prepare

Ao criar consultas personalizadas por meio do $wpdbobjeto, sempre use $wpdb->preparepara preencher espaços reservados com valores em vez de escrever as consultas com dados misturados ao código SQL, pois as mysql_*funções da família ensinaram a todos de maneira errada.

Matteo Riva
fonte
$wpdb->preparenão é o mesmo que declarações preparadas.
hakre
8

Cuidado com as funções PHP que podem ser usadas para executar código malicioso

Uma boa leitura para quem escreve PHP: Funções exploráveis ​​do PHP no StackOverflow.

Use a API de modificação de temas

Os temas devem usar set_theme_mod()e funções relacionadas, não um esquema de nomes auto inventado.
A API theme_mod é uma camada especializada para a API de configurações; garante nomes exclusivos, coloca todas as opções em uma matriz e é - pela minha experiência - muito mais fácil de manusear. Além disso, oferece filtros padronizados para plugins - o que é bom para interoperabilidade.

Evitar ativado register_globals

Não confie register_globals = on. Um Tema Pro que meu último cliente comprou faz exatamente isso. Eu poderia invadir qualquer site usando esse tema em 5 minutos ... O
ThimbThumb também fez isso (e ainda o faz?).

Não crie arquivos com permissões de acesso amplo desnecessárias

Não crie arquivos com permissões de acesso muito liberadas.

Use SSL quando disponível

Aponte seus links Compartilhar no Twitter / Facebook / Qualquer coisa para o HTTPS URI, se disponível. A segurança do seu leitor também é importante.

fuxia
fonte
2
Você pode elaborar set_theme_mod(), especialmente, como combiná-lo adequadamente com o uso da API de configurações?
Chip Bennett
@Chip Bennett Adicionei algumas informações à minha resposta.
fuxia
Você pode dividir esta mini-lista em respostas menores e mais específicas? Mais fácil de gerenciar o wiki da comunidade em partes menores. TIA
Rarst
3
Chip: o sistema de modificação do tema não se integra muito bem à API de configurações. Escreverei um post explicando como fazer isso certo em breve.
Otto
7

Salvar dados em uma única matriz

Plugins e temas devem salvar opções em uma única matriz, em vez de criar várias opções para a página de configurações. O uso da API de configurações resolveria isso.

Chip Bennett
fonte
6

Verifique a capacidade apropriada ao adicionar e enviar páginas de configurações

Os plug-ins devem usar um recurso apropriado (por exemplo manage_options) para adicionar a página de configurações.

Os temas devem usar edit_theme_optionscomo recurso adequado para adicionar a página de configurações.

Rarst
fonte
1
Nota pequena, mas importante: você não pode usar edit_theme_optionsa API de configurações, o envio de opções é codificado para requerer manage_optionspara enviar atualizações. O ticket Trac relacionado pode ser encontrado aqui .
T31os
É verdade, mas 1) que afetará apenas editores, não administradores; e 2) espero que isso seja resolvido em breve, através do ticket Trac vinculado.
Chip Bennett
Sempre há a possibilidade de uma função personalizada ou uma função regular receber o edit_theme_optionslimite, pensei que seria útil ressaltar que a API de configurações em seu estado atual é apenas utilizável por funções com a manage_optionscapacidade.
T31os
5

Use tutoriais e informações atualizadas

Os plug-ins e os temas devem implementar deliberadamente as páginas Opções e configurações, sem depender de tutoriais de copiar e colar de sites desatualizados e que não incluem segurança de dados adequada, como os listados abaixo.

Exemplos do que não fazer :

t31os
fonte
1
Adicionei um pouco de texto enfatizado para indicar que os links são exemplos do que não fazer, pois é fácil percorrer as informações e clicar nos links sem ler o parágrafo que os precede. Também fez a resposta um pouco mais bonito, enquanto eu estava lá ...;)
t31os
2
Isso poderia explicar um pouco o que exatamente os tutoriais de exemplo estão fazendo de maneira errada e / ou antiga.
Rarst
4

API de configurações de uso

Os plug-ins e os temas devem usar a API de configurações, que é mais fácil de usar, mais segura e cuida de muito trabalho árduo das páginas de configurações:

Para obter bons tutoriais sobre o uso da API de configurações, consulte:

Chip Bennett
fonte
Veja meu comentário sobre esta resposta com relação à API de configurações e às opções de tema.
t31os
1

Para caixas de seleção e opções de seleção, Plugins e Temas devem usar as funções checked()e selected()para saída checked="checked"e selected="selected", respectivamente.

Chip Bennett
fonte
Não é realmente uma coisa de segurança, a menos que esteja faltando alguma coisa. Ainda é altamente conveniente e bom de usar. :)
Rarst
Bem, talvez e talvez não. Eu já vi MUITO código personalizado para realizar a mesma coisa. Mais espaguete de código = mais oportunidades para introduzir riscos à segurança. :)
Chip Bennett
Bennet - de enviar com toscho há alguns dias - acho que posso dizer isso para nós dois - as funções mais simples são muito mais fáceis de ler e entender do que essas funções. Eu não estou deprimida, mas também não sou favorável a isso. Imo, isso não deve fazer parte do núcleo, pois não agrega nenhum valor.
Kaiser
2
Estou curioso para descobrir o que vocês acharam mais fácil do que checked( $theme_options['whatever_option'] )ou checked( 'some_value' == $theme_options['whatever_option'] ). Eu não sei como fica mais sucinto do que isso?
Chip Bennett
1

Função de prefixo e nomes de variáveis

Os plug-ins devem prefixar todas as opções, funções personalizadas, variáveis ​​personalizadas e constantes personalizadas com slug do plugin.

Os temas devem prefixar todas as opções, funções personalizadas, variáveis ​​personalizadas e constantes personalizadas com slug de tema.

Chip Bennett
fonte
Eu estenderia isso para todos os nomes de classe, bem como nomes de objetos personalizados, como post_types e taxonomias.
mfields
1

Use wp_safe_redirect () em vez de chamar a função header () do php diretamente ao direcionar para uma página no mesmo domínio.

mfields
fonte
0

Adicione páginas de configurações às seções apropriadas do menu de administração

Os plug-ins devem usar a add_options_page()função para adicionar a página de configurações de plug-in ao Settingsmenu, em vez de usar add_menu_page()para adicionar um menu de nível superior.

Os temas devem usar a add_theme_page()função para adicionar a página de configurações de tema ao Appearancemenu, em vez de usar add_menu_page()para adicionar um menu de nível superior.

Chip Bennett
fonte