7

http auth basicを使用してディレクトリを保護しようとして~/public_html/devいますが、それを安全にするために、ssl上で実行したいと思います。

以下のファイルの中央のセクションは.htaccess、リクエストURIがで始まり、/dev機能する場合、httpsに切り替わります。

ファイルの最後のセクションも同様に機能しますが、httpsリダイレクトでは正しく機能しません。

基本的に、http authのユーザー名とパスワードを入力してhttp://www.example.com/dev/some_sub_dir/リダイレクトし、プロンプトを表示できるようにしたいです。https://www.example.com/dev/some_sub_dir/

現在何が起こっているのかというとhttp://www.example.com/dev/some_sub_dir/、ポート80でユーザー名とパスワードの入力を求められ、すぐにポート443で再度プロンプトが表示されます。したがって、クレデンシャルは2回送信され、1回はクリアで、もう1回は暗号化されます。httpsのURL全体を少し書き直しても意味がありません。

これを行う理由は、誤ってユーザーを送信したり、httpをパスオーバーしたりできないようにするためです。/devディレクトリへのアクセスには常にhttpsが使用されます。

はディレクトリ.htaccessにあります。~/public_html/dev

#example.comのルールを書き換える
RewriteEngineオン
RewriteBase /

#httpsで/devを強制する
RewriteCond%{HTTPS}!on
RewriteCond%{REQUEST_URI} ^ / dev
RewriteRule(。*)https://%{HTTP_HOST}%{REQUEST_URI}

#認証を行う
AuthType Basic
AuthName "dev"
AuthUserFile /home/matt/public_html/dev/.htpasswd
有効なユーザーが必要
4

9 に答える 9

11

基本認証を実行する前にHTTPSを強制する比較的一般的なハックがあります。私は最初にここでそれを見ました:

http://blog.jozjan.net/2008/02/htaccess-redirect-to-ssl-https-before.html

これには、カスタムエラードキュメントを使用して、HTTPSチェックが失敗した後に発生するすべての処理が含まれます。

たとえば、HTTPSを強制的にオンにする必要がある単一のページがあるため、.htaccessファイルでこれを実行しました。

<FilesMatch "secure-page.php">
    SSLRequireSSL
    ErrorDocument 403 https://www.example.com/secure-page.php
    AuthType Basic
    AuthName "Secure Page"
    AuthUserFile /var/www/whatever/.htpasswdFile
    Require valid-user
</FilesMatch>

これは次のように解釈されます。

要求されたページが「secure-page.php」の場合-HTTPSでない場合は、カスタムの「エラーページ」にリダイレクトします-「エラーページ」は、実際にはページのHTTPSバージョンです-HTTPSであるため、2番目の要求でチェックに合格し、基本認証を実行します:)

この概念をディレクトリまたは他のユースケースに拡張できます。カスタムの「エラーページ」は、正しいHTTPS URLにリダイレクトするphpページ、または上記のリンクのようなCGIスクリプトである可能性があります...

于 2012-12-04T17:39:44.453 に答える
4

私は同じ問題に遭遇し、最終的に醜い解決策を見つけましたが、それは機能します。書き換えルールをhttpd.confまたはconf.dファイルの1つ(つまり、「メイン」サーバー構成)のDirectoryディレクティブに配置します。次に、Auth *行とRequire行をssl.conf(またはSSL VirtualHostが定義されている場所)のコンテナー内のDirectoryディレクティブに配置します。<VirtualHost _default_:443>

私にとって、これは次のファイルを作成することを意味します/etc/httpd/conf.d/test.conf

<Directory "/var/www/html/test">
        #
        # force HTTPS
        #
        RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</Directory>

...次に、タグ/etc/httpd/conf.d/ssl.confのすぐ上に次を追加します。</VirtualHost>

<Directory "/var/www/html/test">
        #
        # require authentication
        #
        AuthType Basic
        AuthName "Please Log In"
        AuthUserFile /var/www/auth/passwords
        Require valid-user
</Directory>

これを行うと、ApacheはRewriteRuleをすべてのリクエストに適用し、認証要件は443VirtualHost内のリクエストにのみ適用されます。

于 2010-02-25T22:07:00.370 に答える
4

Siliconrockstarの回答に基づいて、siliconrockstarによって示される1つのファイルの場合だけでなく、すべてのファイルにSSLを強制する場合に機能するphpスクリプトを追加しています。ここでも、htaccessファイルと連動して機能します。

ディレクトリ全体を保護するためのhtaccess:

    SSLRequireSSL
    ErrorDocument 403 /yourphp.php
    AuthType Basic
    AuthName "Secure Page"
    AuthUserFile /some_path_above_the_html_root/.htpasswdFile
    Require valid-user

htaccessによって呼び出されたphp(このサンプルのhtaccessでphpに指定されたパスはサイトのルートです)。これにより、呼び出したURLにhttpsが強制されます。

<?php
$path = "https://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
if ( $_SERVER['SERVER_PORT'] == 80) {
    header("Status: 302 Moved\n");
    header("Location: ".$path."\n\n");
}
else {
    header( "Content-type: text/html\n\n");
    echo "How did you get here???";
}
?>

サイトにSSL証明書がない場合は、SSL証明書をインストールする必要があります。これが唯一の用途である場合は、自己署名証明書をインストールできます。専用IP上にサイトがあるcPanelVPSでは、実行に時間がかかります。WHMでは、次のWebサイトにアクセスしてください。

