W jakich kontekstach wtyczki są odpowiedzialne za sprawdzanie poprawności / dezynfekcję danych?

17

Chcę się upewnić, że wszystkie dane w moich wtyczkach / motywach są bezpiecznie obsługiwane przed wejściem do bazy danych i przed wysłaniem do przeglądarki. Mój problem polega na tym, że istnieją sytuacje, w których interfejs API zajmuje się czyszczeniem dla Ciebie - na przykład podczas zapisywania pól meta - i inne, w których autor wtyczki / motywu jest w pełni odpowiedzialny za to - na przykład podczas zapisywania ustawień niestandardowych.

Jeśli chodzi o zakres tego pytania, nie martwię się o sprawdzanie poprawności danych na poziomie domeny - np. Sprawdzanie, czy pole Wiek w formularzu ma wartość od 0 do 120 lub czy adres e-mail jest prawidłowy. Martwię się tylko o bezpieczeństwo - np. Unikanie zapytań SQL, aby uniknąć wstrzyknięcia SQL podczas zapisywania do bazy danych, lub czyszczenie danych, które są wyprowadzane do szablonów HTML, aby uniknąć XSS.

Dla wyjścia sanityzacji, wiem, że zawsze trzeba korzystać z funkcji takich jak esc_html()i esc_attr()kiedy echo'ing zmiennych do szablonów HTML. Ale co z użyciem tagów szablonów ? Czy wszyscy już oczyszczają produkt? Jeśli tak, to w jakim kontekście (ogólny HTML, atrybuty znaczników itp.)? Niektóre funkcje mają warianty dla różnych kontekstów (jak the_title_attribute(), ale większość nie.

W przypadku dezynfekcji danych wejściowych wiem, że muszę tego używać $wpdb->prepare()podczas ręcznego wysyłania zapytań, ale co z używaniem interfejsu API ustawień do utworzenia strony ustawień wtyczki lub zapisaniem pól meta post dla niestandardowego typu postu?

W tej chwili właśnie przeglądałem Core i czytałem tutoriale za każdym razem, gdy korzystam z funkcji, aby dowiedzieć się, czy się odkaża, czy nie, ale jest to podatne na błędy i czasochłonne. Mam nadzieję znaleźć jakąś kompleksową listę wszystkich możliwych sytuacji i tego, czy API to obsługuje, czy nie. na przykład,

API sprawdza / odkaża

  • Zapisywanie meta postu za pomocą update_postmeta()
  • Zapisywanie meta użytkownika za pomocą update_user_meta()
  • Wypisywanie tytułu postu - użyj odpowiedniego kontekstowo wariantu the_title()
  • itp

Musisz ręcznie sprawdzić poprawność / odkażać

  • Zapisywanie opcji wtyczki za pomocą interfejsu API ustawień. Przekaż wywołanie zwrotne jako trzeci parametr parametru register_setting().
  • Bezpośrednie zapytania do bazy danych: Zawiń zapytanie $wpdb->prepare().
  • Wyprowadzanie zmiennych w HTML. Zastosowanie esc_attr(), esc_html()itp
  • itp

Byłbym również zainteresowany, aby zrozumieć, dlaczego interfejs API zapewnia go w niektórych sytuacjach, ale nie w innych. Zakładam, że ma to związek z nieznaną naturą danych, ale chciałbym usłyszeć dokładne wyjaśnienie.

Ian Dunn
źródło
Podoba mi się to pytanie. Mam taką samą myśl jak ty. Myślę, że jeśli istnieje taka lista, kiedy musimy ręcznie zatwierdzać / dezynfekować, byłoby świetnie. +1.
Anh Tran,
1
@Rilwis, proszę zobaczyć moją odpowiedź. Zawsze musisz potwierdzić. Sanityzacja jest trudniejsza, ponieważ „bezpieczny” zależy od kontekstu. Generalnie, w przypadku korzystania z interfejsu API WordPress WordPress znanych danych ( the_title(), the_permalink()etc), które są w porządku, ale z danych niestandardowych nie są (na przykład get_post_meta()). W razie wątpliwości oczyść siebie - to nie zaszkodzi.
Stephen Harris,
@StephenHarris: Przeczytałem twój komentarz. Ja też to wiem. Ale mam taką samą opinię jak Ian Dunn. Myślę, że głównym powodem, dla którego pyta, jest „zrób tyle, nie więcej, nie mniej”.
Anh Tran,
1
Właściwie nie mam nic przeciwko błędom po stronie ostrożności i zbyt dużej walidacji / urządzeń sanitarnych, ale myślę, że zdarzają się przypadki, w których dwukrotna ucieczka może być problemem.
Ian Dunn,

Odpowiedzi:

15

Istnieją tutaj dwie koncepcje:

  • walidacja - upewnienie się, że dane są poprawne , tzn. liczba całkowita jest liczbą całkowitą, data jest datą (w odpowiednim formacie itp.). Należy to zrobić tuż przed zapisaniem danych.
  • sanitisation - czyni datę bezpieczną do użycia w bieżącym kontekście (np. ucieczka zapytań SQL lub ucieczka HTML na wyjściu).

