it-swarm.com.de

So blockieren Sie den Zugriff auf den Standard-Anmeldefluss und den Kommentarfluss

Ich habe in meinem Wordpress-Blog benutzerdefinierte Nachrichtenflüsse zum Anmelden, Registrieren und Kommentieren eingerichtet. Ich möchte den Standard-Anmeldefluss mit einem Kennwort schützen, damit nur ich ihn verwenden und den Zugriff auf den Standard-Kommentarfluss vollständig blockieren kann.

Mein Instinkt ist, .htaccess zu verwenden, um den Zugriff auf wp-login.php und wp-signup.php zu schützen. Reicht dies aus oder gibt es andere Methoden, um auf diese Seite zuzugreifen? z.B. index.php?action=login usw.

Für Kommentare bin ich mir nicht sicher. Ist es am besten, in die Kommentaraktion einzusteigen und den Prozess zu beenden? Oder funktioniert .htaccess auch dafür?

Wenn .htaccess eine praktikable Lösung für eines oder beide dieser Szenarien ist, wäre Beispielcode sehr willkommen, da ich hier ein Anfänger bin.

Bearbeiten: Ich verwende die folgenden WP Funktionen in meinen Flows, daher müssen diese ausgeführt werden können:

  • wp_set_auth_cookie
  • wp_create_user
  • wp_signon
  • wp_insert_comment
3

Dies ist eine reine .htaccess-Lösung. Eine Lösung mit reinen WordPress-Funktionen finden Sie unter G. M.'s Antwort unten .

Wie G. M. in ihrer Antwort hervorhob,

Alle Standard-Anmelde-/Registrierungsaktionen werden mit der Datei 'wp-login.php' ausgeführt. Die Standardkommentare werden mit der Datei 'wp-comments-post.php' gespeichert.

Auf diese Weise können wir Kommentare und Anmelde-/Registrierungsabläufe mithilfe von htaccess effektiv verwalten, um Anfragen an diese Dateien zu bearbeiten.

Bemerkungen

Wenn wir also den Zugriff auf den Standardkommentarfluss blockieren möchten, müssen wir den Zugriff auf wp-comments-post.php blockieren. So können wir das mit .htaccess machen:

<Files "wp-comments-post.php">
  Order Allow,Deny
  Deny from all
</Files>

Deny from all blockiert den Zugriff von jedermann. Order Allow,Deny weist Apache an, alle Allow-Standardanweisungen mit dieser Deny-Anweisung zu überschreiben. Wenn Sie mehr darüber lesen möchten, schauen Sie hier .

Wenn ein Benutzer nun versucht, wp-comments-post.php aufzurufen, wird die standardmäßige 403-Fehlerseite seines Browsers angezeigt.

Login/Registrierung

Um den Zugriff auf den Standard-Login-Flow auf einen oder mehrere Benutzer zu beschränken, verwenden wir die .htpasswd-Basisauthentifizierung.

Beginnen Sie, indem Sie Anmeldeinformationen mithilfe einer Website wie dieser erstellen . Ihre Ausgabe sieht ungefähr so ​​aus wie myusername:$apr1$Qp4aF23x$mK3KLb17lL2vbJmtWUmQ5. (das Kennwort wird so codiert angezeigt, aber Sie verwenden weiterhin das für die Anmeldung angegebene Nur-Text-Kennwort.) Speichern Sie diese Ausgabe in einer Datei mit dem Namen .htpasswd in Ihrem WordPress-Stammverzeichnis (sollte dasselbe Verzeichnis sein) als .htaccess datei.)

Fügen Sie Ihrer .htaccess-Datei nun Folgendes hinzu:

<Files "wp-login.php">
  Allow from all
  AuthType Basic
  AuthName "This area is restricted, fool." 
  AuthUserFile /var/www/absolute/path/to/.htpasswd
  Require user myusername
</Files>

Ihr Browser fordert jetzt alle Benutzer auf, einen Benutzernamen und ein Passwort einzugeben, wenn sie versuchen, wp-login.php zu besuchen.

