出于安全原因,我试图通过重写链接来限制我的wordpress网站管理员和登录面板访问非管理员用户,这样如果用户输入http://www.mysite.com/wp-login.php或http://www.mysite.com/wp-admin,他会被重定向到错误404页面,但如果他键入http://www.mysite.com/blah-login或http://www.mysite.com/blah-admin被重定向到我的WP管理员或登录面板。我有以下选项可以做到这一点。
使用$ wp_rewrite类,我写了一个小插件,其代码如下。
register_activation_hook( __FILE__, 'activate' );
function activate() {
rewrite();
flush_rewrite_rules();
}
register_deactivation_hook( __FILE__, 'deactivate' );
function deactivate() {
flush_rewrite_rules();
}
add_action( 'init', 'rewrite' );
function rewrite() {
add_rewrite_rule( 'blah-admin/?$', 'wp-admin', 'top' );
add_rewrite_rule( 'blah-login/?$', 'wp-login.php', 'top' );
add_rewrite_rule( 'blah-register/?$', 'wp-register.php', 'top' );
}
它完美地工作只是问题是它不限制对wp-admin,wp-login.php或wp-registe.php(必须)的访问。
我可以将以下规则写入新的.htaccess文件。
AuthUserFile /dev/null
AuthGroupFile /dev/null
AuthName "Wordpress Admin Access Control"
AuthType Basic
<LIMIT GET>
order deny,allow
deny from all
allow from xxx.xxx.xxx.xxx
</LIMIT>
并将其放在wp-admin文件夹下,它有两个缺点,一个是它只会限制访问我的wp-admin文件夹而不是wp-register.php或wp-login.php,其次是我是DHCP客户端所以allow from xxx.xxx.xxx.xxx
对我不起作用。
我可以使用第二和第三个组合规则,但它绝对不会起作用,因为我无法为整个被阻止的文件夹提供替代永久链接。
至于最后的手段,我可以使用wp-modal插件的固定链接重写功能,它就像一个魅力,但这个插件与我的主题不兼容。
那么我的问题真的有解决方案吗?
答案 0 :(得分:3)
如果他们尚未登录,我会使用此代码段将人员从后端重定向。您可以修改它以指向您的404:
// BLOCK BACKEND ACCESS FOR NON-ADMINS
add_action( 'init', 'blockusers_init' );
function blockusers_init() {
// If accessing the admin panel and not an admin
if ( is_admin() && !current_user_can('level_10') ) {
// Redirect to the homepage
wp_redirect( home_url() );
exit;
}
}
只需将home_url()
功能中的网址更改为wp_redirect
下的404页面。
答案 1 :(得分:0)
我认为你试图保护自己免受暴力攻击?为什么不限制允许登录尝试的频率?有一个非常可靠的插件称为“限制登录尝试”,它将跟踪每个IP和cookie的使用。
请在此处查看:http://wordpress.org/plugins/limit-login-attempts/
但是,尝试屏蔽登录页面是一个有趣的想法。您可以在某处创建自己的登录页面,并使其与您编写的自定义登录脚本进行交互。这将允许您301将登录页面重定向到404页面,而不会弄乱任何核心功能。
您可以使用https://yourwpsite.com/supersecretlogin
之类的表单,然后将POST
添加到使用wp_signon
方法的自定义处理程序中。这是一个如何在不使用wp-admin的情况下登录某人的示例:
$creds = array();
$creds['user_login'] = $_POST['user'];
$creds['user_password'] = $_POST['password'];
$creds['remember'] = true;
$user = wp_signon( $creds, false );
if ( is_wp_error($user) )
exit($user->get_error_message());
header('Location: https://yourwpsite.com/wp-admin');
http://codex.wordpress.org/Function_Reference/wp_signon
希望有所帮助!