2016-11-16 25 views
5

Próbuję zrozumieć, dlaczego Apache wciąż jest w stanie obsłużyć plik PHP po ustawieniu uprawnień 000 i nadaniu własności rootowi plików.Apache wciąż obsługuje plik PHP z niepoprawnymi uprawnieniami

Jeśli utworzę plik PHP należący do serwera sieciowego z uprawnieniami 644, zostanie on poprawnie wyświetlony. Jeśli następnie zmienię uprawnienia na 000 i zmienię prawo własności na root, plik będzie nadal obsługiwany, ale nie sądzę, że powinien nim być!

Jeśli ponownie uruchomię Apache, plik nie zostanie dostarczony. Dostaję 500 i dziennik błędów narzeka, że ​​nie mogę otworzyć pliku, co jest dokładnie takim zachowaniem, jakiego oczekiwałbym.

Po ponownym uruchomieniu, gdy plik nie jest wyświetlany, jeśli zmienię prawo własności na serwer WWW i uprawnienia z powrotem na 644, plik zostanie ponownie dostarczony, bez konieczności ponownego uruchamiania apache.

To zachowanie dotyczy tylko plików PHP. Pliki HTML zachowują się tak, jak się spodziewałem, gdy tylko usuniesz uprawnienia, pliki nie będą wyświetlane.

Zasugerowano mi, że Apache może utrzymywać uchwyt pliku na pliku PHP i że nie widział zmian uprawnień, dopóki nie zostanie ponownie uruchomiony. Próbowałem używać lsof w pliku, ale nie widziałem żadnych otwartych deskryptorów plików.

Próbowałem też eksperymentować, gdzie zacząłem od własności serwera sieciowego i 644 uprawnień, i sprawdziłem, czy plik może być obsługiwany. Następnie zmieniłem nazwę pliku, zmień uprawnienia na 000 i własność na root, a następnie przeniosłem plik z powrotem. Następnie plik był nadal serwowany przez Apache.

Czy ktoś może rzucić światło na to, co się tutaj dzieje?

+0

Poeksperymentuj z: dostęp do 'my.hostname/index.php' przed i po zmianie, a następnie dostęp do' my.hostname/index.php? Itok = randomnumbers', jeśli drugie żądanie się nie powiedzie, to buforowanie. – apokryfos

+0

Czy na pewno witryna nie jest obsługiwana z pamięci podręcznej? – dev0

+0

@apokryfos Sprawdziłem i zdecydowanie nie buforowałem. Zmieniłem skrypt, aby pokazać czas w sekundach i pokazać ciąg zapytania. Wyniki testów opisanych w moim poście są takie same, a czas jest aktualizowany i wyświetlany jest ciąg zapytania (który zmieniam za każdym razem). – Dom

Odpowiedz

5

Najprawdopodobniej to, co się dzieje, to działa opcache. PHP kompiluje się w czasie wykonywania. Aby zaoszczędzić narzutu, PHP 5.5 lub nowszy ma Opcache, który zapisuje ten krok kompilacji. Apache prawdopodobnie buforuje plik. Apache będzie następnie przechowywać plik pamięci podręcznej z własnymi uprawnieniami. Apache może również zapisywać go w pamięci również. Po ponownym uruchomieniu Apache powraca do podstawowego pliku PHP, do którego nie ma już uprawnień.

+0

Yup, właśnie sprawdziłem i jego działanie. Nie sądziłem, że został zainstalowany. – Dom

+1

Podwójne sprawdzanie wszystkich moich wyników z opcache.enable = 0 i działa tak, jak się spodziewałem - odmawiając dostępu do plików z 000 uprawnieniami. Dzięki – Dom