¿Cómo desinfectar correctamente las cadenas sin $ wpdb-prepare?

2

Estoy trabajando en una búsqueda avanzada (que utiliza consultas SQL personalizadas), y la cadena de consulta se forma utilizando variables. Por ejemplo, si la persona marca algunas opciones, solo esas condiciones se agregan a la cláusula WHERE.

No puedo usar $wpdb->prepare , ya que quiero poder agregar variables a mi cadena de consulta que se parezcan a:

$var = "AND pm.meta_value = '%$_POST['val']%'"; 

Miré a like_escape() , pero la documentación dice:

  

Sanitizes $ string para usar en una expresión LIKE de una consulta SQL. Todavía tendrá que escapar de SQL (con una de las funciones anteriores) .

¿Cuál sería una forma adecuada de escapar de $ val?

    
pregunta coopersita 26.04.2013 - 18:13

2 respuestas

6
  

No puedo usar $ wpdb- > prepare, ya que quiero poder agregar variables   a mi cadena de consulta que se parece a algo como:

$var = "AND pm.meta_value = '%$_POST['val']%'";

Para que un % literal pase a través de $wpdb->prepare solo duplícalo. No es necesario que evites $wpdb->prepare .

Prueba de concepto:

var_dump($wpdb->prepare('SELECT * FROM {$wpdb->posts} WHERE post_title LIKE "%%%s%%"','Hello'));

Un comentario a continuación sugiere que algo más complicado podría estar en orden:

$var[] = 'post_title LIKE "%%%s%%"';
$var_data[] = 'Hello';
$var[] = 'post_name LIKE "%%%s%%"';
$var_data[] = 'Hi';
$var[] = 'post_date LIKE "%%%s%%"';
$var_data[] = 'Howdy';
var_dump($wpdb->prepare('SELECT * FROM {$wpdb->posts} WHERE post_title '.implode(' AND ',$var),$var_data));

Por supuesto, en la práctica, probablemente crearía $var y $var_data en algún tipo de bucle como:

foreach ($_POST as $k=>$v) {
  if ('abc' == $k) {
    $var[] = 'post_title LIKE "%%%s%%"';
    $var_data[] = $v; // should probably validate a bit
  } elseif(...) {
    // ...
  } else {
    // ...
  }
}

Siempre es posible ejecutar preparar en cada elemento también:

$var[] = $wpdb->prepare('post_title LIKE "%%%s%%"','Hello');

Pero el método que usa la matriz me parece más elegante y solo ejecuta $wpdb->prepare una vez, por lo que vale.

    
respondido por el s_ha_dum 26.04.2013 - 18:20
5

Utilice mysqli_real_escape_string() .

El núcleo aún usa el mysql_real_escape_string() o add_slashes() en wpdb::_real_escape() ...

/**
 * Real escape, using mysql_real_escape_string() or addslashes()
 *
 * @see mysql_real_escape_string()
 * @see addslashes()
 * @since 2.8.0
 * @access private
 *
 * @param  string $string to escape
 * @return string escaped
 */
function _real_escape( $string ) {
    if ( $this->dbh && $this->real_escape )
        return mysql_real_escape_string( $string, $this->dbh );
    else
        return addslashes( $string );
}

... pero no debes usar eso más.

    
respondido por el fuxia 26.04.2013 - 18:16

Lea otras preguntas en las etiquetas