Soporte » Seguridad » Sanitizar $_POST

  • Resuelto Camilo

    (@camilo517)


    Buenas chicos, me gustaria saber como sanitizar esto. Gracias
    if ( isset( $_POST[‘test’] ) && !empty( $_POST[‘test’] ) )

    <input style=»display:none!important» autocomplete=»off» type=»text» class=»input-text» name=»test» id=»test» value=»<?php esc_attr_e( $_POST[‘test’] ); ?>» />

    Aqui hice una prueba pero no se si esta bien
    return sanitize_text_field(empty( $_POST[‘additional-comment’])) ? $approved : ‘spam’;

    (He consultado la documentación de WordPress pero no me aclara nada)

    • Este debate fue modificado hace 6 meses por  Camilo.
Viendo 7 respuestas - 1 de 7 (de 7 total)
  • kallookoo

    (@kallookoo)

    Hola,

    Yo uso filter_input asi evito el warning de WPCS.

    Despues dependiendo del tipo de valor especifico el filtro.

    Ejemplo:

    
    $test = filter_input( INPUT_POST, 'test' ); // evito warning WPCS
    // aqui suelo aplicar ahora por ejemplo, wp_unslash y sanitize_text_field si mi intencion es guardarlo en la base de datos
    $test = ( empty( $test ) ? '' : sanitize_text_field( wp_unslash( $test ) ) );
    // o 
    $test = ( empty( $test ) ? '' : $test );
    // ahora $test es un string y sigo con el resto del codigo como por ejemplo
    ?>
    <input name="test" value="<?php echo esc_attr( $test ); ?>"
    

    Pero tienes que diferenciar si lo que quieres es guardar el valor o mostrarlo.
    Para guardar en la base de datos se usa normalmente sanitize_*, y para mostrar se usa esc_*

    Si te fijas no he usado esc_attr_e ya que si que es cierto que lo imprime pero esa funcion traduce ese valor antes de imprimirlo con lo que tienes la posibilidad de que se traduzca, aparte que llamas innecesariamente a otras functions.

    Toda function del tipo _* como esc_attr__, esc_attr_e, esc_html__ solo se deberian usar para traducir el valor.

    Bueno espero haberme explicado bien, pero aclaro que es como lo hago yo.
    Tambien puedes pasar del WPCS y hacer:

    
    $test = '';
    if ( ! empty( $_POST['test'] ) ) {
     $test = $_POST['test'];
    }
    
    // Si guardas en la DB
    $test = sanitize_text_field( wp_unslash( $test ) );
    
    // resto del codigo aqui
    

    Si te fijas no uso isset ya que no sirve de nada combinarlo con empty.

    empty comprueba si esta definida y el valor no esta vacio.
    isset comprueba si esta definida y no es null.

    Lo puedes cambiar eso ya depende del codigo.

    Camilo

    (@camilo517)

    Hola, gracias por tu respuesta
    ¿Esta correcto?

    <input style="display:none!important" autocomplete="off" type="text" class="input-text" name="test" id="test" value="<?php sanitize_text_field($_POST['test']); ?>" />

    return sanitize_text_field(empty($_POST['additional-comment'])) ? $approved : 'spam';

    Esto no se como protegerlo

    function hwwa_test()
    {
    if (isset($_POST['test']) && !empty($_POST['test']))
      wp_die(__('test', 'test'));
    }
    
    add_action('wp_login', 'hwwa_test');
    kallookoo

    (@kallookoo)

    Hola de nuevo,

    Te comento, sobre lo que comentastes antes wp_unslash no elimina la / sino la \ de un string mira el ejemplo.

    Como no tengo muy claro que quieres hacer voy por partes y segun entiendo:

    – Primer code:
    No esta correcto ya que no compruebas si esta definida y no imprimes el valor.
    Te recomiendo lo siguiente pasando del WPCS:

    
    <?php
    $mi_valor = '';
    if ( ! empty( $_POST['test'] ) ) {
     $mi_valor = sanitize_text_field( wp_unslash( $_POST['test'] ) );
    }
    ?>
    <input style="display:none!important" autocomplete="off" type="text" class="input-text" name="test" id="test" value="<?php echo esc_attr( $mi_valor ); ?>" />
    

    – Segundo code:
    Esta mal mires por donde lo mires.
    Entiendo que quieres devolver el valor spam o $approved pero no entiendo esa comprobacion ni donde esta defina la var $approved.

    sanitize_text_field le debes pasar un string y tu le pasas un boolean.
    luego tienes mal formada la operación ternaria, si estas empezando con PHP te aconsejo que uses la manera extendida. ejemplo:

    
    $valor='predeterminado'; 
    if ( lo que sea ) {
     $valor = 'otro';
    }
    

    la operancion ternaria deberia ser asi:

    
    algo ? si : no; 
    

    Como no tengo muy claro ese codigo no uso para el ejemplo.

    – Tercer code:
    Ande vas loco!!! :DDD
    En serio, no puedes hacerlo tan radicamente, como no tengo el contexto no puedo extenderme ni enterderlo mucho.
    Puedo entender que quieres para la ejecucion si no existe test cuando un usuario inicia sesion, pero el usuario ya tendria las cookies y estaria logueado asi que no me queda claro.
    Si estas añadiendo otro campo al login define un error y muestralo o elimina las cookies y redireciona otra vez al login, pero esto lo estoy suponiendo.

    Camilo

    (@camilo517)

    Este es el plugin, yo creo que asi queda mas claro
    https://es.wordpress.org/plugins/honeypot-woocommerce-wp-antispam/#description

    Javier Casares

    (@javiercasares)

    Te recomiendo que le des una ojeada a esto (seguridad en plugins); seguramente con más detalle esto (validar datos de entrada) y como «sanitizar» los datos de entrada de los formularios:

    kallookoo

    (@kallookoo)

    Hola @camilo517,

    Como dice @javiercasares y no se ocurrio ya que lo di por hecho es que mires https://developer.wordpress.org/plugins/ para informarte de como realizar un plugin y seguir las pautas de seguridad.

    Pero añadiria que antes busques informacion y tutoriales sobre PHP, ya que debes entenderlo antes.
    Como comprederas yo u otro voluntario ayudamos a dudas que pueden tener los compañeros pero en tu caso es mas complejo ya que aun no tienes los conocimientos necesarios para programar.

    Me parece fantastico que quieras aportar un plugin a la comunidad, pero antes de publicarlo deberias crearlo y comprobar que todo funciona, ya que puedes perjudicar a los usuarios y tu imagen en la comunidad.

    Aqui tienes mucha informacion sobre PHP https://www.php.net/manual/es/

    Saludos

    Camilo

    (@camilo517)

    Desde el equipo de plugins de WordPress me han dicho que el plugin es seguro. Intentaré investigar mas sobre el tema y mejorarlo
    El plugin funciona, lo hice para el proyecto de un cliente y lo compartí por si a alguno le sirve
    Saludos y gracias.

Viendo 7 respuestas - 1 de 7 (de 7 total)
  • El debate ‘Sanitizar $_POST’ está cerrado a nuevas respuestas.