1。SSL証明書と署名要求を生成する

それから

二。ドメインにSSL証明書をインストールする

于 2013-07-06T01:09:24.593 に答える
2

基本認証によるコンテンツの保護は、HTTPを介して安全に機能することはありません。

ユーザーがユーザー名とパスワードを入力すると、ページビューごとに暗号化されずにそのサイトに送信されます。ユーザーにプロンプ​​トが表示されたときに送信されるだけではありません。

HTTPを介したリクエストは認証されていないものとして扱い、ログインしたものはすべてHTTPSを介して行う必要があります。

多くのWebサイトでは、ログインにHTTPSを使用しており(基本認証ではなくフォームとCookieを使用)、その後HTTPにアクセスしています。これは、「ログインしている」Cookieが暗号化されずに送信されることを意味します。このため、すべての貴重なターゲットがハッキングされており、Gmailは現在完全なHTTPSに切り替えており、他のターゲットもそれに続くでしょう。

計算量の多いHTTPSから遠ざけるために、他の人が抱えていたのと同じスケーリングの問題はありません。ホームページがHTTPSアクセスをサポートしている場合は、全体で使用してください。

于 2010-02-08T07:48:53.330 に答える
1

書き換えルールをメイン設定のいずれかまたは同様の外部に配置すると、認証前に書き換えが行われます。

RewriteTechを参照してください

于 2011-02-04T16:13:27.667 に答える
0

<Location>プロトコルを用語として使用して、認証セクションをまたは<LocationMatch>タグに入れることは機能しますか?

于 2010-02-08T08:09:34.577 に答える
0

私はそれをこのように回避します。非SSLはリダイレクトされるため、SSLを許可するだけで、SSLで一度認証が必要になります...

SetEnvIf %{SERVER_PORT} ^80$ IS_NON_SSL

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

AuthUserFile /.htpasswd
AuthName "Enter your Username and Password:"
AuthType Basic
require valid-user
Allow from env=IS_NON_SSL
于 2013-04-11T03:54:17.403 に答える
0

これは古い質問ですが、単純なht.accessリダイレクトで問題が発生しました。他の多くの問題と回答に続いて、私は最終的に意図したとおりに機能するこのhtaccessをまとめました。

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

AuthName "Private Server"
AuthUserFile /var/www/.htpassword
AuthType Basic
require valid-user
Order allow,deny
Allow from env=!HTTPS
Satisfy Any

注意するために

Order allow,deny

これは、httpsを使用するときに直接参加できるため、私が見た他の多くの回答から欠落していたものです。私のテストから欠落していた他のセクションは次のとおりでした:

Satisfy Any

この次のスニペットは、SSL以外のクライアントがリダイレクトに使用できるようにするものです。HTTPS env varは、sslクライアントのmod_sslから設定されます。

Allow from env=!HTTPS
于 2013-11-16T09:14:00.907 に答える
0

この質問に対する答えは2つあります。1つは2010年の考え方で、もう1つは2012年以降の考え方です。

質問されたときに2010年であるかのようにこの質問に答えるには、2つの異なるVirtualHost構成を使用します。

この解決策は、「変更するためのアクセス権しかありません.htaccess!」という意味であるため、質問の範囲から少し外れています。しかし、多くの場合、実行可能な解決策は、管理者に2つの異なるVirtualHost構成をセットアップするように要求することです。

  • 非SSLVirtualHostは、ファイルシステム上の何かにアクセスするように構成されておらずhttps://...、すべての要求の場所への301リダイレクトを返すだけです。

  • SSLリスニングVirtualHostは、標準のHTTPリスナーが商品を提供することを心配することなく、基本認証を自由に実装できます。

ただし、2018年以降の帽子をかぶって、この質問がApache 2.4より前(2012年初頭?)に行われたことに注意して、更新の時間です。Apache 2.4では<If condition>チェックが導入されました。これにより、これがはるかに簡単かつ直接的になります。

  • まず、RewriteEngineをIfModuleしないでください。Apacheは(標準セットアップで)ポート80と443の両方でリッスンしており、SSLを適用したいので、Rewriteモジュールがオフになっている場合は、サーバーを中断する必要があります。

    RewriteEngine On 
    
  • 次に、要求が安全でない場合は、簡単に言えば、即時かつ永続的な(301)リダイレクトを実行します。R(edirect)とL(ast)が連携して、暗号化されていない要求がリダイレクトされ、認証されていないアクセスを取得するために利用できないようにすることに注意してください。(OCDの場合、コピーと貼り付けを気にしないでください。との間のスペースが不足していることに注意してください。これは意図的なものです。)!=on

    RewriteCond %{HTTPS} !=on 
    RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,QSA,L,NC]
    
  • 最後に、同じ変数を<If-condition>チェックとともに使用して、TLS要求のパスワードのみが必要であることを確認します。

    <If "%{HTTPS} == 'on'">
            AuthName "Password please!" 
            AuthType Basic 
            AuthUserFile /path/to/htpasswdfile
            AuthGroupFile /dev/null 
            require valid-user
    </If>
    

そして全体として:

# .htaccess

RewriteEngine On

RewriteCond %{HTTPS} !=on
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,QSA,L,NC]

<If "%{HTTPS} == 'on'">
        AuthName "Password please!"
        AuthType Basic
        AuthUserFile /path/to/htpasswdfile
        AuthGroupFile /dev/null
        require valid-user
</If>
于 2018-03-16T19:31:35.820 に答える