Връзка с поддръжката

Отговаряме по имейл, обикновено до два дни.

Google reCAPTCHA проверява това изпращане срещу злоупотреби; данни се изпращат към Google. Скриптът се зарежда само когато този формуляр бъде отворен.

← Всички публикации

Резервно копие в уеб директорията е изтичане на изходен код

Преди да редактирате голям файл, естественият ход е първо да го копирате. 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-19
  • index.php.kopie
  • style.css.alt
  • index.php.1
име на файлаотговорprobe.bak403index.php.vor-xyz200index.php.2026-08-19200index.php.kopie200style.css.alt200наивният списък хваща един от пет

Всички се сервират с 200. Използва се точно схемата за именуване, за която никой не се е сетил, защото резервните копия се кръщават на това, което се е случвало в момента.

Обърнете проверката

Правилото, което работи, не пита кои разширения са забранени. То задава структурен въпрос: съдържа ли това име на файл разширение за изходен код, което не е в края?

Ако съдържа, това е копие на нещо, което е трябвало да се изпълнява, каквото и да казва наставката след него. index.php.anything съвпада. style.css.anything съвпада. Шаблонът обхваща и имената, които никой още не е измислил, и в това е целият смисъл.

При проверка на работещия сървър днес всичките пет имена по-горе вече връщат 403, включително онези, които не съществуват — правилото отказва формата, а не файла.

Изключението и какво ни учи

Едно легитимно име на файл тук има точно тази форма: предварително компресираните ресурси се записват като style.css.1787777226.gz, с разширение по средата по замисъл. Затова правилото има едно-единствено тясно изключение за цифров сегмент, последван от .gz, и този файл връща 200, както трябва.

Именно при такива изключения тези правила обикновено се объркват, затова си струва да се каже какво прави това изключение безопасно: то е достатъчно тясно, за да не може да се състави index.php.something.gz за изтегляне на изходния код, защото средният сегмент трябва да съдържа само цифри. По-широко изключение — „всичко, което завършва на .gz“ — би обезсмислило цялото правило.

А най-простият съвет остава този, който прави всичко това ненужно: пазете резервните копия извън публикуваната директория. Правилото е предпазна мрежа за деня, в който това бъде забравено, а не разрешение да спрете да се интересувате къде попада копието.

Реклама