wpdb->insert: devo preparare una protezione contro l'SQL injection?
È necessario utilizzare wpdb prepare prima di wpdb->insert?
Se sto inserendo valori in una tabella WordPress utilizzando wpdb->insert, devo "pulire" i miei dati prima di inserirli o questo metodo (wpdb->insert) lo fa automaticamente per me?

No, non dovresti preparare o proteggere i dati, questo viene fatto per te dalla classe wpdb
.
Dal riferimento alla classe wpdb:
data:
(array) Dati da inserire (in coppie colonna => valore). Sia le colonne $data che i valori $data dovrebbero essere "grezzi" (nessuno dei due dovrebbe essere protetto da SQL).
Se, tuttavia, stessi scrivendo il tuo SQL invece di usare il metodo insert
, allora sì, dovresti proteggere usando prepare
.

Quello che segue è un avvertimento per la classe wpdb.
https://codex.wordpress.org/Class_Reference/wpdb
Un Avvertimento
Alcune delle funzioni in questa classe accettano un'istruzione SQL come input. È necessario applicare l'escape SQL a tutti i valori non attendibili che si incorporano nella query SQL per prevenire attacchi di SQL injection. Controlla la documentazione per vedere se la funzione che intendi utilizzare applica già l'escape SQL o se si aspetta che sia già stato applicato.
Quindi ho interpretato questo come - la classe wpdb non prepara o applica automaticamente l'escape ai dati per te.
Sono abbastanza sicuro che se non puoi fidarti al 100% della fonte dei dati nel tuo codice, allora suggerisco di utilizzare la classe prepare(?).
Non pensare che usare la classe prepare risolverà il problema senza usarla correttamente. Sono abbastanza nuovo a questo, quindi per favore pubblica eventuali correzioni come risposta se non ho ragione.
$wpdb->prepare( "SELECT * FROM table WHERE ID = %d AND name = %s", $id, $name );
Nell'istruzione sopra, ci sono 2 attributi extra. Uno per l'ID e uno per il nome. Per quanto ho letto, ognuno corrisponde in ordine al numero di elementi nella tua query. Inoltre %s = stringa, %d = intero e %f = float.
Inoltre, da quello che ho letto, se non inserisci gli attributi extra, allora prepare non farà effettivamente nulla. Ci sarà un avvertimento, ma se lo disattivi, forse non lo saprai.
Ecco un esempio dalla stessa documentazione della classe dove aggiungono una classe prepare in un INSERT di seguito.
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 ) ) );
La mia preoccupazione è che la risposta più votata sia errata secondo la stessa pagina a cui 'nobody' fa riferimento. Sto assumendo che tu usi prepare() ma non altri metodi standard di escape di php perché ho preso questa risposta come corretta anch'io... finché non ho approfondito.
Comunque... forse le cose sono cambiate dalla risposta originale.

La risposta accettata è corretta. Quando usi funzioni come $wpdb->insert()
, $wpdb->update()o
$wpdb->delete()i dati dovrebbero essere RAW. In una situazione in cui usi ad esempio
$wpdb->query()` e passi un'istruzione SQL come input, dovresti eseguire l'escape dei dati non attendibili.

nmr, penso di aver capito ora. Quindi per chiarire... per la mia sanità mentale... quello che hai usato come esempio è 'il metodo insert' e 'il metodo delete' in contrasto con gli esempi che ho usato io di usare 'il metodo query' ... (%wpdb->query). Devo eliminare la mia risposta? O la lascio?

No, non è necessario proteggersi dalle iniezioni SQL quando si utilizzano le funzioni wpdb insert o wpdb delete.
Consulta i seguenti link:
https://codex.wordpress.org/Data_Validation#Database
https://codex.wordpress.org/Class_Reference/wpdb#Protect_Queries_Against_SQL_Injection_Attacks
