Jakie są najlepsze praktyki bezpieczeństwa dotyczące wtyczek i motywów WordPress? [Zamknięte]

22

Jak zasugerowałem w tym pytaniu , dodaję ten temat jako nowe pytanie do dyskusji społeczności / głosowania na temat najlepszych praktyk w zakresie bezpieczeństwa wtyczek / motywów.

Oto początkowa lista kontrolna, oparta na moich bieżących (w toku) ustawieniach / liście kontrolnej bezpieczeństwa danych używanych do przeglądania Motywów (zasady nie powinny się różnić dla Wtyczek niż dla Motywów).

Jeśli chcesz sprawdzić motyw z bezpieczną i solidnie zakodowaną stroną ustawień motywu, sprawdź ten motyw:
http://wordpress.org/extend/themes/coraline

Chip Bennett
źródło
Jeśli ktoś z odpowiednimi uprawnieniami nie miałby nic przeciwko uczynieniu z tego wiki społeczności?
Chip Bennett
Aby uzyskać pytanie w trybie wiki, mod musi odpowiednio otagować pytanie , oznaczyłem je dla uwagi mod, teraz jest to tylko kwestia czasu .. :)
t31os 30.03.11
Co jest takiego specjalnego w koralowcach? Imo wciąż istnieją sposoby na wejście. Sugeruję link anons Insted: wordpress.stackexchange.com/questions/13539/…
kaiser
W Koralinie może nie być nic szczególnego. Jest to po prostu ten, na który obecnie zwracamy uwagę twórców motywów podczas recenzowania motywów, ponieważ był to przykład podany przez Justina Tadlocka, który dokonał wielu wstępnych recenzji motywów dotyczących bezpieczeństwa. Podałbym również enologię jako dobry przykład, ale nie chcę, aby próbowałem ulepszyć mój własny motyw. :)
Chip Bennett

Odpowiedzi:

12

Oczyść, zweryfikuj i usuń dane

Wyczyść wszystko, co mogłoby dostać się do bazy danych (!) I wyjść z niej zarówno!

Wtyczki i motywy powinny poprawnie sprawdzać poprawność danych:

  1. Sprawdź poprawność i odkaż wszystkie niezaufane dane przed wprowadzeniem danych do bazy danych
  2. Usuń wszystkie niezaufane dane, zanim zostaną wydrukowane w polach formularza Ustawienia
  3. Usuń wszystkie niezaufane dane, zanim zostaną wydrukowane w plikach szablonów kompozycji

Wtyczki i motywy powinny być używane esc_attr()do wprowadzania tekstu i / esc_html()lub esc_textarea()do obszarów tekstowych.

Dostępny również z API WordPress jest esc_url(), esc_url_raw(), esc_js()i wp_filter_kses().

Zły przykład:

<?php $url = 'javascript:pwnd()'; ?>
<a href="<?php echo $url; ?>">anchor</a>

Dobry przykład:

<a href="<?php echo esc_url($url); ?>">anchor</a>

Oto świetne wideo Marka Jaquitha wyjaśniające użycie funkcji zmiany znaczenia:

Chris_O
źródło
3
Sanitize po drodze, ucieczka po drodze .. :)
t31os 30.03.11
9

Używaj tylko $ _GET / $ _POST / $ _REQUEST ostrożnie, gdy lepsze interfejsy API są niedostępne

Wtyczki i motywy powinny używać ustawień API, aby uzyskać i zapisać dane wejściowe forma zamiast polegać na $_POSTi $_REQUESTdane bezpośrednio.

Rarst
źródło
3
Zawsze traktuj $ _POST, $ _REQUEST i $ _GET jako niebezpieczne. Wyczyść i dodaj do białej listy wartości z tych tablic i umieść je we własnych zmiennych. Nigdy nie dezynfekuj wartości pochodzących od użytkownika i nie wkładaj ich z powrotem do $ _POST.
goldenapples 30.03.11
2
Zawsze sprawdź, czy klucz, którego chcesz użyć, jest ustawiony w odpowiedniej tablicy. isset () jest twoim przyjacielem :)
mfields
9

