Wie Sie den Zugriff auf den Standard-Login-Flow und den Comment-Flow blockieren

Ich habe benutzerdefinierte Flows in meinem WordPress-Blog für die Anmeldung, Anmeldung und Kommentierung eingerichtet. Ich möchte den Standard-Login-Flow passwortgeschützt haben, damit nur ich ihn verwenden kann, und den Zugriff vollständig auf den Standard-Kommentarfluss blockieren.

Mein Instinkt ist es, mit .htaccess den Zugang zu wp-login.php und wp-signup.php . Reicht das aus oder gibt es andere Methoden, um auf diese Seite zuzugreifen? zB index.php?action=login , usw.

Für Kommentare bin ich mir nicht sicher. Ist es am besten, sich in die Kommentaraktion einzuklinken und den process zu beenden? Oder wird .htaccess arbeiten?

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

Bearbeiten: Ich verwende die folgenden WP-functionen in meinen Flows, damit diese ausgeführt werden können:

  • wp_set_auth_cookie
  • wp_create_user
  • wp_signon
  • wp_insert_comment

Solutions Collecting From Web of "Wie Sie den Zugriff auf den Standard-Login-Flow und den Comment-Flow blockieren"

Alle Standard-Anmelde- / Registrierungsaktionen werden mit 'wp-login.php' Datei 'wp-login.php' .

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

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

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

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

Zuerst schreiben wir eine function, die die Anfrage beendet, einen HTTP-Header 403 sendet und eine Nachricht ausgibt. Das kann mit wp_die

 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 function, die die aktuelle Methode zurückgibt:

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

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

An dieser Stelle können wir die Variable $pagenow , um die Anfrage zu beenden, wenn sie 'wp-comments-post.php' und eine function 'wp-comments-post.php' wenn sie 'wp-login.php' .

 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 Standard-Kommentarfluss blockiert wird, müssen wir die function 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 Login-Formular enthalten ist, um es beim Absenden zu übergeben.

Wir können dies mithilfe 'login_form' 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 ""; wp_nonce_field( 'pwd_nonce', 'pwd_n' ); } } } 

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

Das Passwort, das Sie in die URL eingeben, muss mit etwas verglichen werden … Eine einfache Methode ist die Verwendung einer Konstante:

Öffne deine wp-config.php und kurz davor

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

stellen

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

Ersetzen Sie ‘your-password-here’ natürlich mit Ihrem echten Passwort.

Jetzt können wir die function restrict_standard_login_flow() schreiben, die das Passwort in der URL mit der Konstante vergleicht und auch die Nonce prüft, wenn die aktuelle HTTP-Methode POST lautet:

 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 Informationen finden Sie unter Inline-Kommentare.

Um den Standard-Login-Flow zu verwenden, müssen Sie jetzt eine URL 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 Login- Formular zulässt, das Passwort “verloren / zurückgesetzt” nicht erlaubt ist, oder Sie erweitern den Code, um sie zuzulassen, oder Sie verwenden Ihren benutzerdefinierten Flow für diese Aufgaben.

Als Alternative, vergessen Sie nie das Passwort;)

Registeri Formular ist auch nicht erlaubt, weil Sie wollen nur Sie können Standard-Flow verwenden, und Sie sind bereits registriert.

1) Einstellung-> Allgemein zu entfernen Jeder kann Options-Häkchen registrieren

2) Einstellung-> Diskussionsprüfung Benutzer müssen registriert und eingeloggt sein, um einen Kommentar abzugeben

Wenn zwei Personen eine Bedingung nicht registrieren und nicht zu Ihrem 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'); 

Dies ist eine reine .htaccess-Lösung. Für eine Lösung mit reinen WordPress-functionen, siehe die Antwort von GM unten .

Wie GM in ihrer Antwort darauf hingewiesen hat,

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

So können wir Kommentare und Anmelde- / Registrierungsabläufe effektiv verwalten, indem wir htaccess verwenden, um Anfragen an diese Dateien zu bearbeiten.

Bemerkungen

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

  Order Allow,Deny Deny from all  

Deny from all Blöcken den Zugriff von jedem Deny from all . Order Allow,Deny sagt Apache, überschreibt jede Default- Allow statement mit dieser Deny statement. Wenn Sie mehr darüber lesen möchten, klicken Sie hier.

Wenn ein Benutzer nun versucht, wp-comments-post.php zu besuchen, wird die Standarderrorsseite seines Browsers 403 angezeigt.

Anmeldung / Registrierung

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

Beginnen Sie mit dem Generieren von Anmeldeinformationen mithilfe einer Website wie dieser . Ihre Ausgabe wird myusername:$apr1$Qp4aF23x$mK3KLb17lL2vbJmtWUmQ5. so myusername:$apr1$Qp4aF23x$mK3KLb17lL2vbJmtWUmQ5. (Das Passwort wird so codiert aussehen, aber Sie werden immer noch das Klartext-Passwort verwenden, das Sie zum Anmelden bereitgestellt haben.) Speichern Sie diese Ausgabe in einer Datei namens .htpasswd in Ihrem WordPress-Stammverzeichnis (sollte dasselbe Verzeichnis wie Ihre .htaccess Datei sein). )

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

  Allow from all AuthType Basic AuthName "This area is restricted, fool." AuthUserFile /var/www/absolute/path/to/.htpasswd Require user myusername  

Ihr Browser wird nun alle Benutzer nach einem Benutzernamen und Passwort fragen, wenn sie versuchen, wp-login.php zu besuchen.

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

  AuthUserFile /var/www/absolute/path/to/.htpasswd   AuthUserFile /app/public/absolute/path/to/.htpasswd  

Dieser Code sucht nach einer Umgebungsvariablen namens localdev , die den Speicherort von AuthUserFile bedingt festlegt, ob er es findet oder nicht. Sie müssen localdev definieren, wenn Sie Apache auf Ihrem lokalen Server apachectl -k start -Dlocaldev