我已将WordPress升级到4.7.1
, 之后,我尝试通过REST API枚举用户,这应该是固定的,但我能够检索用户。
https://mywebsite.com/wp-json/wp/v2/users
输出:
[{"id":1,"name":"admin","url":"","description":"","link":"https:\\/\\/mywebsite\\/author\\/admin\\/","slug":"admin","avatar_urls":{"24": ...
最新版本的变更日志:
REST API为所有编写过公共帖子类型帖子的用户公开了用户数据。WordPress 4.7.1将此限制为仅限于指定应在REST API中显示的post类型。Krogsgard和Chris Jean报道。
安装插件后Disable REST API
, 看起来一切都很好,但我不喜欢把插件用在每一件小事上。
使用插件后的输出为:
{"code":"rest_cannot_access","message":"Only authenticated users can access the REST API.","data":{"status":401}}
我如何在不使用插件的情况下修复此问题,或者为什么即使在升级此stil后仍然存在?
EDIT 30.9.2017
我意识到
contact 7
插件和
Disable REST API
这会给你
401 unauthorized
错误
当您尝试通过contact 7
窗体,它将发出请求
wp-json/contact-form-7/v1/contact-forms/258/feedback
禁用这不是一个好主意。
最合适的回答,由SO网友:BlueSuiter 整理而成
此代码段将隐藏用户、帖子和注释端点结果,并给出404作为结果,而其余API调用将保持原样运行。
::UPDATE::
add_filter(\'rest_endpoints\', function(){
$toRemove = [\'users\', \'posts\', \'comments\'];
foreach($toRemove as $val)
{
if (isset($endpoints[\'/wp/v2/\'.$val])) {
unset($endpoints[\'/wp/v2/\'.$val]);
}
if(isset($endpoints[\'/wp/v2/\'.$val.\'/(?P<id>[\\d]+)\'])) {
unset($endpoints[\'/wp/v2/\'.$val.\'/(?P<id>[\\d]+)\']);
}
}
return $endpoints;
});
::UPDATE::
此代码段将删除所有默认端点。
<?php remove_action(\'rest_api_init\', \'create_initial_rest_routes\', 99); ?>
SO网友:lowtechsun
如果愿意,请从HTML头部删除API链接。
// https://wordpress.stackexchange.com/a/211469/77054
// https://wordpress.stackexchange.com/a/212472
remove_action( \'wp_head\', \'rest_output_link_wp_head\', 10 );
然后要求对所有请求进行身份验证。
// You can require authentication for all REST API requests by adding an is_user_logged_in check to the rest_authentication_errors filter.
add_filter( \'rest_authentication_errors\', function( $result ) {
if ( ! empty( $result ) ) {
return $result;
}
if ( ! is_user_logged_in() ) {
return new WP_Error( \'rest_not_logged_in\', \'Only authenticated users can access the REST API.\', array( \'status\' => 401 ) );
}
return $result;
});
这将给您留下所需的消息。
现在,要停止枚举,可以使用类似的方法。
// https://perishablepress.com/stop-user-enumeration-wordpress/
// block WP enum scans
// https://m0n.co/enum
if (!is_admin()) {
// default URL format
if (preg_match(\'/author=([0-9]*)/i\', $_SERVER[\'QUERY_STRING\'])) die();
add_filter(\'redirect_canonical\', \'shapeSpace_check_enum\', 10, 2);
}
function shapeSpace_check_enum($redirect, $request) {
// permalink URL format
if (preg_match(\'/\\?author=([0-9]*)(\\/*)/i\', $request)) die();
else return $redirect;
}
查看整个帖子,了解更多技巧。
SO网友:Afterglow
为了完成2017年BlueSuiter的回答,这里有一个按角色筛选用户的解决方案,使其解决方案与Gutenberg编辑器兼容。
add_filter( \'rest_endpoints\', function( $endpoints ) {
if(is_user_logged_in()) {
$user = wp_get_current_user();
$roles = array(\'editor\', \'administrator\', \'author\');
if( array_intersect($roles, $user->roles ) ) return $endpoints;
}
if ( isset( $endpoints[\'/wp/v2/users\'] ) ) unset( $endpoints[\'/wp/v2/users\'] );
if ( isset( $endpoints[\'/wp/v2/users/(?P<id>[\\d]+)\'] ) ) unset( $endpoints[\'/wp/v2/users/(?P<id>[\\d]+)\'] );
return $endpoints;
});
Gutenberg编辑器需要查询REST API以获取作者。因此,有必要让您的站点中至少所有有权访问古腾堡编辑器的用户角色通过,不要忘记自定义帖子。
在公共REST API端点上,返回404错误,因为is\\u user\\u logged\\u总是返回false。