Como validar corretamente os dados de $ _GET ou $ _REQUEST usando as funções do WordPress?

4

Estou trabalhando em um plug-in que requer manipulação imediata da saída de conteúdo. Isso depende apenas da variável atual $_GET ou $_REQUEST .

Dependendo de como a variável está definida, ela chamará um método de classe para lidar com a solicitação do usuário e exibir o conteúdo adequado.

Estou totalmente ciente da página de Validação de dados no WordPress Codex, mas não tenho certeza sobre qual é a melhor abordagem. para meu cenário, ou qualquer cenário de limpeza de variáveis $_GET ou variáveis $_REQUEST para esse assunto.

Como posso me higienizar usando as funções do WordPress para a variável $_GET ou $_REQUEST para uma string que será combinada para chamar um método de classe específico?

Isso pode ser explorado ou reprovado com o seguinte código?:

public function display_admin_page(){
    if(is_admin() && isset($_GET['page'])){
        global $content;
        $page = sanitize_title($_GET['page']);
        $method_name = 'page_'.str_replace('-', '_', $page);
        if(method_exists('content', $method_name)){
            // Display requested page from content class
            $thePage = $content->$method_name();
        } else{
            $thePage = $content->error(404);    
        }
        echo $thePage;
    }
}
    
por Michael Ecklund 12.09.2012 / 18:17

4 respostas

2

O WordPress não fornece funções específicas de validação de dados para SUPERGLOBALS.

Eu uso a função filter_input do PHP e depois a escapei como faria com qualquer variável não confiável.

$url = filter_input( INPUT_GET, 'some_query_string', FILTER_VALIDATE_URL );

echo '<a href="'. esc_url( $url ). '">Click Me</a>';

A entrada do filtro do PHP aceita:

por Chris_O 12.09.2012 / 18:33
2

Para o seu exemplo específico:

Você limpou os dados $ _GET adequadamente (pensava que eu usaria sanitize_key em vez de sanitize_title - não posso dizer que há muita diferença, mas sanitize_title é destinado ao uso em URLs).

A função method_exists retornará true para métodos privados e protegidos, portanto, se um usuário tentar chamar um método privado ou protegido, ele falhará sem ir para o 404. (A menos que o método display_admin_page esteja no mesma classe.)

Isso nos leva ao principal potencial de exploração: que absolutamente qualquer um pode forçar qualquer método público em sua classe a ser executado. Se possível, é sempre melhor especificar na lista de permissões o que pode ser aceito. Dessa forma você pode validar com algo como:

if ( !in_array( $_GET['page'], array( 'accepted_method', 'another_accepted_method' ) ) )
     $content->error(404);
    
por SeventhSteel 12.09.2012 / 21:22
0

Eu recomendaria usar mysql_real_escape_string($_GET) em qualquer solicitação GET. É um recurso PHP muito poderoso.

Você pode usar str_replace() para substituir qualquer caractere indesejado.

    
por Ciprian 12.09.2012 / 18:26
0

A sanitização de $_GET é praticamente específica do contexto. Depende de qual valor você quer e como você quer que ele seja validado.

Não há respostas de tamanho único para essa pergunta. É muito específico do contexto. Por exemplo, você poderia escrever uma função que retirasse todas as tags e barras da entrada, isso é muito seguro, mas e se você quisesse que uma tag p fosse salva? Não há mal nisso. A família wp_kses () é um estudo interessante, mas não é uma ótima solução, pois leva em conta o contexto, o nível do usuário e muito mais. Por exemplo, como usuário administrador, você pode salvar o JavaScript no título da postagem e postar o conteúdo, mas como uma função inferior, você não pode.

Se o valor for uma quantidade conhecida, você também pode verificar se in_array( $array_valid_strings ) e ter certeza disso.

Dito isto, existem diferentes graus de sanitização, por isso é importante manter o seu objetivo final em mente. Eu consultaria essa lista e encontraria a função ou combinação de funções que atenda às suas necessidades. É especificamente as funções sanitize_ que devem ser usadas aqui, não esc_. Sanitização e fuga continuam confusos ...

No meu caso, vou usar sanitize_text_field () porque ele desinfecta uma string da entrada do usuário ou do banco de dados.

  • Verifica se há UTF-8 inválido,
  • Converte um único < caracteres para entidades
  • retira todas as tags
  • Remove quebras de linha, guias e espaços em branco extras
  • Tiras de octetos

Boa sorte:).

P.S. Esta resposta cita as perspectivas de três diferentes desenvolvedores (Josh, Michal, Kevin).

    
por Ahmad Awais 11.10.2016 / 20:19