Deslocamento indefinido: 0 em> […] /wp-includes/capabilities.php na linha 1067

8

Ei, recebo essas mensagens de erro na minha configuração de host local, mas apenas com o Genesis Framework ativado; O WordPress Twenty Eleven funciona bem. Isso acontece quando eu quero criar uma nova postagem. Se eu atualizar a página, o erro será repetido, mas a postagem em si será criada e tudo parece correr bem.

Alguém sabe o que causa isso?

Notice: Undefined offset: 0 in /var/www/secret/htdocs/wp-includes/capabilities.php on line 1067
Notice: Undefined offset: 0 in /var/www/secret/htdocs/wp-includes/capabilities.php on line 1067
Warning: Cannot modify header information - headers already sent by (output started at /var/www/secret/htdocs/wp-includes/capabilities.php:1067) in /var/www/secret/htdocs/wp-includes/pluggable.php on line 876

É um Genesis Framework recém-instalado e não modificado.

James Mitch
fonte

Respostas:

12

Você encontrou um bug no Genesis.

O rastreamento da pilha do Xdebug identifica o culpado como a genesis_save_custom_fields()função que chama current_user_can()com uma capacidade singular (edit_post e edit_page) que também requer um argumento adicional, neste caso o ID da postagem que está faltando.

current_user_can()chama has_cap()quais chamadas map_meta_cap()que executam uma instrução switch no nome da capacidade. Veja a linha 1067 de capacidades.php . Os dois avisos de deslocamento indefinidos são de $ args [0], que não é uma matriz, porque o ID da postagem está ausente na chamada current_user_can no Genesis.

O Cannot modify header information - headers already sentaviso é do Xdebug imprimindo os avisos do PHP. De fato, se você não estivesse usando o Xdebug, nem veria os avisos do PHP, a menos que verificasse seus logs porque o erro está em uma função anexada ao save_post e a página é atualizada, o que impede que Avisos / Avisos / Erros sejam exibidos na página mesmo com WP_DEBUG definido como true.

Consertar:

Na linha 234 da alteração lib / functions / options.php:

/** Check the user allowed to edit the post or page */
if ( ( 'page' == $post->post_type && ! current_user_can( 'edit_page' ) ) || ! current_user_can( 'edit_post' ) )
    return;

Para:

/** Check the user allowed to edit the post or page */
if ( ! current_user_can( 'edit_post', $post->ID ) )
    return;

Também a nota, não há necessidade de verificar a post_type porque o edit_pagee edit_posttampas são intercambiáveis.

Chris_O
fonte
Ah, isso explica por que eu não recebi nenhum erro no meu laptop enquanto testava o localhost apache2 (sem xdebug) nem em um host que eu testei. Obrigado por aprofundar tanto nisso, que fiquei um pouco impressionado com todas essas coisas "complicadas";). Eu encontrei vários erros no genesis agora, eles deveriam testar isso com xdebug e WP_DEBUG, é claro. Por exemplo, encontrou um esc_html ausente em genesis. Eles pago wp núcleo desenvolvedor Mark Jaquirth a auditoria de segurança-lo várias vezes, anunciar com supostas citações de lhe dizer quão seguro ele é, eu agora questionar a qualidade global do Quadro Genesis
James Mitch
0

Isso foi corrigido no porta-malas em 1,17 por Mark Jaquith em sua auditoria. Enviei um ticket para uma possível versão 1.9.2.

Pessoalmente, acredito que esse seja um problema do WordPress, pois o map_meta_cap () não verifica ou desinfeta $ args [0]. Por isso, enviei um ticket para o núcleo do WordPress como resultado.

Travis Smith
fonte
"tronco em 1,17" o que? gênesis 1.1.7? Por que é então na 1.9.1? E mesmo que seja um problema do wordpress, eles liberam uma estrutura estável, onde você não pode nem postar sem um erro irritante que interrompe completamente o carregamento da página. WTF? O @Chris_O explicou acima que pode ser facilmente corrigido com simples argumento. Eu peguei $ post_id em vez de §post-> ID porque também é um argumento se a função genesis, eu não sei se isso é sensato, também estou curioso para saber se é certo e seguro reduzir isso para apenas if ( ! current_user_can( 'edit_post', $post_id ) )pular os outros .
James Mitch
Quero dizer, liberá-lo como estável sem sequer testar se fazer uma ação simples como uma postagem (com WP_DEBUG e xdebug) deve ser um procedimento normal para desenvolvedores ou não? Eu não sou um especialista nisso, mas eu diria que se não o fizerem errado. Sem mencionar que eles são o auto-proclamado "padrão da indústria de estruturas wordpress". Não deve não ser de 2 caras no estouro de pilha (eu e @Chris_O) detectar e corrigir o seu código de baixa qualidade!
James Mitch
E desculpe, mas por favor não culpe isso no núcleo wordpress! Não é , mesmo que seja um bug básico subjacente a isso. E não direi onde encontrei a falha de segurança de um esc_html ausente por 2 razões. 1. não quer arriscar proprietários de sites pobres! 2. é seu trabalho encontrá-lo por US $ 80 +! De fato, isso deve ser corrigido anos atrás! Ainda bem que baixei do github em vez de pagar por isso.
James Mitch
James, uau. Isso é muita raiva. Primeiro, o Genesis é testado com WP_DEBUG como procedimento normal. Quando observei que estava comprometido com o core como uma correção, foi confirmado em 17 de janeiro. Além disso, não é uma falha de segurança no Genesis ou no WordPress, como observado por Jaquith.
Travis Smith
Então me diga se eles checaram por que o erro não detectou esse erro incrivelmente fácil de detectar que, como eu disse, interrompe a execução, não o redireciona para o editor de postagem, permitindo que você observe uma mensagem xdebug toda vez que você publica / publica coisas? Deixe-me adivinhar que eles "testaram", mas a precedência dos testes não envolveu a execução ou edição de um post do ROFLMAO! Diga o que quiser, defenda-o como quiser (por causa do fato de serem extremamente tendenciosos), é um fato que eles falharam nos testes de popper!
James Mitch