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

3

He configurado flujos personalizados en mi blog de Wordpress para iniciar sesión, registrarse y hacer comentarios. Me gustaría proteger con contraseña el flujo de inicio de sesión estándar para que solo pueda usarlo, y bloquear el acceso completamente al flujo de comentarios estándar.

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

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

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

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

  • wp_set_auth_cookie
  • wp_create_user
  • wp_signon
  • wp_insert_comment
pregunta moon prism power 22.04.2014 - 17:55

3 respuestas

0

Esta es una solución .htaccess pura. Para obtener una solución que utilice únicamente funciones de WordPress, consulte G. La respuesta de M. a continuación .

Como G. M. señaló en su respuesta,

  

Todas las acciones estándar de inicio de sesión / registro se realizan usando 'wp-login.php'   expediente. Los comentarios estándar se guardan usando 'wp-comments-post.php'   archivo.

Por lo tanto, podemos administrar de manera efectiva los comentarios y flujos de inicio de sesión / registro usando htaccess para manejar las solicitudes de estos archivos.

Comentarios

Por lo tanto, si queremos bloquear el acceso al flujo de comentarios estándar, debemos bloquear el acceso a wp-comments-post.php . Aquí es cómo podemos hacer eso con .htaccess:

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

Deny from all bloquea el acceso de cualquier persona. Order Allow,Deny le dice a apache que anule cualquier declaración Allow predeterminada con esta declaración Deny . Si desea leer más sobre eso, consulte aquí.

Ahora, si un usuario intenta visitar wp-comments-post.php , se mostrará la página de error 403 predeterminada de su navegador.

Inicio de sesión / Registro

Para restringir el acceso al flujo de inicio de sesión estándar a uno o más usuarios, usaremos la autenticación básica .htpasswd .

Comience generando credenciales utilizando un sitio web como esto . Su salida tendrá un aspecto similar a myusername:$apr1$Qp4aF23x$mK3KLb17lL2vbJmtWUmQ5. (la contraseña se verá así codificada, pero seguirá usando la contraseña de texto simple que proporcionó para iniciar sesión). Guarde esta salida en un archivo llamado .htpasswd en su directorio raíz de WordPress (debería será el mismo directorio que su archivo .htaccess .)

Ahora, agregue lo siguiente a su archivo .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>

Su navegador ahora solicitará a todos los usuarios un nombre de usuario y una contraseña cuando intenten visitar wp-login.php.

Nota para aquellos que se están desarrollando en múltiples entornos: si la ruta del servidor a su instalación cambia entre local y producción (por ejemplo, / var / www y / app / public), deberá asegurarse AuthUserFile apunta al archivo correcto en cada entorno. Una forma de lograr esto es ajustar el código anterior eliminando la línea AuthUserFile y agregando esto:

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

Este código busca una variable de entorno llamada localdev - configurando condicionalmente la ubicación de AuthUserFile si lo encuentra o no. Tendrá que definir localdev cuando inicie apache en su servidor local, por ejemplo. apachectl -k start -Dlocaldev

    
respondido por el moon prism power 28.04.2014 - 21:08
1

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

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

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

Muy pronto en su arranque, WordPress guarda una variable global $pagenow que contiene el nombre del archivo que se está cargando. Puedes usar esa variable para bloquear el flujo.

El bloqueo de comentarios será muy sencillo, ya que quieres bloquearlo para todos.

Primero, escribamos una función que finalice la solicitud, enviemos un encabezado HTTP 403 y enviemos un mensaje. Esto 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 el comportamiento inesperado 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' );
  }
});

Así que 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 con contraseña es permitir la inserción de la contraseña como variable url. En ese caso, debemos 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' action hooks:

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

Por lo tanto, observamos la url y si la variable url 'mypwd' la coloca md5-ed en un campo oculto, a lo largo de otro campo nonce oculto.

La contraseña que pondrás en la url, debe compararse con algo ... una forma simple es usar una constante:

Abre tu wp-config.php y justo antes

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

poner

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

Por supuesto, reemplaza 'tu-contraseña-aquí' con tu 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, tiene que usar una URL como

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

Si no establece la contraseña, la solicitud será rechazada.

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

Como alternativa, nunca olvides la contraseña;)

El formulario de registro tampoco está permitido, ya que solo quiere que usted pueda utilizar el flujo estándar y ya está ya registrado.

    
respondido por el gmazzap 25.04.2014 - 00:33
0
  

1) Configuración- > general para eliminar Cualquiera puede registrar la marca de verificación de opción

     

2) Configuración- > verificación de discusión Los usuarios deben registrarse e iniciar sesión en   comentario

Si dos condiciones, cualquier persona no se registra y no comenta en tu publicación.

Solo agregue el código en function.php y solo el acceso al panel de administración 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');
    
respondido por el ravi patel 25.04.2014 - 09:00

Lea otras preguntas en las etiquetas