/ user / loginをHTTPSにリダイレクトし、他のすべてのリクエストをHTTPにリダイレクトします


7

私はDrupal 7を使用しています。ユーザーのログインページは/ user / loginにあるため、デフォルトのログインパスです。そのページをSSLを使用して暗号化して、人々がパスワードを平文で送信しないようにする必要があります。

Apacheを構成して、サイトをHTTPまたはHTTPSのいずれかでナビゲートできるようにしました。ただし、/ user / login以外のすべてのリクエストがHTTP経由で行われるように、いくつかの書き換えルールを実装したいと考えています。これは、INFINITELYがより高速になり、ユーザーエクスペリエンスが向上するためです。Drupal Coreのサポートにバグがあるため、現時点ではSecure Pagesの使用を拒否し、Coreに手動でパッチを適用しません。つまり、Apacheの書き換えルールを使用する必要があります。

私には次のルールがあります。

<VirtualHost *:80>
  ...
  RewriteCond %{HTTPS} off
  RewriteCond %{REQUEST_URI} ^/user/login$
  RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [L,R]
  ...
</VirtualHost>

<VirtualHost *:443>
  ...
  RewriteCond %{HTTPS} on
  RewriteCond %{REQUEST_URI} !^/user/login$
  RewriteRule ^/(.*) http://%{HTTP_HOST}/$1 [L,R]
  ...
</VirtualHost>

今、私にはそれは理にかなっていますが、Drupalはそれが好きではないようです。

何が起こっているのですか?

  1. HTTPを使用してサイト内を/ user / login以外のページに移動すると、正常に動作します。
  2. HTTP経由で/ user / loginに移動すると、フロントページにリダイレクトされます。
  3. HTTPS経由で任意のページに移動すると、HTTP経由でフロントページにリダイレクトされます。

非常に遅いHTTPSページは正常でない場合がありますが、システムのエントロピーが不足していることを示しています。説明とここでそれを修正する方法。
タニウス

回答:


8

/ user / loginをhttps経由で提供する必要はありません。https経由で送信されるユーザーログインフォームが必要です。

securepages_prevent_hijackモジュールを確認する必要があります。securepagesに依存しているため、直接使用するのではなく、ログインフォームがどのように変更されるかを確認します。そのようです:

function securepages_prevent_hijack_form_alter(&$form, &$form_state, $form_id) {
  // Secure the login form, so that we always have a secure connection to transmit the
  // initial cookie.  Also, protect the password in transit.
  if ($form['#id'] == 'user-login-form' || $form['#id'] == 'user-login') {
    $url = parse_url($form['#action']);

    $base_path = base_path();
    $path = (!strncmp($url['path'], $base_path, drupal_strlen($base_path)) ? drupal_substr($url['path'], drupal_strlen($base_path)) : $url['path']);
    $options = array('secure' => TRUE);
    if (isset($url['query'])) {
      $options['query'] = $url['query'];
    }
    $form['#action'] = securepages_url($path, $options);
  }
}

また、Drupalが設定しているCookieが安全かどうかも確認する必要があります。これは、php.iniでの設定によって異なります。session.cookie_secureが1に設定されているかどうかを確認します。設定されている場合、Cookieはhttpセッションに送信されないため、ホームページで終了している可能性があります(セッションCookie ==セッションなし= =ログイン情報なし==ログアウト)。もちろん、session.cookie_secureが0の場合、他のパーティが転送中のセッションCookieを監視し、ユーザーになりすます可能性があります。おそらくあなたはすでにこのリスクを考慮しましたが、それはいくつかの考慮事項に耐えます。


面白い。まあ、私はsettings.phpとphp.iniを調べましたが、session.cookie_secureはどこにも設定されていません。では、hook_form_alterを実装してログインフォームをターゲットとするカスタムモジュールを作成できると思いますか?私は何をするのか本当にわかりませんsecurepages_url(...)...
レスターピーボディ

securepages_urlは、parse_urlの逆に似ています。(もちろん)securepagesモジュールにあるので、調べてみてください。必要以上に複雑です。$ form ['#action']でhttpをhttpsにpreg_replaceするだけです。フォームの変更がhttp-to-httpsリダイレクトよりも優れている理由は、ユーザー/ログイン以外のページのブロックにあるログインフォームでも機能するためです。あなたがそれらを必要としないなら、あなたはあなたの現在のテクニックに固執することができます。もちろん、あなたの本当の問題はhttpsからhttpに行くことです。セッションCookieが保持されない理由を追跡する必要があります。
greg_1_anderson

それRewriteCond %{REQUEST_URI} !^/user/login$が正しく機能していることを確認してください。このルールがログインリダイレクトプロセスの一部をキャッチした場合、パスワードは平文で送信されます。Wiresharkでいくつかのパケットをキャプチャして、これが発生していないことを確認します。これは、セッションCookieで何が起こっているかを理解するのにも役立ちます。私はあなたの質問に答えていませんが、うまくいけばこれであなたは正しい道を歩み始めるでしょう。
greg_1_anderson

あなたは私を正しい方向に向けるのにかなり良い仕事をしました。たとえば、HTTPとHTTPSの間で異なるセッションが持続することを知りませんでした。これは明らかに、問題の理解に役立つでしょう。私はRailsの世界から来たので、これは初めてです:)
Lester Peabody

1
:また、この最近のDrupalPlanetの記事に興味深い見つけるかもしれないsolotandem.com/...
greg_1_anderson

4

私が考えるセキュアログインモジュールはまた、コアをハックすることができを必要とせず、あなたがやりたいだろう。

セキュアログインモジュールを使用すると、ユーザーログインやその他のフォームをHTTPS経由で安全に送信できるため、パスワードやその他のプライベートユーザーデータがクリアテキストで送信されるのを防ぐことができます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.