¿Cómo validar correctamente los datos de $ _GET o $ _REQUEST utilizando las funciones de WordPress?

4

Estoy trabajando en un complemento que requiere la manipulación sobre la marcha de la salida de contenido. Esto depende únicamente de la variable $_GET actual o de la variable $_REQUEST .

Dependiendo de la configuración de la variable, llamará a un determinado método de clase para manejar la solicitud del usuario y mostrar el contenido adecuado.

Soy plenamente consciente de la página Validación de Datos en el Códice de WordPress, sin embargo, no estoy seguro de cuál es el mejor enfoque para mi escenario, o cualquier escenario de saneamiento de $_GET variables o $_REQUEST variables para esa materia.

¿Cómo puedo desinfectar las funciones de WordPress para $_GET variable o $_REQUEST variable para una cadena que coincidirá para llamar a un método de clase específico?

¿Podría explotarse o fallar, dado el siguiente 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;
    }
}
    
pregunta Michael Ecklund 12.09.2012 - 18:17

4 respuestas

2

WordPress no proporciona ninguna función de validación de datos específica para SUPERGLOBALS.

Utilizo la función PHP filter_input y luego la escondo como lo haría con cualquier variable no confiable.

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

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

La entrada del filtro PHP acepta:

respondido por el Chris_O 12.09.2012 - 18:33
2

A su ejemplo específico:

Has saneado los datos $ _GET de forma adecuada (pensé que usaría sanitize_key en lugar de sanitize_title ; no puedo decir que haya mucha diferencia, pero sanitize_title está diseñado para usarse en las URL).

La función method_exists devolverá verdadero para los métodos privados y protegidos, por lo que si un usuario intenta llamar a un método privado o protegido, fallará sin ir a la 404. (A menos que el método display_admin_page esté en el misma clase.)

Eso nos lleva a la principal vulnerabilidad potencial: que absolutamente cualquier persona puede forzar la ejecución de cualquier método público en su clase. Si es posible, siempre es mejor incluir específicamente en la lista blanca lo que se puede aceptar. De esa manera usted podría validar con algo como:

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

Recomiendo usar mysql_real_escape_string($_GET) en cualquier solicitud GET. Es una característica de PHP muy poderosa.

Luego puedes usar str_replace() para reemplazar cualquier carácter no deseado.

    
respondido por el Ciprian 12.09.2012 - 18:26
0

Sanitizing $_GET es bastante específico del contexto. Depende del valor que desee y de cómo desea validarlo.

No hay respuestas de talla única para esta pregunta. Es muy específico del contexto. Por ejemplo, podría escribir una función que eliminara todas las etiquetas y barras de la entrada, eso es muy seguro, pero ¿y si quisiera guardar una etiqueta p? No hay daño allí. La familia wp_kses () es un estudio interesante, pero no es una gran solución, ya que toma en cuenta el contexto, el nivel de usuario y más. Por ejemplo, como usuario administrador, puede guardar JavaScript en el título de la publicación y en el contenido de la publicación, pero como función inferior, no puede.

Si su valor es una cantidad conocida, también puede verificar si in_array( $array_valid_strings ) y estar más seguro de eso.

Dicho esto, hay diferentes grados de desinfección, por lo que es importante tener en mente su objetivo final. Me gustaría consultar esta lista y encontrar la función o combinación de funciones que se ajuste a sus necesidades. Es específicamente las funciones de sanitize_ que deben usarse aquí, no esc_. El saneamiento y el escape siguen siendo confusos ...

En mi caso, voy a utilizar sanitize_text_field () porque elimina una cadena de la entrada del usuario o de la base de datos.

  • Comprueba si el UTF-8 no es válido,
  • Convierte single < personajes a entidades
  • elimina todas las etiquetas
  • Elimina saltos de línea, pestañas y espacios en blanco adicionales
  • Tiras de octetos

Buena suerte :).

P.S. Esta respuesta cita tres perspectivas diferentes del desarrollador (Josh, Michal, Kevin).

    
respondido por el Ahmad Awais 11.10.2016 - 20:19

Lea otras preguntas en las etiquetas