Разрешить метод POST только для определенного файла в каталоге

5

У меня есть один файл, который должен быть доступен только через метод POST.

/var/www/folder/index.php

Корень документа находится /var/www/и index.phpвложен в папку.

Версия Apache: 2.4.4.
Мои конфигурации следующие:

<Directory "/var/www/folder">
    <Files "index.php">
        order deny,allow
        Allow from all
        <LimitExcept POST>
            Deny from all
        </LimitExcept>
    </Files>
</Directory>

Я захожу на свой сервер, 127.0.0.1/folderно могу получить и отправить файл, как обычно.

Я также попытался order allow,denyизменить порядок , требуют, ограничить, исключить и ограничить.

Как можно разрешить обработку запросов POST только одним файлом в папке?

Дэвид Чен
источник

Ответы:

5

Вы можете использовать Requireдирективу:

<Directory "/var/www/folder">
    <Files "index.php">
        Require method POST
    </Files>
</Directory>

Однако, поскольку это является частью раздела авторизации, вы можете попробовать это вместо этого:

<Directory "/var/www/folder">
    <Files "index.php">
        <LimitExcept POST>
            Order allow,deny
            Deny from all
        </LimitExcept>
    </Files>
</Directory>
Джек
источник
3

Если ваши хитрости настройки Apache не работают, вы можете сделать это в самом index.php. В верхней части файла добавьте что-то вроде этого:

<?php
if($_SERVER['REQUEST_METHOD'] != "POST") {
    header("HTTP/1.0 403 Forbidden");
    print("Forbidden");
    exit();
}
Деннис Каарсемакер
источник
Извините, я бы предпочел сделать это на уровне Apache. Если бы это была проблема с PHP, я бы опубликовал это в StackOverflow :)
Дэвид Чен
1

Order, AllowИ Denyсемейство директив контроля доступа устарели в пользу mod_authz_host .

На самом деле это может быть причиной того, что ваша существующая конфигурация не работает, так как любые конфликтующие Requireдирективы будут иметь приоритет над вашей конфигурацией (которая все еще поддерживается посредством mod_access_compat , но эти директивы будут удалены в будущей версии).

Поскольку вы используете семейство 2.4, вам также следует использовать новые директивы стиля. Я проверил приведенную ниже конфигурацию на 2.4.4, и она работает как нужно:

<Directory "/var/www/folder">
    Require all granted
    <Files "index.php">
        <LimitExcept POST>
            Require all denied
        </LimitExcept>
    </Files>
</Directory>

Замечание Джека о том, что вы можете использовать Require methodдирективу, также является правильным и, возможно, более 2,4-подобным способом сделать это.

DaveRandom
источник
0

Условие перезаписи было бы действительно более эффективным, но менее безопасным из-за использования Regex, что иногда бывает сложно.

Доктор я
источник
Можете ли вы привести пример, где это может быть небезопасно?
Дэвид Чен
Привет, Дейв. Действительно, это решение полностью соответствует вашим потребностям и является безопасным, если вы не используете его в случайных / переменных каталогах. Например: регулярное выражение, ищущее определенный или не слишком переменный каталог, сможет правильно выполнить эту работу. Теперь давайте заявим, что вы хотите, чтобы эта фильтрация работала в действительно переменном формате каталога (по API случайным образом ;-)), тогда вам придется иметь дело с потенциально большим количеством вероятностей, которые могут привести к непредвиденному результату. Я имею в виду, вы уверены, что ваше регулярное выражение будет перехватывать все возможные URI? Вы уверены, что это будет развиваться?
Доктор Я