wpdb->insert: trebuie să folosesc prepare împotriva injecției SQL?

15 aug. 2011, 14:57:46
Vizualizări: 24.1K
Voturi: 21

Trebuie să folosesc wpdb prepare înainte de wpdb->insert?

Dacă inserez valori într-un tabel WordPress folosind wpdb->insert, trebuie să "curăț" datele înainte de inserare sau această metodă (wpdb->insert) face asta pentru mine?

0
Toate răspunsurile la întrebare 3
1
24

Nu, nu trebuie să pregătiți sau să escapați datele, acest lucru este făcut pentru dumneavoastră de clasa wpdb.

Din referința clasei wpdb:

data:

(array) Date de inserat (în perechi coloană => valoare). Atât coloanele $data cât și valorile $data ar trebui să fie "raw" (niciuna nu ar trebui să fie escapată pentru SQL).

Dacă, totuși, ați scrie propriul SQL în loc să folosiți metoda insert, atunci da, ar trebui să escapați folosind prepare.

15 aug. 2011 15:23:11
Comentarii

Pentru a adăuga o notă: Atât insert cât și update nu au nevoie de asta. Dar ar trebui folosit cu query.

kaiser kaiser
15 aug. 2011 15:27:33
3

Următorul text reprezintă un avertisment pentru clasa wpdb.

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

Un avertisment

Unele dintre funcțiile din această clasă primesc o instrucțiune SQL ca intrare. Trebuie să escapați toate valorile nesigure pe care le integrați în interogarea SQL pentru a preveni atacurile de tip SQL injection. Verificați documentația pentru a vedea dacă funcția pe care intenționați să o folosiți escapează automat SQL sau dacă se așteaptă ca datele să fie deja escapanate.

Deci, eu înțeleg asta ca - clasa wpdb nu pregătește sau escapează automat datele pentru tine.

Sunt destul de sigur că dacă nu poți avea încredere 100% în sursa datelor din codul tău, atunci sugerez să folosești clasa prepare(?).

Nu crede că folosirea clasei prepare va rezolva problema fără să o folosești corect. Sunt destul de nou în acest domeniu, așa că te rog să postezi orice corecție ca răspuns dacă nu am dreptate.

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

În instrucțiunea de mai sus, există 2 atribute suplimentare. Unul pentru ID și unul pentru nume. Din câte am citit, fiecare corespunde în ordine cu numărul de elemente din interogarea ta. De asemenea, %s = string, %d = întreg și %f = număr zecimal.

Tot din câte am citit, dacă nu adaugi atributele suplimentare, atunci prepare nu va face nimic. Va apărea un avertisment, dar dacă îl dezactivezi, poate nu vei ști.

Iată un exemplu din referința clasei în sine unde se adaugă o clasă prepare într-o instrucțiune INSERT mai jos.

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 ) ) );

Preocuparea mea este că răspunsul cu cele mai multe voturi este incorect conform aceleiași pagini pe care o citează 'nimeni'. Presupun că trebuie să folosești prepare(), dar nu și alte metode standard de escape din PHP, deoarece am considerat și acest răspuns corect... până când am cercetat mai în profunzime.

Oricum... poate lucrurile s-au schimbat de la răspunsul original.

28 aug. 2018 09:36:56
Comentarii

hmmm, asta sună mai degrabă ca o întrebare decât un răspuns

Mark Kaplun Mark Kaplun
28 aug. 2018 10:28:21

Răspunsul acceptat este corect. Când folosești funcții precum $wpdb->insert(), $wpdb->update()sau$wpdb->delete()datele ar trebui să fie RAW. Într-o situație în care folosești de exemplu$wpdb->query()` și transmiți o declarație SQL ca input, ar trebui să escape datele nesigure.

nmr nmr
28 aug. 2018 13:22:14

nmr, cred că am înțeles acum. Deci pentru a clarifica... pentru liniștea mea... ce ai folosit ca exemplu este 'metoda insert' și 'metoda delete' în opoziție cu exemplele pe care le-am folosit eu folosind 'metoda query' ... (%wpdb->query). Șterg răspunsul meu? Sau îl las?

Felixius Felixius
29 aug. 2018 11:39:27
0

Nu, nu este nevoie să te protejezi împotriva injecțiilor SQL atunci când folosești funcțiile wpdb insert sau wpdb delete.Securitate SQL în WordPress

Consultă următoarele linkuri:

https://codex.wordpress.org/Data_Validation#Database

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

3 dec. 2018 14:24:48