Posługiwać się $wpdb->prepare

Podczas budowania niestandardowych zapytań za pomocą $wpdbobiektu zawsze używaj $wpdb->preparedo wypełniania symboli zastępczych wartościami zamiast zapisywania zapytań danymi pomieszanymi z kodem SQL, ponieważ mysql_*funkcje rodziny źle nauczyły wszystkich.

Matteo Riva
źródło
$wpdb->prepareto nie to samo, co przygotowane oświadczenia.
hakre
8

Uważaj na funkcje PHP, które mogą być użyte do uruchamiania złośliwego kodu

Miłej lektury dla każdego, kto pisze PHP: Funkcje PHP do wykorzystania na StackOverflow.

Użyj interfejsu API modyfikacji motywów

Motywy powinny używać set_theme_mod()i powiązanych funkcji, a nie wymyślonego przez siebie schematu nazw.
Theme_mod API to specjalna warstwa dla interfejsu API ustawień; gwarantuje unikalne nazwy, umieszcza wszystkie opcje w jednej tablicy i - z mojego doświadczenia - jest o wiele łatwiejszy w obsłudze. Ponadto oferuje znormalizowane filtry dla wtyczek - co jest dobre dla interoperacyjności.

Unikaj włączone register_globals

Nie polegaj na register_globals = on. Pro Theme który kupił mój ostatni klient robi dokładnie to. Mogę
zhakować dowolną witrynę przy użyciu tego motywu w 5 minut… ThimbThumb też to zrobił (i nadal tak robi?).

Nie twórz plików z niepotrzebnymi szerokimi uprawnieniami dostępu

Nie twórz plików ze zbyt swobodnymi uprawnieniami dostępu.

Użyj protokołu SSL, jeśli jest dostępny

Skieruj swój udział na Twitterze / Facebooku / Cokolwiek linki do URI HTTPS, jeśli są dostępne. Ważne jest także bezpieczeństwo czytelnika.

fuxia
źródło
2
Czy możesz rozwinąć set_theme_mod(), w szczególności, jak prawidłowo połączyć to z użyciem interfejsu API ustawień?
Chip Bennett
@Chip Bennett Do mojej odpowiedzi dodałem kilka informacji.
fuxia
Czy możesz podzielić tę mini-listę na mniejsze, bardziej szczegółowe odpowiedzi? Łatwiejsze zarządzanie wiki społeczności w mniejszych porcjach. TIA
Rarst
3
Chip: system modów Theme nie integruje się zbyt dobrze z API ustawień. Niedługo napiszę post wyjaśniający, jak zrobić to dobrze.
Otto,
7

Zapisz dane w jednej tablicy

Wtyczki i motywy powinny zapisywać opcje w jednej tablicy, zamiast tworzyć wiele opcji dla strony ustawień. Skorzystałby z tego interfejs API ustawień.

Chip Bennett
źródło
6

Sprawdź odpowiednie możliwości podczas dodawania i wysyłania stron ustawień

Wtyczki powinny korzystać z odpowiednich możliwości (np. manage_options), Aby móc dodać stronę ustawień.

Motywy powinny być używane edit_theme_optionsjako odpowiednia możliwość dodania strony ustawień.

Rarst
źródło
1
Mała, ale ważna uwaga: nie można używać edit_theme_optionsz interfejsem API ustawień, przesyłanie opcji jest zakodowane na sztywno, aby wymagać manage_optionsaktualizacji. Powiązany bilet Trac można znaleźć tutaj .
t31os
To prawda, ale 1) będzie to miało wpływ tylko na redaktorów, a nie administratorów; oraz 2) mam nadzieję, że wkrótce zostanie to rozwiązane za pośrednictwem połączonego biletu Trac.
Chip Bennett
Zawsze istnieje możliwość nadania roli niestandardowej lub zwykłej roli edit_theme_options, pomyślałem, że przydałoby się zauważyć, że interfejs API ustawień w jego obecnym stanie jest użyteczny tylko przez role z manage_optionsfunkcją.
t31os
5