Hinweis für Entwickler in mehreren Umgebungen: Wenn sich der Serverpfad zu Ihrer Installation zwischen lokal und produktiv ändert (z. B./var/www und/app/public), müssen Sie Folgendes festlegen Stellen Sie sicher, dass AuthUserFile in jeder Umgebung auf die richtige Datei verweist. Eine Möglichkeit, dies zu erreichen, besteht darin, den obigen Code anzupassen, indem Sie die AuthUserFile-Zeile entfernen und Folgendes hinzufügen:

<IfDefine localdev>
  AuthUserFile /var/www/absolute/path/to/.htpasswd
</IfDefine>
<IfDefine !localdev>
  AuthUserFile /app/public/absolute/path/to/.htpasswd
</IfDefine>

Dieser Code sucht nach einer Umgebungsvariablen mit dem Namen localdev und legt den Speicherort von AuthUserFile abhängig davon fest, ob sie gefunden wird oder nicht. Sie müssen localdev definieren, wenn Sie Apache auf Ihrem lokalen Server starten, z. apachectl -k start -Dlocaldev

0

Alle Standard-Anmelde-/Registrierungsaktionen werden mit der Datei 'wp-login.php' ausgeführt.

Die Standardkommentare werden mit der Datei 'wp-comments-post.php' gespeichert.

Wenn Sie diese 2 Dateien blockieren, blockieren Sie den Standardfluss für Kommentare, Anmeldung, Registrierung und Passwortwiederherstellung.

Sehr früh in seinem Bootstrap speichert WordPress eine globale Variable $pagenow, die den Namen der zu ladenden Datei enthält. Sie können diese Variable verwenden, um den Fluss zu blockieren.

Das Blockieren von Kommentaren ist sehr einfach, da Sie sie für alle blockieren möchten.

Schreiben wir zunächst eine Funktion, die die Anfrage beendet, senden einen http-Header 403 und geben eine Nachricht aus. Dies kann mit wp_die erfolgen.

function restrict_standard_flow( $not_allowed = 'Action' ) {
  $args = array( 'response' => 403 ); // set response to 403
  $msg = $not_allowed . ' not allowed';
  if ( restrict_used_method() === 'GET' ) {
    $args['back_link'] = TRUE; // show a back link if request send via GET
  };
  wp_die( $msg, $msg, $args );
}

restrict_used_method() ist eine Funktion, die die aktuell verwendete Methode zurückgibt:

function restrict_used_method() {
  $method = filter_input( INPUT_SERVER, 'REQUEST_METHOD', FILTER_SANITIZE_STRING );
  return strtoupper( $method ) === 'GET' ? 'GET' : 'POST';
}

Diese Funktion verhindert unerwartetes Verhalten, wenn die Methoden nicht POST oder GET sind.

Zu diesem Zeitpunkt können wir die Variable $pagenow verwenden, um die Anforderung zu beenden, wenn es sich um 'wp-comments-post.php' handelt, und eine Funktion ausführen, wenn es sich um 'wp-login.php' handelt.

add_action( 'plugins_loaded', function() {
  global $pagenow;
  if ( $pagenow === 'wp-login.php' ) {
    restrict_standard_login_flow();
  } elseif ( $pagenow === 'wp-comments-post.php' ) {
    restrict_standard_flow( 'Standard comment flow' );
  }
});

Damit der Standardkommentarfluss blockiert ist, müssen wir die Funktion restrict_standard_login_flow() schreiben.

Ich denke, eine einfache Möglichkeit, den Passwortschutz zu implementieren, ist das Einfügen des Passworts als URL-Variable. In diesem Fall müssen wir sicherstellen, dass ein Passwort in der URL auch im Anmeldeformular enthalten ist, um es bei der Übermittlung weiterzugeben.

Wir können dies mit 'login_form' Aktions-Hooks tun:

add_action( 'login_form', 'embed_pwd_in_form' );

