wpdb-> insert: ¿necesito prepararme contra la inyección SQL?

14

¿Necesito usar wpdb prepare antes de wpdb-> insert?

Si estoy insertando valores en una tabla de WordPress usando wpdb-> insert, ¿necesito "limpiar" mis datos antes de insertarlos o este método (wpdb-> insert) lo hace por mí?

conservador rojo
fuente

Respuestas:

21

No, no debe preparar ni escapar de los datos, esto lo hace la wpdbclase por usted .

De la referencia de clase wpdb :

datos :

(matriz) Datos para insertar (en la columna => pares de valores). Tanto las columnas $ data como los valores $ data deben ser "sin procesar" (ninguno debe tener escape de SQL).

Sin embargo, si estaba escribiendo su propio SQL en lugar de usar el insertmétodo, entonces sí, debería evitar usarlo prepare.

nadie
fuente
8
Para agregar una nota: Ambos inserty updateno lo necesitan. Pero debe usarse con query.
kaiser
1

La siguiente es una advertencia para la clase wpdb.

https://codex.wordpress.org/Class_Reference/wpdb

Una advertencia

Algunas de las funciones de esta clase toman una declaración SQL como entrada. Debe SQL escapar de todos los valores no confiables que incorpora a la consulta SQL para evitar ataques de inyección SQL. Verifique la documentación para ver si la función que planea usar escapa SQL por usted o espera que se escape previamente.

Entonces leí esto como: la clase wpdb no prepara ni escapa automáticamente los datos por usted.

Estoy bastante seguro de que si no puede confiar al 100% en la fuente de datos en su código, sugiero usar la clase prepare (?).

No piense que usar la clase prepare lo arreglará sin usar la clase prepare adecuadamente. Soy bastante nuevo en esto, así que publique cualquier corrección como respuesta si no estoy en lo cierto.

$ wpdb-> prepare ("SELECT * FROM table WHERE ID =% d AND name =% s", $ id, $ name);

En la declaración anterior, hay 2 atributos adicionales. Uno para la identificación y otro para el nombre. Hasta donde lo leí, cada uno corresponde en orden al número de elementos en su consulta. También% s = cadena,% d = entero y% f = flotante.

Además, según mi lectura, si no agrega los atributos adicionales, preparar no hará nada. Habrá una advertencia, pero si apaga eso, tal vez no lo sabrá.

Aquí hay un ejemplo de la referencia de la clase en la que agregan una clase de preparación en un INSERT a continuación.

https://codex.wordpress.org/Class_Reference/wpdb#Protect_Queries_Against_SQL_Injection_Attacks

$ wpdb-> query ($ wpdb-> prepare ("INSERT INTO $ wpdb-> postmeta (post_id, meta_key, meta_value) VALUES (% d,% s,% s)", array (10, $ metakey, $ metavalue) ));

Mi preocupación es que la respuesta votada es incorrecta de acuerdo con la misma página que 'nadie' hace referencia. Supongo que usa prepare () pero no otros métodos de escape php estándar porque también tomé esta respuesta como correcta ... hasta que profundicé más.

De todos modos ... tal vez las cosas han cambiado desde la respuesta original.

Felixius
fuente
hmmm, esto suena más como una pregunta que como una respuesta
Mark Kaplun
La respuesta aceptada es correcta. Cuando utiliza funciones como $wpdb->insert(), $ wpdb-> update () `o los $wpdb->delete()datos deben ser RAW. En una situación en la que usa, por ejemplo, $wpdb->query()y pasa la instrucción SQL como entrada, debe escapar de los datos no confiables.
RMN
RMN, creo que entiendo ahora. Entonces, para aclarar ... para mi cordura ... lo que usaste como ejemplo es 'el método de inserción y' el método de eliminación 'en lugar de los ejemplos que usé de usar' el método de consulta '... (% wpdb -> consulta). ¿Borro mi respuesta? O dejarlo?
Felixius