¿Cómo se usa la preparación cuando se solicita una lista de ID?

2

Estoy buscando obtener una cantidad de registros de la base de datos dada una lista de números y me preguntaba cómo usaría $ wpdb- > prepararme para hacer esto (para aprovechar los ataques de inyección de desinfección vs SQL que me da).

Una forma incorrecta de hacer lo que me gustaría lograr es $wpdb->query($wpdb->prepare('SELECT * FROM wp_postmeta WHERE post_id IN (' . implode(',', $ids) .') pero esto da la posibilidad de un ataque de Inyección SQL (imagine uno de los identificadores que tiene el valor "0); DROP TABLE wp_posts;").

NOTA: No estoy intentando seleccionar datos de wp_postmeta, solo lo estoy usando como ejemplo.

    
pregunta Brian Barnes 09.12.2012 - 23:54

2 respuestas

4

$wpdb->prepare() usa la misma sintaxis para formatear como php's printf() . SSo necesitarás algo como ... WHERE post_id IN (%d,%d,%d) ...

Esto se ajustará para tres IDs. ¿Pero qué pasa si tenemos más o menos de tres ids? Usaremos las herramientas php para crear la cadena de formato necesaria (asumiendo que $ids es una matriz con los ID):

Cuenta las ID

count( $ids )

Cree una cadena con un '% d' para cada ID en $ ids

str_repeat( '%d,', count( $ids ) )

Ahora tenemos una cadena como %d,%d,%d, . Hay una coma mucho al final. Vamos a eliminarlo

$ids_format_string = rtrim( str_repeat( '%d,', count( $ids ) ), ',' );

Y usa esto de esta manera '... WHERE post_id IN (' . $ids_format_string . ') ...'

    
respondido por el Ralf912 10.12.2012 - 01:05
0

En tu caso, sabes qué tipo de datos esperas, así que forzar ese tipo:

$ids = array_map( 'absint', $ids );

Y luego puedes usar estos valores sin más preparación.

    
respondido por el fuxia 10.12.2012 - 01:06

Lea otras preguntas en las etiquetas