Walidacja, prawie ogólnie, zależy wyłącznie od Ciebie . Wiesz, jakich danych żądasz od użytkownika i wiesz, jakich danych oczekujesz - WordPress nie. Sprawdzanie poprawności zostanie przeprowadzone na przykład na save_posthaku przed zapisaniem go w bazie danych update_post_meta, lub można to zrobić poprzez określenie funkcji zwrotnej w API ustawień, wywoływanej tuż przed zapisaniem danych przez WordPress.

Sanityzacja jest nieco bardziej mieszana. W przypadku danych, o których WordPress natywnie wie (np. Kafelek wpisu), możesz mieć pewność, że WordPress już zapewnił bezpieczeństwo danych. Jednak „bezpieczny” zależy od kontekstu; to, co jest bezpieczne do użycia na stronie, niekoniecznie jest bezpieczne jako atrybut elementu. Stąd WordPress mają różne funkcje dla różnych kontekstach (np the_title(), the_title_rss(), the_title_attribute()) - więc trzeba użyć właściwy .

W przeważającej części wtyczka może zajmować się post meta - a może danymi zdarzeń z niestandardowej tabeli. WordPress nie wie, czym są te dane i do czego służą, więc z pewnością nie wie, jak je zabezpieczyć. To zależy od ciebie . Jest to szczególnie ważne w użyciu esc_url(), esc_attr(), esc_textarea()etc aby zapobiec niewłaściwemu wejście od mogąc kod do umieszczenia na stronie. Ponieważ WordPress wie, next_posts()że powinien wydrukować adres URL strony, ma zastosowanie esc_url()- ale w przypadku meta post, powiedzmy, nie wie, że przechowuje adres URL - lub co chcesz z nim zrobić (jeśli drukujesz esc_url(), jeśli przekierowujesz) esc_url_raw(). Jeśli w dobut - zachowaj ostrożność i uniknij go sam - i zrób to tak późno, jak to możliwe.

Wreszcie - co z zapisywaniem danych? Czy musisz więc uczynić to bezpiecznym? Jak wspomniano wy zrobić potrzebę, aby upewnić danych jest poprawny. Ale jeśli za pomocą API (WordPress wp_insert_post(), update_post_meta()etc), wtedy nie trzeba zdezynfekować danych - bo podczas zapisywania danych tylko odkażania trzeba robić jest ucieczka SQL - i robi to WordPress. Jeśli korzystasz z bezpośrednich instrukcji SQL (powiedzmy do odczytu / zapisu danych z niestandardowej tabeli), powinieneś użyć tej $wpdbklasy, aby pomóc w odkażaniu zapytań.

Napisałem ten post na blogu dotyczący oczyszczania i sprawdzania poprawności danych, które mogą okazać się pomocne - w nim mówię o tym, czego się od ciebie oczekuje pod tym względem.

Stephen Harris
źródło
Hej Stephan, dzięki za wyjaśnienie. To pomogło mi zrozumieć to trochę lepiej, ale tak naprawdę szukam czegoś w rodzaju obszernej listy, takiej jak podany przykład. Wygląda na to, że Twoim podejściem jest odgadnięcie, czy WP radzi sobie z tym, czy też nie, lub pomyłka po stronie ostrożności i zawsze odkażanie. Czułbym się bardziej pewny, gdybym miał wiarygodną i wyczerpującą listę, niż polegać na moim zrozumieniu. Martwię się również, że podwójne ucieczki mogą prowadzić do problemów.
Ian Dunn
Właśnie zaktualizowałem pytanie, aby wyjaśnić kilka rzeczy.
Ian Dunn,
0

Nie jestem pewien, czy jest to tak dokładne, ale w przypadku dowolnej wtyczki lub motywu dane użytkownika powinny zostać oczyszczone. Operacje na bazie danych powinny być wykonywane przy użyciu metod $ wpdb->. Wszystkie dane $ _GET i $ _POST powinny zostać zdezynfekowane.

Jest to najlepsza praktyka programowania PHP niż WordPress.

Podsumowując, jeśli istnieje funkcja WordPress, użyj jej, jeśli nie, odkaż swoje zmienne i wprowadź dane samodzielnie.

Gdybym był zbyt niejasny, proszę zadać bardziej szczegółowe pytanie.

Ciprian
źródło
3
Rozumiem, że zawsze trzeba je dezynfekować, ale pytanie dotyczy tego, kto dokonuje dezynfekcji w każdej konkretnej sytuacji. Czasami WordPress robi to automatycznie, a czasem musisz to zrobić ręcznie. Zaktualizowałem pytanie, aby było bardziej jasne.
Ian Dunn,
Nawet podczas korzystania z update_user_meta () nadal musisz ją zweryfikować, ponieważ zaktualizowane wartości mogą pochodzić z odsłoniętej formy lub z danych wejściowych użytkownika. Jeśli jest to wartość pochodząca ze skryptu, na przykład decyzja wewnętrzna, z pętli if / else, nie powinieneś jej dezynfekować.
Ciprian
1
Wartość można przejść do update_user_meta()dostaje przepuszcza stripslashes_deep()i sanitize_meta()w update_metadata(), a następnie $wpdb->prepare()w $wpdb->update(). Więc nie sądzę, że musisz to odkażać. Czy coś brakuje?
Ian Dunn