Leiten Sie / user / login zu HTTPS um, alle anderen Anforderungen zu HTTP

7

Ich verwende Drupal 7. Die Anmeldeseite für meine Benutzer befindet sich unter / user / login, also der Standard-Anmeldepfad. Ich brauche diese Seite, um mit SSL verschlüsselt zu werden, damit die Leute ihre Passwörter nicht im Klartext übertragen.

Ich habe Apache so konfiguriert, dass die Site entweder über HTTP oder HTTPS navigiert werden kann. Ich möchte jedoch einige Umschreiberegeln implementieren, damit alle Anforderungen außer / user / login über HTTP gestellt werden, da dies UNENDLICH schneller ist und zu einer besseren Benutzererfahrung führt. Ich lehne es ab, Secure Pages zu diesem Zeitpunkt zu verwenden, da die Unterstützung in Drupal Core fehlerhaft ist, und ich werde Core nicht manuell patchen. Das heißt, ich muss nur noch Apache-Umschreiberegeln verwenden.

Ich habe folgende Regeln:

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

Für mich macht das Sinn, aber Drupal scheint es nicht zu mögen.

Was passiert ist wie folgt:

  1. Wenn ich mit HTTP zu einer anderen Seite als / user / login auf der Site navigiere, funktioniert dies einwandfrei.
  2. Wenn ich über HTTP zu / user / login navigiere, werde ich zur Startseite weitergeleitet.
  3. Wenn ich über HTTPS zu einer Seite navigiere, werde ich über HTTP zur Startseite weitergeleitet.
Lester Peabody
quelle
Sehr langsame HTTPS-Seiten sind möglicherweise nicht normal, weisen jedoch darauf hin, dass Ihrem System die Entropie ausgeht. Erklärung und eine Möglichkeit, dies hier zu beheben .
Tanius

Antworten:

8

Sie brauchen / user / login nicht wirklich, um über https bedient zu werden. Sie müssen das Benutzeranmeldeformular über https senden.

Sie sollten sich das Modul Securepages_prevent_hijack ansehen - nicht, um es direkt zu verwenden, da es von Securepages abhängt, sondern um zu sehen, wie das Anmeldeformular geändert wird. Wie so:

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);
  }
}

Sie sollten auch herausfinden, ob das von Drupal für Sie gesetzte Cookie sicher ist oder nicht. Dies hängt von Ihren Einstellungen in der php.ini ab. Überprüfen Sie, ob Sie session.cookie_secure auf 1 gesetzt haben. Wenn ja, wird das Cookie nicht an Ihre http-Sitzungen gesendet, weshalb Sie möglicherweise wieder auf der Startseite enden (kein Sitzungscookie == no session = = keine Anmeldeinformationen == abmelden). Wenn die session.cookie_secure 0 ist, können andere Parteien möglicherweise Ihre Sitzungscookies während der Übertragung beobachten und sich als Ihre Benutzer tarnen. Vielleicht haben Sie dieses Risiko bereits in Betracht gezogen, aber es muss berücksichtigt werden.

greg_1_anderson
quelle
Interessant. Nun, ich habe settings.php und php.ini durchgesehen und session.cookie_secure ist nirgendwo festgelegt. Sie denken also, ich könnte einfach ein benutzerdefiniertes Modul erstellen, das hook_form_alter implementiert und auf das Anmeldeformular abzielt? Ich bin nicht wirklich sicher, was securepages_url(...)tut ...
Lester Peabody
sichere Seiten_url ähnelt der Umkehrung von parse_url; Es befindet sich (natürlich) im Securepages-Modul, sodass Sie es nachschlagen können. Es ist komplizierter als Sie brauchen; Sie können einfach die http in https in der $ form ['# action'] vor https ersetzen. Der Grund, warum Formularänderungen besser sind als Ihre http-zu-https-Weiterleitung, ist, dass sie auch für Anmeldeformulare funktionieren, die sich in einem Block auf einer anderen Seite als Benutzer / Anmeldung befinden. Sie können bei Ihrer aktuellen Technik bleiben, wenn Sie diese nicht benötigen. Natürlich geht Ihr eigentliches Problem von https zu http. Sie müssen herausfinden, warum das Sitzungscookie nicht fortbesteht.
Greg_1_anderson
Stellen Sie sicher, dass RewriteCond %{REQUEST_URI} !^/user/login$das richtig funktioniert; Wenn diese Regel Teil des Anmeldeumleitungsprozesses ist, wird Ihr Kennwort im Klartext gesendet. Erfassen Sie einige Pakete mit Wireshark, um sicherzustellen, dass dies nicht geschieht. Dies kann Ihnen auch dabei helfen, herauszufinden, was mit Ihrem Sitzungscookie passiert. Ich weiß, dass ich Ihre Frage nicht beantwortet habe, aber hoffentlich können Sie damit den richtigen Weg einschlagen.
Greg_1_anderson
Sie haben ziemlich gute Arbeit geleistet, um mich in die richtige Richtung zu weisen. Zum Beispiel hatte ich keine Ahnung, dass zwischen HTTP und HTTPS unterschiedliche Sitzungen bestehen, was offensichtlich einen großen Beitrag zum Verständnis des Problems leistet. Ich komme aus der Rails-Welt, also ist das neu für mich :)
Lester Peabody
1
Vielleicht finden Sie auch diesen aktuellen DrupalPlanet-Artikel interessant: solotandem.com/…
greg_1_anderson
4

Ich denke, das Secure Login- Modul wird auch tun, was Sie wollen, ohne dass Sie den Kern hacken müssen.

Das Modul "Sichere Anmeldung" ermöglicht die sichere Übermittlung der Benutzeranmeldung und anderer Formulare über HTTPS, wodurch verhindert wird, dass Kennwörter und andere private Benutzerdaten im Klartext übertragen werden.

user785179
quelle