如何阻止对标准登录流和评论流的访问

时间:2014-04-22 作者:moon prism power

我已经在我的Wordpress博客上设置了用于登录、注册和评论的自定义流。我想对标准登录流进行密码保护,这样只有我才能使用它,并完全阻止对标准注释流的访问。

我的本能是.htaccess pw保护访问wp-login.phpwp-signup.php. 这是否足够,或者是否有其他访问此页面的方法?e、 g。index.php?action=login, 等

至于评论,我不确定。最好是挂接到注释操作并终止该过程吗?或者会.htaccess 也为这个工作?

如果.htaccess 对于这些场景中的一个或两个都是可行的解决方案,示例代码将非常感谢,因为我是这里的新手。

Edit: 我在流中使用以下WP函数,因此这些函数必须能够运行:

wp\\u set\\u auth\\u cookie创建用户wp\\u登录wp\\u插入注释

3 个回复
最合适的回答,由SO网友:moon prism power 整理而成

This is a pure .htaccess solution. 有关使用纯WordPress函数的解决方案,请参阅G. M.\'s answer below.

正如通用在回答中指出的那样,

所有标准登录/注册操作都使用“wp login”完成。php文件。使用“wp comments post”保存标准注释。php文件。

因此,我们可以使用htaccess来处理对这些文件的请求,从而有效地管理注释和登录/注册流。

注释

因此,如果我们想阻止对标准注释流的访问,我们需要阻止对wp-comments-post.php. 我们可以这样做。htaccess:

<Files "wp-comments-post.php">
  Order Allow,Deny
  Deny from all
</Files>
Deny from all 阻止任何人访问。Order Allow,Deny 告诉apache覆盖任何默认值Allow 对此的声明Deny 陈述如果你想了解更多,看看here.

现在,如果用户尝试访问wp-comments-post.php, 将显示其浏览器的默认403错误页面。

登录/注册要限制一个或多个用户访问标准登录流,我们将使用.htpasswd 基本身份验证。

首先使用以下网站生成凭据this. 您的输出将如下所示myusername:$apr1$Qp4aF23x$mK3KLb17lL2vbJmtWUmQ5. (密码看起来是这样编码的,但您仍将使用为登录提供的纯文本密码。)将此输出保存到名为.htpasswd 在WordPress根目录中(应与.htaccess 文件。)

现在,将以下内容添加到.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>
现在,当所有用户尝试访问wp登录时,浏览器将提示他们输入用户名和密码。php。

Note for those developing in multiple environments: 如果安装的服务器路径在本地和生产(例如/var/www和/app/public)之间发生更改,您需要确保AuthUserFile 指向每个环境中的正确文件。实现这一点的一种方法是通过删除AuthUserFile行并添加以下内容来调整上述代码:

<IfDefine localdev>
  AuthUserFile /var/www/absolute/path/to/.htpasswd
</IfDefine>
<IfDefine !localdev>
  AuthUserFile /app/public/absolute/path/to/.htpasswd
</IfDefine>
此代码查找名为localdev - 有条件地设置AuthUserFile的位置,无论它是否找到它。当您在本地服务器上启动apache时,您必须定义localdev。apachectl -k start -Dlocaldev

SO网友:gmazzap

所有标准登录/注册操作都是使用\'wp-login.php\' 文件

标准注释保存为\'wp-comments-post.php\' 文件

阻止这2个文件会阻止评论、登录、注册和密码恢复的标准流。

WordPress在其引导过程中很早就保存了一个全局变量$pagenow 包含正在加载的文件的名称。可以使用该变量阻止流。

阻止注释将非常简单,因为您希望完全阻止它。

首先,让我们编写一个函数来结束请求,发送http头403并输出消息。可以使用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() 返回当前使用的方法的函数:

function restrict_used_method() {
  $method = filter_input( INPUT_SERVER, \'REQUEST_METHOD\', FILTER_SANITIZE_STRING );
  return strtoupper( $method ) === \'GET\' ? \'GET\' : \'POST\';
}
如果方法不是POST或GET,此函数可防止意外行为。

此时,我们可以使用$pagenow 变量以结束请求\'wp-comments-post.php\' 并运行一个函数\'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\' );
  }
});
所以标准的评论流被阻塞了,我们必须写restrict_standard_login_flow() 作用

我认为实现密码保护的一个简单方法是允许将密码作为url变量插入。在这种情况下,我们必须确保url中的密码也包含在登录表单中,以便在提交时传递它。

我们可以使用\'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\' );
    }
  }
}
我们看一下url,如果url变量\'mypwd\' 将其md5 ed放在一个隐藏字段中,沿着另一个隐藏的nonce字段。

您将在url中输入的密码必须与以下内容进行比较。。。一种简单的方法是使用常量:

打开您的wp-config.php 就在之前

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

define( \'MY_SECRET\', \'your-password-here\' );
当然,用您的真实密码替换“your-password-here”。

现在我们可以编写restrict_standard_login_flow() 函数,用于将url中的密码与常量进行比较,并在当前http方法为POST时检查nonce:

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 );
    }
  }
}
有关其他详细信息,请参阅内联注释。

现在,要使用标准登录流,您必须使用url,如

http://www.example.com/wp-login.php?mypwd=your-password-here
如果不设置密码,请求将被拒绝。

请注意,此处的代码仅允许login 表单、丢失/重置密码表单是不允许的,因此,您可以扩展代码以允许它们,或者使用自定义流执行这些任务。

或者,永远不要忘记密码;)

也不允许使用Registeri表单,因为您只需要you 能够使用标准流,并且您已经注册。

SO网友:Ravi Patel

1) 设置->常规以删除任何人都可以注册选项复选标记

2) 设置->讨论检查用户必须注册并登录才能发表评论

如果有两个条件,任何人都不能注册,也不能对你的帖子发表评论。

只需在函数中添加代码。php和您的管理仪表板只能访问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\');

结束

相关推荐

How to override wp-login.php

我想覆盖默认WordPress登录页:wp-login.php.原因是,我想在文件的顶部编写一些自定义代码,检查后端的一些条件,并执行诸如将用户重定向到其他页面之类的操作。我想这样做是因为我想在自定义文件中执行自己的身份验证逻辑,而不显示默认的WordPress登录表单。我的逻辑包括解析一些cookie和会话数据(特别是没有登录表单,可能是自定义表单)。我真的想把我的逻辑写在header.php 子主题的文件,但不幸的是wp-login.php 文件不包括主题的头文件。我不想编辑wp-login.php