Permitir somente o método POST para um arquivo específico em um diretório

4

Eu tenho um arquivo que só deve ser acessível pelo método POST.

/var/www/folder/index.php

A raiz do documento é /var/www/ e index.php está aninhada dentro de uma pasta.

A versão do Apache é: 2.4.4.
Minhas configurações são as seguintes:

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

Eu visito meu servidor em 127.0.0.1/folder , mas posso GET e POSTAR o arquivo como normalmente.

Eu também tentei reverter o pedido, order allow,deny , require, limitexcept e limit.

Como posso permitir que somente solicitações POST sejam processadas por um arquivo em uma pasta?

    
por David Chen 11.10.2013 / 04:55

4 respostas

4

Você pode usar a Require diretiva:

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

No entanto, como isso faz parte da seção de autorização, convém tentar isso:

<Directory "/var/www/folder">
    <Files "index.php">
        <LimitExcept POST>
            Order allow,deny
            Deny from all
        </LimitExcept>
    </Files>
</Directory>
    
por 11.10.2013 / 05:19
3

Se seus truques de configuração do apache não funcionarem, você poderá fazê-lo no próprio index.php. Na parte superior do arquivo, adicione algo como isto:

<?php
if($_SERVER['REQUEST_METHOD'] != "POST") {
    header("HTTP/1.0 403 Forbidden");
    print("Forbidden");
    exit();
}
    
por 18.10.2013 / 09:56
1

As famílias Order , Allow e Deny das diretivas de controle de acesso foram preteridas em favor de mod_authz_host .

Este pode ser o motivo pelo qual a configuração existente não está funcionando, já que qualquer diretiva Require conflitante terá precedência sobre a sua configuração (que ainda é suportada por meio de mod_access_compat , mas estas diretivas serão removidas em uma versão futura).

Como você usa a família 2.4, você também deve usar as novas diretivas de estilo. Eu testei a configuração abaixo em 2.4.4 e funciona como desejado:

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

A observação de Jack de que você poderia usar a diretiva Require method também é correta e, possivelmente, uma maneira mais semelhante a 2.4 de fazer isso.

    
por 18.10.2013 / 11:11
0

Uma condição de reescrita seria de fato mais eficiente, mas menos segura, devido ao uso do Regex, que pode ser complicado às vezes.

    
por 18.10.2013 / 00:51