Wiele razy widziałem ludzi mówiących, aby nie używać niestandardowego filtru PHP / PHP (z interfejsu użytkownika Drupala) w blokach, węzłach, widokach-argumentach, regułach itp. Szukałem trochę i nie znalazłem wiele, wygląda na to, że jest to najlepsza praktyka Drupala, którą wszyscy „po prostu wiedzą”.
Rozumiem, że stanowi to potencjalne zagrożenie bezpieczeństwa, szczególnie w rękach użytkowników końcowych lub osób, które nie znają Drupala lub PHP, ale jako programista / konstruktor witryn, jakie są prawdziwe powody, aby nie używać niestandardowego PHP z interfejsu użytkownika Drupal?
Odpowiedzi:
Niektóre powody:
Może być więcej powodów, ale to powinno wystarczyć :)
źródło
require_once $_SERVER['DOCUMENT_ROOT'].'/sites/all/themes/myTheme/php/stuff.php';
i napisać resztę kodu w swoim edytorze IDE / tekst. Czasami nie jest to łatwe zadanie lub stworzenie własnego modułu zajęłoby bardzo dużo czasu, nawet jako dobry programista PHP. Jeden krótki przykład: akcje warunkowe Ubercart. Ale to prawda, że nie warto trzymać naszego kodu w db.Ten kod jest trudny do debugowania i obsługi. Nie znam żadnego sposobu użycia kontroli wersji dla takiego rodzaju kodu php.
I to naprawdę potencjalne zagrożenie bezpieczeństwa dla osób, które nie znają Drupala lub PHP,
źródło
Biorąc pod uwagę przypadek użycia filtru PHP w węźle, powodem jego nieużywania jest ograniczenie użytkowników, którzy mogą edytować ten węzeł, jeśli nie chcesz zezwalać wszystkim użytkownikom na używanie filtru PHP.
Zamiast używać filtru PHP, lepiej jest użyć niestandardowego modułu, który zamienia określony tekst w treści węzła wynikiem kodu, który wykonuje (bez użycia
eval()
), lub dołącza własny tekst do treści treści węzłów. W takim przypadku każdy użytkownik może edytować węzeł bez uprawnień do dodawania dowolnego kodu PHP, który jest następnie uruchamiany przez filtr PHP.Zasadniczo lepiej jest go unikać,
eval()
ponieważ zmniejsza on czytelność kodu, zdolność do przewidywania ścieżki kodu (i możliwe implikacje związane z bezpieczeństwem) przed uruchomieniem, a tym samym możliwość debugowania kodu.Poza witryną programistyczną lub testową nie włączałbym filtra PHP ani nie używałbym przekazywanego kodu PHP
eval()
.Filtr PHP został usunięty z Drupala 8. Jest to teraz moduł innej firmy , nie objęty polityką bezpieczeństwa . Jest to prawdopodobnie powód, dla którego nie należy go używać na serwerach produkcyjnych (jeśli podane już powody cię nie przekonały).
źródło
Aby obejść różne problemy opisane powyżej - trudność w utrzymywaniu kodu, kontroli wersji, wyszukiwaniu błędów, masz tę nieco „klugey” możliwość:
Twórz funkcje (nazywaj je ostrożnie, zgodnie z tym, co robią) w pliku, który zawsze jest dołączany - jeśli masz niestandardowy moduł, który piszesz dla witryny, to świetne miejsce na umieszczenie tych funkcji. Php, który wpisujesz, to po prostu:
return my_specialfunc($somevar);
-$somevar
tutaj potencjalnie jest to obiekt węzła, nad którym pracujesz , lub jakiekolwiek inne zmienne, które są tutaj istotne.Uważam, że nadal zazwyczaj chcę elastyczności w niektórych miejscach, aby wywoływać własny kod. Przy użyciu tej techniki utrzymanie kodu jest łatwe, ponieważ jest to po prostu kwestia modyfikacji funkcji w pliku. Wykrywanie błędów jest łatwe, ponieważ funkcja pojawi się w śladzie wstecznym.
Zauważ jednak, że to nie rozwiązuje potencjalnych problemów bezpieczeństwa. Są one w dużej mierze zależne od bezpieczeństwa rdzenia Drupala. Zasadniczo kod zawarty w bazie danych jest często piętą achillesową bezpieczeństwa - funkcje korzystające z kodu zawartego w bazie danych są zwykle bardziej podatne na wykorzystanie, a bezpieczeństwo wokół nich musi być bardzo ścisłe. Jednak Drupal ogólnie był całkiem dobry w utrzymywaniu bezpieczeństwa dla tych problemów - powstały, a następnie szybko załatały / rozwiązały nowe wydania.
źródło
Oto powód luki w zabezpieczeniach, aby uniknąć udzielania tego uprawnienia użytkownikom, jeśli nie chcesz, aby użytkownicy niebędący administratorami bezpośrednio modyfikowali bazę danych.
Włamanie poświadczeń db Drupal
źródło
Zamiast robić coś podobnego
return functionname($object)
, lepiej, o ile to możliwe, używać systemu tokenów / filtrów. Istnieją moduły takie jak Wstaw widok i Osadź węzeł, które mogą pomóc w typowych okolicznościach, w których ludzie chcieliby osadzić PHP w ciałach węzłów lub bloków.źródło
Powinieneś dbać o przenośność swoich danych. Co się stanie, jeśli migrujesz swoje węzły z drupal 7 do drupal 8, a treść niektórych węzłów zawiera
<?php whatever_function_that_does_not_exist_anymore(); ?>
w sobie?Nie myśl o swoim projekcie w ciągu 5 miesięcy, ale w ciągu 5 lat. Aktualizacje, dobre praktyki i przenośność są moim zdaniem ważnymi aspektami każdego dobrego projektu informatycznego.
Jednym z aspektów tego jest również korzystanie z jak najmniejszej liczby modułów.
źródło