wordpress comments – Cómo bloquear el acceso al flujo de inicio de sesión estándar y al flujo de comentarios

Pregunta:

He configurado flujos personalizados en mi blog de WordPress para iniciar sesión, registrarme y comentar. Me gustaría proteger con contraseña el flujo de inicio de sesión estándar para que solo yo pueda usarlo y bloquear el acceso por completo al flujo de comentarios estándar.

Mi instinto es usar .htaccess para proteger el acceso a wp-login.php y wp-signup.php . ¿Es esto suficiente o existen otros métodos para acceder a esta página? por ejemplo, index.php?action=login , etc.

Para comentarios, no estoy seguro. ¿Es mejor engancharse a la acción de comentario y finalizar el proceso? ¿O funcionará .htaccess para eso también?

Si .htaccess es una solución viable para uno o ambos escenarios, se agradecería mucho el código de ejemplo, ya que soy un novato aquí.

Editar: estoy usando las siguientes funciones de WP en mis flujos, por lo que deben poder ejecutarse:

  • wp_set_auth_cookie
  • wp_create_user
  • wp_signon
  • wp_insert_comment

Respuesta:

Todas las acciones estándar de inicio de sesión / registro se realizan mediante 'wp-login.php' archivo 'wp-login.php' .

Los comentarios estándar se guardan usando 'wp-comments-post.php' archivo 'wp-comments-post.php' .

Al bloquear estos 2 archivos, bloquea el flujo estándar para comentarios, inicio de sesión, registro y recuperación de contraseña.

Muy temprano en su arranque de WordPress, guarde una variable global $pagenow que contiene el nombre del archivo que se está cargando. Puede usar esa variable para bloquear el flujo.

Bloquear comentarios será muy sencillo, porque querrás bloquearlo para todos.

Primero, escriba una función que finalice la solicitud, envíe un encabezado http 403 y envíe un mensaje. Eso se puede hacer usando 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() es una función que devuelve el método actual utilizado:

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

Esta función evita comportamientos inesperados si los métodos no son POST o GET.

En este punto, podemos usar la variable $pagenow para finalizar la solicitud si es 'wp-comments-post.php' y ejecutar una función si es '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' );
  }
});

Entonces, el flujo de comentarios estándar está bloqueado, tenemos que escribir la función restrict_standard_login_flow() .

Creo que una forma fácil de implementar la protección por contraseña es permitir insertar la contraseña como variable de URL. En ese caso, tenemos que asegurarnos de que también se incluya una contraseña en la URL en el formulario de inicio de sesión, para pasarla cuando se envíe.

Podemos hacer esto usando 'login_form' ganchos de acción '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' );
    }
  }
}

Así que miramos url y si la variable url 'mypwd' pone md5-ed en un campo oculto, junto a otro campo nonce oculto.

La contraseña que pondrás en la url, debe ser comparada con algo … una forma sencilla es usar una constante:

Abra su wp-config.php y justo antes

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

poner

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

Por supuesto, reemplace 'su-contraseña-aquí' con su contraseña real.

Ahora podemos escribir la función restrict_standard_login_flow() que compara la contraseña en la url con la constante y también verifica el nonce si el método http actual es 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 );
    }
  }
}

Consulte los comentarios en línea para obtener detalles adicionales.

Ahora, para usar el flujo de inicio de sesión estándar, debe usar una URL como

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

Si no establece la contraseña, se rechazará la solicitud.

Tenga en cuenta que el código aquí solo permite el formulario de inicio de sesión , los formularios de contraseña perdida / restablecida no están permitidos, por lo tanto, o extiende el código para permitirlos o usa su flujo personalizado para esas tareas.

Como alternativa, nunca olvide la contraseña;)

Tampoco se permite forma Darse de alta, ya que sólo desea que usted es capaz de utilizar el flujo estándar, y que ya están registrados.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım