web-dev-qa-db-ja.com

ディレクトリ内の特定のファイルに対してのみPOSTメソッドを許可する

POSTメソッドを介してのみアクセスできるファイルが1つあります。

/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でサーバーにアクセスしますが、GETを実行して、POSTファイルを通常どおりに取得できます。

order allow,deny、require、limitexcept、limitの順序を逆にしてみました。

POSTリクエストのみをフォルダー内の1つのファイルで処理することを許可するにはどうすればよいですか?

5
Dave Chen

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>
5
Jack

Apacheの設定トリックが機能しない場合は、index.php自体で実行できます。ファイルの先頭に次のようなものを追加します。

<?php
if($_SERVER['REQUEST_METHOD'] != "POST") {
    header("HTTP/1.0 403 Forbidden");
    print("Forbidden");
    exit();
}
3

アクセス制御ディレクティブのOrderAllow、および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に似た方法で行っています。

1
DaveRandom

書き直し条件は実際にはより効率的ですが、時々トリッキーになる可能性のある正規表現を使用しているため、安全性は低くなります。

0
Dr I