¿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í?
¿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í?
Respuestas:
No, no debe preparar ni escapar de los datos, esto lo hace la wpdb
clase 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 insert
método, entonces sí, debería evitar usarlo prepare
.
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.
$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.
No, no necesita evitar las inyecciones de SQL cuando usa: wpdb insert o wpdb delete.
Ver los siguientes enlaces:
https://codex.wordpress.org/Data_Validation#Database
https://codex.wordpress.org/Class_Reference/wpdb#Protect_Queries_Against_SQL_Injection_Attacks
insert
yupdate
no lo necesitan. Pero debe usarse conquery
.