wpdb-> insert: czy muszę przygotować się na iniekcję SQL?

14

Czy muszę używać przygotowania wpdb przed wpdb-> insert?

Jeśli wstawiam wartości do tabeli wordpress za pomocą wpdb-> insert, czy muszę „wyczyścić” moje dane przed wstawieniem go, czy też ta metoda (wpdb-> insert) robi to dla mnie?

redconservatory
źródło

Odpowiedzi:

21

Nie, nie powinieneś przygotowywać ani uciekać z danych, robi to dla ciebie wpdbklasa.

Z odwołania do klasy wpdb :

dane :

(tablica) Dane do wstawienia (w kolumnie => pary wartości). Zarówno kolumny danych $, jak i wartości danych $ powinny być „nieprzetworzone” (żadna z nich nie powinna mieć znaku ucieczki SQL).

Jeśli jednak piszesz własny SQL, a nie przy użyciu tej insertmetody, to tak, powinieneś uciec przed użyciem prepare.

nikt
źródło
8
Aby dodać notatkę: Oba inserti updatenie potrzebują tego. Ale należy go używać z query.
kaiser
1

Poniżej znajduje się ostrzeżenie dla klasy wpdb.

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

Ostrzeżenie

Niektóre funkcje w tej klasie przyjmują jako dane wejściowe instrukcję SQL. Aby uniknąć ataków polegających na wstrzykiwaniu SQL, SQL musi uciekać od wszystkich niezaufanych wartości, które włączasz do zapytania SQL. Zapoznaj się z dokumentacją, aby sprawdzić, czy funkcja, której zamierzasz użyć, zastępuje SQL dla Ciebie, czy też oczekuje, że zostanie ona wstępnie zablokowana.

Czytam więc to jako - klasa wpdb nie przygotowuje automatycznie ani nie ucieka z danych dla Ciebie.

Jestem pewien, że jeśli nie możesz w 100% zaufać źródłu danych w swoim kodzie, sugeruję użycie klasy przygotowawczej (?).

Nie myśl, że użycie klasy przygotowawczej naprawi ją bez właściwego użycia klasy przygotowawczej. Jestem w tym dość nowy, więc jeśli nie mam racji, proszę opublikować wszelkie poprawki w odpowiedzi.

$ wpdb-> przygotuj ("WYBIERZ * Z tabeli GDZIE ID =% d ORAZ nazwa =% s", $ id, $ nazwa);

W powyższym zestawieniu istnieją 2 dodatkowe atrybuty. Jeden dla identyfikatora i jeden dla imienia i nazwiska. O ile czytam, każdy odpowiada w kolejności liczby elementów w zapytaniu. Również% s = ciąg,% d = liczba całkowita i% f = liczba zmiennoprzecinkowa.

Ponadto, z mojej lektury, jeśli nie wprowadzisz dodatkowych atrybutów, wtedy przygotowanie nic nie zrobi. Pojawi się ostrzeżenie, ale jeśli je wyłączysz, być może nie będziesz wiedział.

Oto przykład z samego odwołania do klasy, w którym dodają klasę przygotowawczą do INSERT poniżej.

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

$ wpdb-> zapytanie ($ wpdb-> przygotuj („WPROWADŹ DO $ wpdb-> postmeta (post_id, klucz_meta, wartość_meta) WARTOŚCI (% d,% s,% s)”, tablica (10, $ metakey, $ metavalue) ));

Obawiam się, że głosowana odpowiedź jest niepoprawna według tej samej strony, do której odwołuje się „nikt”. Zakładam, że używasz metody prepar (), ale nie innych standardowych metod ucieczki php, ponieważ wziąłem również tę odpowiedź za poprawną ... dopóki nie zagłębiłem się głębiej.

W każdym razie ... może wszystko się zmieniło od czasu pierwotnej odpowiedzi.

Feliksiusz
źródło
hmmm, to brzmi bardziej jak pytanie niż odpowiedź
Mark Kaplun
Zaakceptowana odpowiedź jest poprawna. Gdy korzystasz z funkcji takich jak $wpdb->insert()$ wpdb-> update () `lub $wpdb->delete()dane powinny mieć format RAW. W sytuacji, gdy używasz np. $wpdb->query()I przekazujesz instrukcję SQL jako dane wejściowe, powinieneś uciec niezaufanym danym.
nmr
nmr, myślę, że teraz rozumiem. Aby wyjaśnić ... dla mojego zdrowia psychicznego ... to, czego użyłeś jako przykładu, to „metoda wstawiania” i „metoda usuwania” w przeciwieństwie do przykładów, w których użyłem „metody zapytania” ... (% wpdb -> zapytanie). Czy usunę moją odpowiedź? A może zostawić?
Feliksiusz