web-dev-qa-db-fra.com

Comment bloquer l'accès au flux de connexion standard et au flux de commentaires

J'ai configuré des flux personnalisés sur mon blog Wordpress pour la connexion, l'inscription et les commentaires. Je souhaite protéger par mot de passe le flux de connexion standard afin que je puisse uniquement l'utiliser et bloquer totalement l'accès au flux de commentaires standard.

Mon instinct est d’utiliser .htaccess pour protéger l’accès à wp-login.php et wp-signup.php. Est-ce suffisant ou existe-t-il d'autres méthodes pour accéder à cette page? par exemple. index.php?action=login, etc.

Pour les commentaires, je ne suis pas sûr. Est-il préférable de prendre part à l'action de commentaire et de mettre fin au processus? Ou .htaccess fonctionnera-t-il aussi?

Si .htaccess est une solution viable pour l'un ou l'autre de ces scénarios, un exemple de code serait très apprécié, car je suis un novice ici.

Edit: J'utilise les fonctions WP suivantes dans mes flux, elles doivent donc pouvoir s'exécuter:

  • wp_set_auth_cookie
  • wp_create_user
  • wp_signon
  • wp_insert_comment
3
moon prism power

Ceci est une solution pure .htaccess. Pour une solution utilisant uniquement des fonctions WordPress, voir G. La réponse de M. ci-dessous .

Comme l’a souligné G. M. dans leur réponse,

Toutes les actions de connexion/enregistrement standard sont effectuées à l'aide du fichier 'wp-login.php'. Les commentaires standard sont enregistrés dans le fichier 'wp-comments-post.php'.

Ainsi, nous pouvons gérer efficacement les commentaires et les flux de connexion/enregistrement en utilisant htaccess pour traiter les demandes de ces fichiers.

Commentaires

Ainsi, si nous voulons bloquer l'accès au flux de commentaires standard, nous devons bloquer l'accès à wp-comments-post.php. Voici comment nous pouvons faire cela avec .htaccess:

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

Deny from all bloque l'accès de quiconque. Order Allow,Deny indique à Apache de remplacer toute instruction Allow par défaut par cette instruction Deny. Si vous voulez en savoir plus à ce sujet, regardez ici.

Désormais, si un utilisateur tente de consulter wp-comments-post.php, la page d'erreur 403 par défaut de son navigateur s'affiche.

Login/Inscription

Pour limiter l'accès au flux de connexion standard à un ou plusieurs utilisateurs, nous utiliserons l'authentification de base .htpasswd.

Commencez par générer des informations d'identification à l'aide d'un site Web tel que this . Votre sortie ressemblera à quelque chose comme myusername:$apr1$Qp4aF23x$mK3KLb17lL2vbJmtWUmQ5. (le mot de passe sera ainsi codé, mais vous utiliserez toujours le mot de passe en clair que vous avez fourni pour vous connecter.) Enregistrez cette sortie dans un fichier appelé .htpasswd dans votre répertoire racine WordPress (devrait être le même répertoire en tant que votre fichier .htaccess.)

Maintenant, ajoutez ce qui suit à votre fichier .htaccess:

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

Votre navigateur va maintenant demander à tous les utilisateurs un nom d'utilisateur et un mot de passe lorsqu'ils tenteront de visiter wp-login.php.

Remarque pour ceux qui se développent dans plusieurs environnements: Si le chemin du serveur de votre installation change entre local et production (par exemple,/var/www et/app/public), vous devrez créer que AuthUserFile pointe sur le bon fichier dans chaque environnement. Une façon d'accomplir cela consiste à ajuster le code ci-dessus en supprimant la ligne AuthUserFile et en ajoutant ceci:

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

Ce code recherche une variable d'environnement appelée localdev - définissant de manière conditionnelle l'emplacement de AuthUserFile, qu'il le trouve ou non. Vous devrez définir localdev lorsque vous démarrez Apache sur votre serveur local, par exemple. apachectl -k start -Dlocaldev

0
moon prism power

Toutes les actions de connexion/enregistrement standard sont effectuées à l'aide du fichier 'wp-login.php'.

Les commentaires standard sont enregistrés en utilisant le fichier 'wp-comments-post.php'.

En bloquant ces 2 fichiers, vous bloquez le flux standard pour les commentaires, la connexion, l'enregistrement et la récupération du mot de passe.

Très tôt dans son démarrage, WordPress enregistre une variable globale $pagenow contenant le nom du fichier en cours de chargement. Vous pouvez utiliser cette variable pour bloquer le flux.

Bloquer des commentaires sera très simple, car vous voulez le bloquer pour tous.

Commençons par écrire une fonction qui termine la demande, envoyons un en-tête http 403 et transmettons un message. Cela peut être fait en utilisant 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() est une fonction qui renvoie la méthode actuelle utilisée:

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

Cette fonction empêche les comportements inattendus si les méthodes ne sont pas POST ou GET.

À ce stade, nous pouvons utiliser la variable $pagenow pour mettre fin à la demande s'il s'agit de 'wp-comments-post.php' et exécuter une fonction s'il s'agit de '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' );
  }
});

Donc, le flux de commentaires standard est bloqué, nous devons écrire la fonction restrict_standard_login_flow().

Je pense qu'un moyen simple d'implémenter la protection par mot de passe est de permettre l'insertion du mot de passe en tant que variable url. Dans ce cas, nous devons nous assurer qu'un mot de passe dans l'URL est également inclus dans le formulaire de connexion, afin de le transmettre lors de sa soumission.

Nous pouvons le faire en utilisant les crochets d'action 'login_form':

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

Nous examinons donc url et si la variable url 'mypwd' le place dans md5-ed dans un champ masqué, le long d’un autre champ masqué nonce.

Le mot de passe que vous allez mettre dans l'URL, doit être comparé à quelque chose ... un moyen simple est d'utiliser une constante:

Ouvrez votre wp-config.php et juste avant

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

mettre

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

Bien sûr, remplacez 'votre-mot-de-passe-ici' par votre vrai mot de passe.

Maintenant, nous pouvons écrire la fonction restrict_standard_login_flow() qui compare le mot de passe dans l'URL à la constante et vérifie également le nonce si la méthode http actuelle est POST:

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

S'il vous plaît voir les commentaires en ligne pour plus de détails.

Maintenant, pour utiliser le flux de connexion standard, vous devez utiliser une URL comme

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

Si vous ne définissez pas le mot de passe, la demande sera refusée.

Veuillez noter que le code n'autorise que les formulaires de connexion , les formulaires de mot de passe perdu/réinitialisé ne sont pas autorisés. Vous devez donc étendre le code pour les autoriser ou utiliser votre flux personnalisé pour ces tâches.

Comme alternative, ne jamais oublier le mot de passe;)

Le formulaire Registeri est également interdit, car vous souhaitez uniquement , vous pouvez utiliser le flux standard et vous êtes déjà enregistré.

1
gmazzap

1) Configuration-> Général pour supprimer Tout le monde peut enregistrer une option cochée

2) Configuration-> discussion check Les utilisateurs doivent être enregistrés et connectés pour pouvoir commenter

Si deux conditions, toute personne ne s’inscrire pas et ne pas commenter votre post.

Il suffit d’ajouter du code dans function.php et votre tableau de bord d’administrateur n’accède qu’à admin.

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