Warto ograniczyć bezpośredni dostęp do plików motywów?

31

Od czasu do czasu natrafiam na następujący fragment motywu:

if ( ! defined('ABSPATH')) exit('restricted access');

Jest na początku niektórych (wszystkich?) Plików PHP w motywie i ma zapobiegać bezpośredniemu dostępowi do pliku przez nikczemne źródła.

Widzę, że nie jest to uwzględnione w dwudziestu dziesięciu lub jedenastu i nigdy nie widziałem, aby było to zalecane w oficjalnej dokumentacji WordPress. Wydaje mi się, że to dobry pomysł, ale nie wiem też wystarczająco dużo o bezpieczeństwie, aby go ocenić, i nie mogę wiele znaleźć w Google.

Czy powinienem to mieć w niestandardowych motywach? Jeśli tak, to czy powinno to być we wszystkich plikach PHP, czy tylko w niektórych?

mrwweb
źródło
7
Tylko dla późniejszych czytelników można to napisać krócej i ładniej:defined('ABSPATH') OR exit;
kaiser
lub jeszcze krócej:: defined('WPINC') ? : die();P
Tim Elsass
Zastanawiam się również, czy warto wstawić taki kod, aby uniknąć błędów PHP związanych z niezdefiniowanymi funkcjami w moich dziennikach błędów. Wydaje się, że boty czasami lubią bezpośrednio uderzać w te pliki i dostaję błędy takie jak „Wywołanie niezdefiniowanej funkcji query_posts ()”, ponieważ bootstrap WP nie został załadowany
Matt Keys

Odpowiedzi:

26

Zwykle nie potrzebujesz tego. Ale… jest co najmniej jeden przypadek na krawędzi:

  • Jeśli plik motywu jest częścią szablonu ,
  • i używa zmiennych globalnych z kontekstu wywołującego (plik nadrzędny),
  • a register_globals to on,
  • i po prostu używa tych zmiennych bez kontroli bezpieczeństwa…

… Atakujący może wywołać ten plik, ustawić brakujące zmienne przy pomocy GETlub POSTi sprawić, by plik motywu wydrukował je. A potem jest problem bezpieczeństwa.

Więc… najlepszą opcją nie jest sprawdzenie kontekstu, jak ten z twojego przykładu, ale dobry kod: unikaj zmiennych globalnych, sprawdź ich zawartość przed wydrukowaniem.

W niektórych przypadkach dodam sprawdzenie kontekstu, gdy myślę, że ktoś użyje mojego kodu i zmieni go bez uwzględnienia bezpieczeństwa. To nie boli

fuxia
źródło
Jeśli część szablonu nadal zawiera co najmniej jedno wywołanie funkcji, które spowoduje błąd krytyczny PHP, czy ten scenariusz byłby nadal możliwy?
Chris_O,
@Chris_O Zależy od kolejności pojawiania się.
fuxia
Ma sens i całkowicie zgadza się z innym powodem, aby nie używać zmiennych globalnych między wywołaniami plików.
Chris_O,
1
Zawsze najlepiej być bezpiecznym niż żałować. Zbyt duże bezpieczeństwo nie może zaszkodzić, prawda?
Sean Berg,
2
Jeśli zrobisz wszystko dobrze, nie powinieneś używać kodu, który nie jest potrzebny. To pytanie dowodzi, że utrudnia to przestrzeganie kodu.
fuxia