Recebi um relatório de vulnerabilidade (1) que parece sugerir que pode haver um problema de segurança na maneira como o Wordpress lida com URLs com os seguintes tildes. Parece que o scanner acha que o site pode estar exibindo algumas listagens de diretórios e tal.
Fiquei surpreso que meu site ainda estivesse exibindo conteúdo nessas URLs diferentes, então fiz um teste instalando uma instância WP totalmente em branco, mudei para permalinks "Nome da postagem" e confirmei que sim, qualquer URL com til adicionado ainda é interpretada como o URL sem o til.
De fato, um URL como este:
https://mywordpresssite.com/my-permalink
Também é acessível com os seguintes URLs:
https://mywordpresssite.com/my-permalink~
https://mywordpresssite.com/my-permalink~/
https://mywordpresssite.com/my-permalink~~~~~~
Pesquisei um pouco para ver onde o WP analisa os permalinks e o localizei class-wp.php
no parse_request
método, mas não pude ir muito além disso.
Minha pergunta é se esse é o comportamento pretendido para o WP e, em caso afirmativo, existe alguma maneira de desativar isso para que os tildes não correspondam? Por que o WP interpretaria os URLs com til como um URL sem eles?
(1) Sim, agora todos nós vimos alguns dos principais hacks e vazamentos de dados no Reino Unido, é o momento em que todos os "seguranças" fingem que estão fazendo a sua parte, entregando a nós desenvolvedores relatórios de varredura de 200 páginas cheio de falsos positivos e questões genéricas sobre os quais eles não sabem nada na expectativa, se lermos e agirmos sobre o referido relatório, nada de ruim acontecerá.
fonte
sanitize_title
, mas, como é filtrável, não é possível escrever uma solução sempre válida. Então eu fui específico.Sim, como já explicado,
WP_Query::get_posts()
usasanitize_title_for_query()
( que usasanitize_title()
) para limpar o nome da postagem de uma postagem singular.Em resumo, depois que o nome da postagem passou
sanitize_title_for_query()
,my-permalink === my-permalink~~~
comosanitize_title_for_query()
remove o final~~~
. Você pode testar isso fazendo o seguinte:Isso não é algo que você pode desligar. Existe um filtro
sanitize_title()
chamado nosanitize_title
qual você pode usar para alterar o comportamento desanitize_title()
, mas isso nem sempre é uma boa ideia. A injeção de SQL é muito séria, portanto, deixar escapar alguma coisa devido a problemas de saneamento pode ter uma influência muito ruim na integridade do seu site. Às vezes, "excesso de saneamento" pode ser uma dor no traseiro.Não tenho certeza do que você está procurando, mas suspeito que talvez você queira 404 postagens únicas com esses til à direita, em suas palavras, "desligue-o". A única maneira de pensar nesse estágio é interromper a consulta principal quando tivermos esses tildes à direita. Para isso, podemos filtrar a
posts_where
cláusula da consulta principal.O FILTRO
Nota: eu considerei apenas postagens singulares normais, e não capas estáticas ou anexos, você pode estender o filtro para incorporar isso
Algumas notas
O filtro acima retornará uma página 404 quando tivermos um URL como
https://mywordpresssite.com/my-permalink~~~~~~
. No entanto, ao removerremove_action( 'template_redirect', 'redirect_canonical' );
do filtro, a consulta é redirecionada automaticamente parahttps://mywordpresssite.com/my-permalink
e exibe a única postagem, devido àredirect_canonical()
qual está conectada àtemplate_redirect
qual lida com o redirecionamento de 404 gerados pelo WordPress.fonte
Sim, parece estranho que tenhamos a mesma correspondência para:
e por exemplo
Por que isso é possível, parece ser essa parte do
WP_Query::get_posts()
método:onde
sanitize_title_for_query()
é definido como:Deve ser possível tornar isso mais rigoroso com o
sanitize_title
filtro, mas talvez não seja uma boa idéia substituir a saída padrão, com base emsanitize_title_with_dashes
, que é responsável pelo saneamento aqui. Você deve criar um ticket em vez de alterá-lo, se já não houver uma corrente sobre esse comportamento.Atualizar
Gostaria de saber se poderíamos limpar o ruído da corrente do caminho com
sanitize_title_for_query()
e redirecionar para o URL limpo, se necessário?Aqui está uma demonstração com a qual você pode jogar no site de teste e ajustar às suas necessidades:
Pode até ser melhor usar
sanitize_title_with_dashes()
diretamente para evitar os filtros e substituir:com:
ps: Acho que aprendi esse truque, para obter o caminho atual com um vazio
add_query_arg( [] )
, em @gmazzap ;-) Isso também é observado no Codex. Agradecemos novamente a @gmazzap pelo lembrete de usoesc_url()
ao exibir a saídaadd_query_arg( [] )
ouesc_url_raw()
quando, por exemplo, redirecioná-la. Verifique a referência anterior do Codex para isso também.fonte
add_query_arg
necessidade de ser precedidos poresc_url
ouesc_url_raw
para evitar problemas de segurança ...Deixe-me explicar o processamento de uma solicitação pelo WordPress e um método para alterar o comportamento do WordPress para atingir seus objetivos de acordo.
Analisando a solicitação
Quando o WordPress recebe uma solicitação, ele inicia um processo de dissecação da solicitação e transformá-lo em uma página. O núcleo desse processo começa quando o método de consulta principal do WordPress
WP::main()
é chamado. Esta função analisa a consulta, como você identificou corretamente, emparse_request()
(inincludes/class-wp.php
). Lá, o WordPress tenta combinar a URL com uma das regras de reescrita . Quando o URL é correspondido, ele cria uma cadeia de consulta das partes da URL e codifica essas partes (tudo entre duas barras) usandourlencode()
, para impedir que caracteres especiais, como por exemplo,&
atrapalhem a cadeia de consulta. Esses caracteres codificados podem ter levado você a pensar que o problema residia lá, mas na verdade eles são transformados nos caracteres "reais" correspondentes ao analisar a sequência de caracteres da consulta.Executando a consulta associada à solicitação
Depois que o WordPress analisa a URL, ele configura a classe de consulta principal
WP_Query
, que é feita no mesmomain()
método daWP
classe. O beef ofWP_Query
pode ser encontrado em seuget_posts()
método em que todos os argumentos da consulta são analisados e higienizados e a consulta SQL real é construída (e, eventualmente, executada).Nesse método, na linha 2730, o seguinte código é executado:
Isso limpa a postagem para buscá-la na tabela de postagens. A saída de informações de depuração dentro do loop mostra que é aqui que reside o problema: seu nome da postagem,,
my-permalink~
é transformado emmy-permalink
, que é usado para buscar a postagem do banco de dados.A função de higienização do título da postagem
A função
sanitize_title_for_query
chamasanitize_title
com os parâmetros adequados, que procede à limpeza do título. Agora, o núcleo desta função está aplicando osanitize_title
filtro:Este filtro tem, no WordPress nativa, uma única função ligado a ele:
sanitize_title_with_dashes
. Eu escrevi uma extensa visão geral do que essa função faz, que pode ser encontrada aqui . Nesta função, a linha que está causando seu problema éEssa linha retira todos os caracteres, exceto caracteres alfanuméricos, espaços, hífens e sublinhados.
Resolvendo seu problema
Portanto, existe basicamente uma maneira única de resolver seu problema: remover a
sanitize_title_with_dashes
função do filtro e substituí-la por sua própria função. Na verdade, isso não é tão difícil de fazer, mas :Mais importante : o WordPress usa o resultado da
sanitize_title
função diretamente na consulta SQL por esta linha:Se você já pensou em mudar o filtro, não se esqueça de escapar corretamente do título antes que ele seja usado na consulta!
Conclusão: a solução do seu problema não é necessária no que diz respeito à segurança, mas, se você desejar, substitua-a
sanitize_title_with_dashes
por sua própria funcionalidade e preste atenção ao escape do SQL.NB: todos os nomes de arquivos e números de linha correspondem aos arquivos do WordPress 4.4.2.
fonte
Algumas pessoas já explicaram o problema, então vou postar uma solução alternativa. Deve ser bastante auto-explicativo.
Você vai ter que fazer algo um pouco diferente para tipos hierárquicos pós porém, desde que
WP_Query
será executadopagename
através dewp_basename
e, em seguida, higienizar-lo, por issoquery_vars['pagename']
eget_query_var('pagename')
não irá corresponder para crianças becuase este último não conterá a peça pai.Gostaria
redirect_canonical
apenas de cuidar dessa porcaria.fonte
ESTE É O CORRETO ... PARA O BUG DO WORDPRESS APENAS ADICIONE O bloco mod de segurança INICIAR acima do BLOCO Gerado pelo Wordpress.
fonte
Você sempre pode tentar adicionar o seguinte ao seu
.htaccess
arquivo:A segunda linha acima deve ir logo abaixo da primeira linha mostrada. Deve impedir a
index.php~
exibição em URLs.fonte