function embed_pwd_in_form() {
  if ( ! is_super_admin() && defined('MY_SECRET') && MY_SECRET ) {
    $type = restrict_used_method() === 'GET' ? INPUT_GET : INPUT_POST;
    $pwd = filter_input( $type, 'mypwd', FILTER_SANITIZE_STRING );
    if ( ! empty( $pwd ) ) {
      echo "<input type='hidden' name='mypwd' value='" . md5($pwd). "' />";
      wp_nonce_field( 'pwd_nonce', 'pwd_n' );
    }
  }
}

Also schauen wir uns url an und wenn die URL-Variable 'mypwd' es md5-ed in ein verstecktes Feld legt, entlang eines anderen versteckten Nonce-Feldes.

Das Passwort, das Sie in die URL eingeben, muss mit etwas verglichen werden. Ein einfacher Weg ist die Verwendung einer Konstante:

Öffne deinen wp-config.php und kurz davor

/* That's all, stop editing! Happy blogging. */

stellen

define( 'MY_SECRET', 'your-password-here' );

Natürlich ersetzen Sie'Ihr-Passwort-hier'durch Ihr echtes Passwort.

Jetzt können wir die Funktion restrict_standard_login_flow() schreiben, die das Kennwort in der URL mit der Konstante vergleicht, und auch die Nonce überprüfen, ob die aktuelle http-Methode POST ist:

function restrict_standard_login_flow() {
  // if the current user is not already logged as super admin
  // and a constant 'MY_SECRET' is defined
  if ( ! is_super_admin() && defined('MY_SECRET') && MY_SECRET ) {
    $type = INPUT_GET;
    $not_allowed = FALSE;
    if ( restrict_used_method() === 'POST' ) {
      // sent via form, check a nonce
      $type = INPUT_POST;
      $nonce = filter_input( $type, 'pwd_n', FILTER_SANITIZE_STRING );
      if ( empty($nonce) || ! wp_verify_nonce( $nonce, 'pwd_nonce' ) ) {
        $not_allowed = 'Nonce';
      }
    }
    if ( $not_allowed === FALSE ) { // nonce is valid, check password
      $pwd = filter_input( $type, 'mypwd', FILTER_SANITIZE_STRING );
      // if the password is sent via url, md5 it, like in form
      if ( restrict_used_method() === 'GET' ) $pwd = md5($pwd);
      // if password is not valid
      if ( $pwd === md5(MY_SECRET)  ) {
        $not_allowed = 'Standard login flow';
      }
    }
    if ( $not_allowed === FALSE ) { // if not allowed exit
      restrict_standard_flow( $not_allowed );
    }
  }
}

Weitere Details finden Sie in den Inline-Kommentaren.

Um den Standard-Login-Flow zu verwenden, müssen Sie eine URL wie die folgende verwenden

http://www.example.com/wp-login.php?mypwd=your-password-here

Wenn Sie das Passwort nicht festlegen, wird die Anfrage abgelehnt.

Bitte beachten Sie, dass der Code hier nur das Anmeldeformular zulässt. Das Formular zum Verlieren/Zurücksetzen des Kennworts ist nicht zulässig. Sie können den Code also erweitern, um sie zuzulassen, oder Sie verwenden Ihren benutzerdefinierten Flow für diese Aufgaben.

Als Alternative, vergiss niemals das Passwort;)

Das Registrieren von Formularen ist ebenfalls nicht zulässig, da Sie nur den Standardfluss verwenden können undbereitsregistriert sind .

1
gmazzap

1) Einstellung-> Allgemein entfernen Jeder kann ein Options-Häkchen setzen

2) Einstellung-> Diskussionsüberprüfung Benutzer müssen registriert und angemeldet sein, um Kommentare abzugeben

Wenn zwei Bedingung eine Person nicht registrieren und nicht auf Ihren Beitrag kommentieren.

Fügen Sie einfach Code in function.php hinzu und Ihr Admin-Dashboard greift nur auf admin zu.

function block_dashboard() {
    $file = basename($_SERVER['PHP_SELF']);
    if (is_user_logged_in() && is_admin() && !current_user_can('edit_posts') && $file != 'admin-ajax.php'){
        wp_redirect( home_url() );
        exit();
    }
}
add_action('init', 'block_dashboard');
0
ravi patel