web-dev-qa-db-ja.com

ApacheでのHTTP POSTおよびGET要求の異なる認証

POST http://path/to/logical/abc.xmlのリクエストを認証したい(ただし、そのURLへのGETリクエストは認証しない)。

このような制約を設定するにはどうすればよいですか?パスは論理的であり、.htaccessでは場所ディレクティブはサポートされていません。

4
user31745

このようなことがうまくいくと思います。まだテストしていません。

<Limit POST>
Require valid-user
</Limit>
1
Leif

リクエストを通過させ、Perl、PHPなどのサーバー上のあらゆるもので処理する場合は、次のようにできます。

RewriteCond %{REQUEST_METHOD} !^(HEAD|POST)
RewriteRule .* - [F]

そうすれば、POSTおよびHEADリクエストを許可するが、残りはすべてブロックする

1
PatomaS

これは、次のPHPサーバー側スクリプトを使用して実現できます(ユーザー資格情報の保存と認証メカニズムをいくらかカスタマイズ/改善したい場合があります!)。

<?php
$sRealmName = 'Restricted Area';
$aUsers = array( 'admin' => 'admin', 'guest' => 'guest' );
if( $_SERVER['REQUEST_METHOD'] == 'POST' ) { 

    if( empty( $_SERVER['PHP_AUTH_DIGEST'] )) {
        header( 'HTTP/1.1 401 Unauthorized' );
        header( 'WWW-Authenticate: Digest realm="' . $sRealmName
        . '",qop="auth",nonce="' . uniqid() . '",opaque="'
        . md5( $sRealmName ).'"' );
        die( '401 Unauthorized: Login Required' );
    }

    $aParameters = array( 'nonce' => 1, 'nc' => 1, 'cnonce' => 1,
        'qop' => 1, 'username' => 1, 'uri' => 1, 'response' => 1 );
    $sKeys = implode( '|', array_keys( $aParameters ));
    preg_match_all( '@(' . $sKeys . ')=(?:([\'"])([^\2]+?)\2|([^\s,]+))@', 
        $_SERVER['PHP_AUTH_DIGEST'], $aMatches, PREG_SET_ORDER );
    $aHttpAuthData = array();
    foreach( $aMatches as $aMatch ) {
        $aHttpAuthData[$aMatch[1]] = $aMatch[3] ? $aMatch[3] : $aMatch[4];
        unset( $aParameters[$aMatch[1]] );
    }

    $aData = $aParameters ? false : $aHttpAuthData;
    if( !$aData || !isset( $aUsers[$aData['username']] )) {
        header( 'HTTP/1.1 401 Unauthorized' );
        header( 'WWW-Authenticate: Digest realm="' . $sRealmName 
        . '",qop="auth",nonce="' . uniqid() . '",opaque="' 
        . md5( $sRealmName ).'"' );
        die( '401 Unauthorized: Login Incorrect' );
    }

    $sMd5User = md5( $aData['username'] . ':' . $sRealmName . ':' .
    $aUsers[$aData['username']]);
    $sMd5Request = md5( $_SERVER['REQUEST_METHOD'] . ':' . $aData['uri'] );
    $sMd5Digest = md5( $sMd5User . ':' . $aData['nonce'] . ':'
    . $aData['nc'] . ':' . $aData['cnonce']. ':' .$aData['qop'] . ':'
    . $sMd5Request );

    if( $aData['response'] != $sMd5Digest ) {
        header( 'HTTP/1.1 401 Unauthorized' );
        header( 'WWW-Authenticate: Digest realm="' . $sRealmName
        . '",qop="auth",nonce="' . uniqid() . '",opaque="' 
        . md5( $sRealmName ) . '"' );
        die( '401 Unauthorized: Login Incorrect' );
    }  
}

header( "Expires: Mon, 26 Jul 1997 05:00:00 GMT" );
header( "Last-Modified: " . gmdate( "D, d M Y H:i:s" ) . " GMT" );
header( "Cache-Control: no-store, no-cache, must-revalidate" );
header( "Cache-Control: post-check=0, pre-check=0", false );
header( "Pragma: no-cache" ); 
header( "Content-type: application/xml" );
echo( '<?xml version="1.0" encoding="UTF-8"?>' . "\r\n" );
echo( '<envelope attribute="value">' . "\r\n" );
echo( '<node attribute="value"></node>' . "\r\n" );
echo( '</envelope>' . "\r\n" );
0
richhallstoke