Korzystaj z aktualnych samouczków i informacji

Wtyczki i motywy powinny celowo wdrażać strony opcji i ustawień, a nie polegać na nieaktualnych samouczkach kopiowania i wklejania stron internetowych, które nie obejmują odpowiedniego bezpieczeństwa danych, takich jak te wymienione poniżej.

Przykłady tego, czego nie należy robić :

T31os
źródło
1
Dodałem trochę podkreślonego tekstu, aby wskazać, że linki są przykładami tego, czego nie należy robić, ponieważ łatwo jest przeglądać informacje i klikać łącza bez czytania poprzedzającego je akapitu.
Sprawiłem
2
Przydałoby się to trochę wyjaśnienia, co dokładnie robią przykładowe samouczki w niewłaściwy i / lub stary sposób.
Rarst
4

Użyj interfejsu API ustawień

Wtyczki i motywy powinny korzystać z interfejsu API ustawień, który jest łatwiejszy w użyciu, bezpieczniejszy i zajmuje dużo pracy na stronach ustawień:

Dobre samouczki na temat używania interfejsu API ustawień można znaleźć w:

Chip Bennett
źródło
Zobacz mój komentarz do tej odpowiedzi w odniesieniu do ustawień interfejsu API i opcji motywu.
t31os
1

Do wyboru i wybierz Opcje, wtyczki i motywy powinny używać checked()i selected()funkcje do wyprowadzania checked="checked"i selected="selected"odpowiednio.

Chip Bennett
źródło
Naprawdę nie jest to kwestia bezpieczeństwa, chyba że czegoś mi brakuje. Nadal bardzo wygodny i dobry w użyciu. :)
Rarst
Cóż, być może, a może nie. Widziałem DUŻO niestandardowego kodu do osiągnięcia tego samego. Więcej kodów spaghetti = więcej możliwości wprowadzenia zagrożeń bezpieczeństwa. :)
Chip Bennett
Bennet - od mailingu z toscho kilka dni temu - wydaje mi się, że mogę to powiedzieć dla nas obu - najprostsze funkcje są o wiele łatwiejsze do odczytania i zrozumienia niż te funkcje. Nie jestem przygnębiony, ale też nie poprawiam tego. Imo to nie powinno być częścią rdzenia, ponieważ nie dodaje żadnej wartości.
kaiser
2
Ciekawe, co wymyśliliście, to łatwiejsze niż checked( $theme_options['whatever_option'] )lub checked( 'some_value' == $theme_options['whatever_option'] ). Nie wiem, jak to jest bardziej zwięzłe?
Chip Bennett
1

Prefiks nazwy funkcji i zmiennych

Wtyczki powinny poprzedzać wszystkie opcje, funkcje niestandardowe, zmienne niestandardowe i stałe niestandardowe wtyczką.

Motywy powinny poprzedzać wszystkie opcje, funkcje niestandardowe, zmienne niestandardowe i stałe niestandardowe hasłem motywu.

Chip Bennett
źródło
Rozszerzyłbym to na wszystkie nazwy klas, a także nazwy obiektów niestandardowych, takich jak typy post_typów i taksonomie.
pola
1

Użyj polecenia wp_safe_redirect () zamiast wywoływać funkcję PHP (header) bezpośrednio podczas przekierowywania na stronę w tej samej domenie.

mfields
źródło
0

Dodaj strony ustawień do odpowiednich sekcji menu administratora

Wtyczki powinny korzystać z tej add_options_page()funkcji, aby dodać stronę ustawień wtyczek do Settingsmenu, zamiast add_menu_page()dodawać menu najwyższego poziomu.

Motywy powinny używać tej add_theme_page()funkcji, aby dodać stronę ustawień motywu do Appearancemenu, zamiast add_menu_page()dodawać menu najwyższego poziomu.

Chip Bennett
źródło