所有标准登录/注册操作都是使用\'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 能够使用标准流,并且您已经注册。