wpdb-> insert: devo prepararmi contro l'iniezione SQL?


14

Devo usare wpdb prepar prima di wpdb-> insert?

Se sto inserendo valori in una tabella di wordpress usando wpdb-> insert, devo "pulire" i miei dati prima di inserirli o questo metodo (wpdb-> insert) lo fa per me?

Risposte:


21

No, non dovresti preparare o sfuggire ai dati, questo è fatto per te dalla wpdbclasse.

Dal riferimento alla classe wpdb :

dati :

(array) Dati da inserire (nella colonna => coppie di valori). Sia le colonne $ data che i valori $ data devono essere "non elaborati" (né deve essere eseguito l'escaping di SQL).

Se, tuttavia, stavi scrivendo il tuo SQL anziché utilizzare il insertmetodo, allora sì, dovresti evitare di usarlo prepare.


8
Per aggiungere una nota: entrambi inserte updatenon è necessario. Ma dovrebbe essere usato con query.
Kaiser,

1

Di seguito è riportato un avviso per la classe wpdb.

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

Un avvertimento

Alcune delle funzioni di questa classe accettano un'istruzione SQL come input. È necessario escludere SQL da tutti i valori non attendibili incorporati nella query SQL per impedire attacchi di iniezione SQL. Controlla la documentazione per vedere se la funzione che prevedi di utilizzare esegue l'escape di SQL per te o si aspetta che sia pre-escape.

Quindi ho letto questo come - la classe wpdb non prepara o scappa automaticamente i dati per te.

Sono abbastanza sicuro che se non puoi fidarti al 100% dell'origine dati nel tuo codice, allora suggerisco di usare la classe di preparazione (?).

Non pensare che l'uso della classe apprendi lo risolverà senza usare correttamente la classe prep. Sono abbastanza nuovo per questo, quindi si prega di inviare eventuali correzioni come risposta se non ho ragione.

$ wpdb-> preparazione ("SELEZIONA * DA tabella DOVE ID =% d AND nome =% s", $ id, $ nome);

Nell'istruzione precedente, 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 = numero intero e% f = float.

Inoltre, dalla mia lettura, se non metti gli attributi extra, allora in realtà non farà nulla. Ci sarà un avvertimento, ma se lo spegni, forse non lo saprai.

Ecco un esempio dal riferimento di classe stesso in cui aggiungono una classe di preparazione in un INSERT di seguito.

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

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

La mia preoccupazione è che la risposta votata non sia corretta secondo la stessa pagina a cui "nessuno" fa riferimento. Presumo che tu usi prepari () ma non altri metodi php standard di escape perché ho preso anche questa risposta come corretta ... fino a quando non ho scavato più a fondo.

Comunque ... forse le cose sono cambiate rispetto alla risposta originale.


hmmm, sembra più una domanda che una risposta
Mark Kaplun,

La risposta accettata è corretta Quando usi funzioni come $wpdb->insert()$ wpdb-> update () `oi $wpdb->delete()dati dovrebbero essere RAW. In una situazione in cui usi eg $wpdb->query()e passi l'istruzione SQL come input, dovresti evitare dati non attendibili.
nmr

nmr, penso di aver capito adesso. Quindi per chiarire ... per mia sanità mentale ... quello che hai usato come esempio è "il metodo insert e" il metodo delete "al contrario degli esempi che ho usato per usare" il metodo query "... (% wpdb -> query). Posso cancellare la mia risposta? O lasciarlo?
Felixius,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.