Kontakt z pomocą

Odpowiadamy e-mailem, zwykle w ciągu dwóch dni.

Google reCAPTCHA sprawdza to zgłoszenie pod kątem nadużyć; dane trafiają do Google. Skrypt ładuje się dopiero po otwarciu formularza.

← Wszystkie wpisy

Kopia w katalogu WWW to wyciek kodu

Przed zmianą dużego pliku naturalnym odruchem jest najpierw go skopiować. cp index.php index.php.przed-zmiana, potem do roboty. Jeśli ten plik leży w katalogu, który serwer WWW publikuje, właśnie udostępniłeś cały swój kod źródłowy do pobrania jako zwykły tekst — dostępy do bazy, sekrety, wszystko, co w pliku akurat stoi.

Apache przepuszcza index.php przez PHP, bo kończy się na .php. index.php.przed-zmiana nie kończy się na .php. Kończy się na .przed-zmiana, o czym Apache nigdy nie słyszał, więc robi rzecz domyślną i wysyła bajty.

Reguła, którą pisze większość, i dlaczego nie wystarcza

Zwykłym zabezpieczeniem jest lista zakazanych rozszerzeń: .bak, .orig, .save, .sql, .old. Łapie ten plik, o którym pomyślałeś. Sprawdzone tutaj, ta lista dała właściwą odpowiedź dla probe.bak i błędną dla każdego z tych:

  • index.php.vor-xyz — tak się to faktycznie zdarzyło
  • index.php.2026-08-19
  • index.php.kopie
  • style.css.alt
  • index.php.1

Wszystkie wydane z kodem 200. Wzorzec nazwy, o którym nie pomyślałeś, to dokładnie ten, którego użyjesz, bo kopie nazywa się od tego, co się akurat robiło.

Odwrócić cięcie

Reguła, która działa, nie pyta, które rozszerzenia są zakazane. Zadaje pytanie o budowę: czy ta nazwa pliku zawiera rozszerzenie kodu, które nie stoi na końcu?

Jeśli tak, to kopia czegoś, co miało być wykonane, cokolwiek mówi przyrostek po nim. index.php.cokolwiek pasuje. style.css.cokolwiek pasuje. Wzorzec obejmuje nazwy, których nikt jeszcze nie wymyślił, i o to właśnie chodzi.

Sprawdzone dziś na działającym serwerze: wszystkie pięć powyższych nazw zwraca teraz 403, także te, które nie istnieją — reguła odmawia kształtowi, nie plikowi.

Wyjątek i czego uczy

Jedna uprawniona nazwa pliku ma tu dokładnie ten kształt: pliki wstępnie skompresowane zapisuje się jako style.css.1787777226.gz, rozszerzenie w środku z założenia. Reguła niesie więc jeden wąski wyjątek dla członu z cyfr, po którym idzie .gz, i ten plik zwraca 200, jak należy.

Na takim wyjątku te reguły zwykle się wykładają, warto więc powiedzieć, co ten czyni bezpiecznym: jest wąski na tyle, że nie da się zbudować index.php.cokolwiek.gz i odzyskać swojego kodu, bo środkowy człon musi składać się z samych cyfr. Szerszy wyjątek — „cokolwiek kończące się na .gz" — oddałby całą regułę z powrotem.

A najprostsza rada pozostaje ta, która czyni to wszystko zbędnym: trzymaj kopie poza publikowanym katalogiem. Reguła to siatka na dzień, w którym zapomnisz, a nie przyzwolenie, żeby przestać się przejmować, gdzie ląduje kopia.

Reklama