web-dev-qa-db-ja.com

標準ログインフローとコメントフローへのアクセスをブロックする方法

Wordpressのブログで、ログイン、サインアップ、およびコメントのためのカスタムフローを設定しました。私が使用できるように標準のログインフローをパスワードで保護し、標準のコメントフローへのアクセスを完全にブロックします。

私の本能は、.htaccesswp-login.phpへのアクセスを保護するためにwp-signup.phpを使うことです。これで十分ですか、それともこのページにアクセスする他の方法はありますか?例えばindex.php?action=loginなど.

コメントについては、よくわかりません。コメントアクションにフックしてプロセスを強制終了するのが最善ですか?それとも.htaccessもそのために動くのでしょうか?

.htaccessがこれらのシナリオの一方または両方の実行可能な解決策であるならば、私はここで初心者であるので、例のコードは非常に高く評価されるでしょう。

編集:私は自分のフローで以下のWP関数を使っているので、これらは実行できるはずです:

  • wp_set_auth_cookie
  • wp_create_user
  • wp_signon
  • wp_insert_comment
3

これは純粋な.htaccessソリューションです。純粋なWordPress関数を使ったソリューションについては、 Gを参照してください。 M.の答えは下記 です。

G. M.が彼らの答えで指摘したように、

標準的なログイン/登録操作はすべて '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ステートメントで上書きするように指示します。もっと詳しく知りたい場合は、 を参照してください。

ユーザがwp-comments-post.phpにアクセスしようとすると、ブラウザのデフォルトの403エラーページが表示されます。

ログイン/登録

標準ログインフローへのアクセスを1人以上のユーザーに制限するために、.htpasswd基本認証を使用します。

this のようなWebサイトを使用して資格情報を生成することから始めます。出力はmyusername:$apr1$Qp4aF23x$mK3KLb17lL2vbJmtWUmQ5.のようになります(パスワードはそのようにエンコードされたように見えますが、ログインに指定したプレーンテキストのパスワードを使用します)。この出力をWordPressルートディレクトリの.htpasswdというファイルに保存します。 .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-login.phpにアクセスしようとすると、ブラウザはすべてのユーザーにユーザー名とパスワードの入力を求めます。

複数の環境で開発している人への注意:あなたのインストールへのサーバパスがローカルとプロダクションの間で変わるなら(例えば/ var/wwwと/ app/public)あなたがする必要があるでしょうAuthUserFileが各環境で正しいファイルを指していることを確認してください。これを実現する1つの方法は、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

0

標準のログイン/登録操作はすべて'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されているかどうか、別の隠された一回だけのフィールドに沿って。

あなたがURLに入れるパスワードは何かと比較されなければなりません...簡単な方法は定数を使うことです:

あなたのwp-config.phpを開く直前に

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

プット

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

もちろん、'your-password-here'を実際のパスワードに置き換えてください。

これで、URL内のパスワードと定数を比較し、現在のhttpメソッドがPOSTの場合はナンスをチェックするrestrict_standard_login_flow()関数を書くことができます。

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 formのみを許可し、パスワードの紛失/リセットは許可されていないため、それらを許可するようにコードを拡張するか、これらのタスクにカスタムフローを使用します。

別の方法として、パスワードを忘れないでください。

あなたはあなただけが標準フローを使用できることを望んでいて、あなたはすでに登録されているのでRegisteriフォームも許可されません。

1
gmazzap

1)設定 - >一般を削除するには誰でもオプションチェックマークを登録できます

2)設定 - >ディスカッションチェックコメントするには、ユーザ登録が必要です。

2つの条件のいずれかが登録していないし、あなたの投稿にコメントしていない場合。

Function.phpにコードを追加するだけで、管理ダッシュボードから管理者のみにアクセスできます。

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