Связаться с поддержкой

Мы отвечаем по электронной почте, обычно в течение двух дней.

Для защиты от злоупотреблений Google reCAPTCHA проверяет эту отправку; при этом данные передаются в Google. Скрипт загружается только при открытии этой формы.

← Все записи

Копия в веб-каталоге — это утечка исходников

Перед правкой большого файла естественно сначала его скопировать. cp index.php index.php.pered-pravkoj, потом работать. Если этот файл лежит в каталоге, который публикует веб-сервер, вы только что сделали весь свой исходный код скачиваемым как простой текст — доступы к базе, секреты, всё, что в файле оказалось.

Apache пропускает index.php через PHP, потому что он кончается на .php. index.php.pered-pravkoj не кончается на .php. Он кончается на .pered-pravkoj, о чём 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

Все отданы с кодом 200. Образец имени, о котором вы не подумали, — ровно тот, которым вы и воспользуетесь, потому что копии называют по тому, что делали в этот момент.

Перевернуть разрез

Правило, которое работает, не спрашивает, какие расширения запрещены. Оно задаёт вопрос о строении: содержит ли это имя файла исходное расширение, стоящее не в конце?

Если да, это копия того, что должно было исполняться, что бы ни говорил суффикс после. index.php.что-угодно подходит. style.css.что-угодно подходит. Образец покрывает имена, которых ещё никто не выдумал, и в этом весь смысл.

Проверено сегодня на работающем сервере: все пять имён выше теперь дают 403, включая те, которых не существует — правило отказывает форме, а не файлу.

Исключение и чему оно учит

Одно законное имя файла здесь имеет ровно такую форму: предварительно сжатые файлы пишутся как style.css.1787777226.gz, расширение посередине по замыслу. Поэтому правило несёт одно узкое исключение для цифрового отрезка, за которым идёт .gz, и этот файл отдаётся с 200, как и должен.

Именно на таком исключении эти правила обычно и ломаются, так что стоит сказать, что делает это безопасным: оно узко настолько, что нельзя собрать index.php.что-нибудь.gz и получить свой исходник обратно, ведь средний отрезок должен состоять только из цифр. Более широкое исключение — «всё, что кончается на .gz» — отдало бы правило целиком.

А простейший совет остаётся тем, который делает всё это ненужным: держите копии вне публикуемого каталога. Правило — это сетка на тот день, когда вы забудете, а не разрешение перестать следить, куда падает копия.

Реклама