Резервно копие в уеб директорията е изтичане на изходен код
Преди да редактирате голям файл, естественият ход е първо да го копирате. cp index.php index.php.vor-aenderung, после работа. Ако този файл се намира в директорията, която уеб сървърът публикува, целият изходен код току-що е станал достъпен за изтегляне като обикновен текст — данни за достъп до базата данни, тайни ключове, всичко, което файлът съдържа.
Apache изпълнява index.php чрез PHP, защото завършва на .php. index.php.vor-aenderung не завършва на .php. Завършва на .vor-aenderung, за което Apache никога не е чувал, затова прави това, което прави по подразбиране, и изпраща байтовете.
Правилото, което пишат повечето хора, и защо не е достатъчно
Обичайната защита е списък със забранени разширения: .bak, .orig, .save, .sql, .old. Той хваща файла, за който някой се е сетил. При проверка тук този списък даде правилния отговор за probe.bak и грешния отговор за всеки от тези:
index.php.vor-xyz— така се случи в действителностindex.php.2026-08-19index.php.kopiestyle.css.altindex.php.1
Всички се сервират с 200. Използва се точно схемата за именуване, за която никой не се е сетил, защото резервните копия се кръщават на това, което се е случвало в момента.
Обърнете проверката
Правилото, което работи, не пита кои разширения са забранени. То задава структурен въпрос: съдържа ли това име на файл разширение за изходен код, което не е в края?
Ако съдържа, това е копие на нещо, което е трябвало да се изпълнява, каквото и да казва наставката след него. index.php.anything съвпада. style.css.anything съвпада. Шаблонът обхваща и имената, които никой още не е измислил, и в това е целият смисъл.
При проверка на работещия сървър днес всичките пет имена по-горе вече връщат 403, включително онези, които не съществуват — правилото отказва формата, а не файла.
Изключението и какво ни учи
Едно легитимно име на файл тук има точно тази форма: предварително компресираните ресурси се записват като style.css.1787777226.gz, с разширение по средата по замисъл. Затова правилото има едно-единствено тясно изключение за цифров сегмент, последван от .gz, и този файл връща 200, както трябва.
Именно при такива изключения тези правила обикновено се объркват, затова си струва да се каже какво прави това изключение безопасно: то е достатъчно тясно, за да не може да се състави index.php.something.gz за изтегляне на изходния код, защото средният сегмент трябва да съдържа само цифри. По-широко изключение — „всичко, което завършва на .gz“ — би обезсмислило цялото правило.
А най-простият съвет остава този, който прави всичко това ненужно: пазете резервните копия извън публикуваната директория. Правилото е предпазна мрежа за деня, в който това бъде забравено, а не разрешение да спрете да се интересувате къде попада копието.